NGMsoftware

NGMsoftware
로그인 회원가입
  • 매뉴얼
  • 팁 앤 테크
  • 매뉴얼

    팁과 테크니컬 노하우를 확인하세요.

    팁 앤 테크

    팁과 테크니컬 노하우를 확인하세요.

    본 사이트의 컨텐츠는 저작권법의 보호를 받으므로 무단 복사, 게재, 배포 등을 금합니다.

    기타 2부 - 욜로 딥러닝으로 이미지를 학습해서 사용하는 방법. (How to learn and use images with YOL…

    페이지 정보

    본문

    안녕하세요. 엔지엠소프트웨어입니다. 이 글이 욜로를 이용한 딥러닝의 마지막이 될듯합니다. 추가로, 뭔가 더 진행할 내용이 있을지는 모르겠으나~ 아무튼 마지막 글이 될거 같네요. 이전 글들을 통해서 Darknet의 YOLO와 yolo mark를 컴파일 하고 환경을 구성했습니다. 그리고, 학습시킬 데이타셋을 만들어봤죠? 마지막으로 데이타셋으로 학습을 돌리고 나온 모델로 테스트를 해보면 원하는(?)데로 학습시키고, 이미지를 감지할 수 있는 시스템을 가지게 될겁니다^^

    ※ 이 글은 메뉴얼 > 학습 > 딥러닝에서 자세하게 확인할 수 있습니다.

    ※ 컴파일된 다크넷 파일들은 용량이 200MB가 넘습니다. 직접 컴파일하시거나 후원해주시면 만들어진 파일을 보내드립니다.

     

    트레이닝을 위한 선행 학습

    이전 글에서 yolo mark를 사용해서 데이타셋을 만들었습니다. 트레이닝 관련 내용도 같이 다루었어야 했는데요. 아무래도 데이타셋을 만드는 방법에만 집중하다보니 그냥 건너뛰게 되었습니다. 여기서 몇가지 설명하고, 옵션들을 수정하고 넘어가야 합니다.

     

    yolo-obj.cfg (학습에 필요한 속성 콘피그 파일)

    이 파일은 데이타셋을 학습할 때 필요한 여러가지 속성들을 설정할 수 있습니다. 좋은 품질의 학습 데이타를 얻으려면 몇가지 수정해야 합니다.

    • batch: 기본 값은 64로 특별히 변경하지 않아도 됩니다. 이 값은 한 사이클에 몇장을 처리할지 정하는 값입니다.
    • subdivisions: batch를 이 값만큼 나누어서 처리합니다. 기본값은 8이지만 Out of memory 에러가 날 경우 16 또는 32, 64로 조절하여 시도해야 합니다. 이미지가 커질수록 이 값도 높게 설정해야 합니다. FHD 크기의 이미지인 경우 64를 입력하면 무리없이 학습이 실행됩니다. HD인 경우 16 또는 32로 학습시킵니다.
    • height, width: 입력되는 이미지의 크기입니다. 이미지의 크기가 클수록 정확도가 높아지지만 성능은 하락합니다.
    • angle: HARR 또는 Tensorflow Inception과 동일하게 입력되는 데이터로부터 다양한 학습을 위한 설정값입니다. 보통은 0으로 두지만, 기울기에 따라 15~90도까지 가능합니다.
    • saturation: 이미지의 채도를 조절할 때 설정하는 값입니다.
    • exposure: 이미지의 노출을 조절할 때 설정하는 값입니다.
    • hue: 이미지의 색조를 조절할 때 사용하는 값입니다.
    • learning_rate: 기본 값은 0.001입니다. multi-gpu 사용시 0.001 / gpu수만큼 조절해서 사용할 수 있습니다.
    • burn_in: 기본 값은 1000입니다. multi-gpu 사용시 Iteration이 지날 때 마다 학습률을 조정할 것인지 설정합니다. gpu 수 * 1000으로 설정합니다.
    • max_batches: Iteration(반복) 횟수를 설정할 수 있습니다. 일반적으로 Class 수 * 2,000입니다. 더 복잡한 작업이라면 3,000 또는 4,000을 곱합니다. 추가로 200을 더해줍니다. 클래스가 3이라면 3*2,000+200=6,200입니다. 200은 전후로 알맞은 가중치를 얻기 위한 값입니다.
    • steps: 100, 500, 1000과 같이 입력합니다. 500, 1000을 입력해도 됩니다. 입력한 스텝까지 배치 후 학습 속도를 조정합니다.
    • scales: 0.1, 0.2, 0.3과 같이 입력합니다. 이 값은 steps에 입력한 값에 대응합니다. steps 100 후에 LR에 0.1을 곱한 다음 500 후에 다시 0.2를 곱합니다. 1000에서 0.3을 곱합니다.

     

    이외에도 학습과 관련된 옵션들이 많습니다. 다른 옵션들은 특별하게 조정할 필요가 없거나 기본 값을 사용하여 학습하는걸 추천드립니다. 이 옵션들에 대해 더 자세히 알고 싶다면 아래 링크에서 도움을 받을 수 있습니다.

    https://pjreddie.com/darknet/yolo/

     

    공통적으로 수정해야 하는 부분은 2가지입니다.

    classes와 filters입니다. 메모장에서 Ctrl+F를 눌러서 classes와 filters를 모두 수정하세요.

    classes: 감지 또는 검출할 이미지의 수입니다. 이 예제에서는 air, bird, person으로 3개입니다.

    filters: 5*(클래스 수+5) 입니다. 이 예제에서는 40입니다. 

     

    obj.names 파일 설정

    클래스의 이름입니다. 이 예제에서는 air, bird, person 3개이며, 아래 그림과 같이 한줄에 하나씩 입력해야 합니다.

    oS18Vck.png

     

     

    obj.data 파일 설정

    아래 이미지를 보면 크게 어려운 부분은 없습니다. train과 valid가 동일하게 설정되어 있는데요. 이 부분을 분리하여 처리가 가능합니다. valid image(유효한 이미지)를 별도로 목록화하여 valid = data/valid.txt로 만든 후 수정하여 사용하면 됩니다. 그리고, 마지막 backup은 학습을 반복하면서 weight가 저장되는 폴더 위치를 말합니다.

    Dd9brbJ.png

     

     

    트레이닝을 위해 이미지넷에서 프리트레이닝(미리 훈련된)된 컨볼루션 웨이트와 다크넷의 darknet53 모델의 가중치를 사용합니다. 아래 링크에서 컨볼루션 레이어의 가중치를 다운로드 할 수 있습니다.

    https://pjreddie.com/darknet/yolo/

    ※ 컨볼루션(합성곱): 트레이닝 함수를 반전시키고 이동시켜 값을 곱해 구간에 대해 적분하는 공식

    rrMdm5g.png

     

     

    대략 용량이 150메가쯤 합니다. 이 파일을 다운로드 받은 후 다크넷 프로젝트의 build/x64 폴더에 복사합니다.

    CgU81bj.png

     

     

    yolo mark 프로젝트의 data폴더안의 모든 파일을 다크넷의 data폴더에 복사합니다. 그리고, yolo mark의 yolo-obj.cfg파일은 data밖(x64)에 저장하세요.

    lcH2Iv4.png

     

     

    Windows Command를 관리자 권한으로 실행한 후 다크넷의 x64디렉토리로 이동합니다.

    3jSVPFE.png

     

     

    아래 명령으로 트레이닝을 실행시킵니다. -map 옵션은 평균 정밀도로, 모델이 이전에 본 적이 없는 데이터 세트 또는 검증 세트에서 잘 일반화되고 있는지 확인합니다. -gpu 옵션은 gpu가 1개라면 0이고 gpu가 2개라면 -gpu 0 1과 같이 설정하면 됩니다.

    darknet detector train data/obj.data data/yolo-obj.cfg darknet53.conv.74

    darknet detector train data/obj.data data/yolo-obj.cfg darknet53.conv.74 -map

    darknet detector train data/obj.data data/yolo-obj.cfg darknet53.conv.74 -map -gpu 0

    7J4OILT.png

     

     

    학습이 잘 되고 있는지를 판단하려면 아래와 같은 값들이 정상적으로 나오는지 확인해야 합니다.

    • Region Avg IOU: 오브젝트 검출의 정확도를 평가하는 지표로, Object Detection에서 개별 오브젝트에 대한 검출(Detection)이 성공했는지를 나타냅니다. 이 값은 0~1 사이의 값으로 1에 가까울수록 정확도가 좋다는 의미입니다.
    • Class: 1에 가까울수록 학습이 잘 되고 있다는 의미입니다.
    • Obj: 1에 가까울수록 학습이 잘 되고 있다는 의미입니다.
    • No Obj: 0에 가까울수록 학습이 잘 되고 있다는 의미입니다.
    • Avg Recall: 재현율로 검출해야 할 오브젝트가 10개인데 학습 모델이 검출한 오브젝트가 5개라면 5/10=0.5가 됩니다. 따라서 모델이 오브젝트를 모두 찾으면 1에 가까운 값이 나와야 학습이 잘 되고 판단할 수 있습니다.
    • Count: 포지티브 샘플(Positive Sample)들이 포함된 갯수입니다.

    4rinBa1.png

     

     

    학습이 완료되면 아래와 같이 backup 폴더에 가중치 파일이 생성된걸 확인할 수 있습니다.

    vVUXS8D.png

       

       

    Windows Command에서 아래 명령으로 간단하게 테스트 해볼 수 있습니다.

    darknet detector test data/obj.data yolo-obj.cfg backup/yolo-obj_2000.weights air.png

    wvh1nLu.png

     

     

    이미지 몇장으로 테스트한거라서 그런지... 정확도는 높지 않네요. 보통 최소 300에서 30,000장을 학습시켜야 괜찮은 결과를 얻을 수 있다고 합니다. 물론, 전처리도 중요하죠. 생각해보면 수백에서 수만장의 사진을 수작업으로 train과 valid 이미지를 만든다는건~ 많은 노력과 시간이 들어가는 작업인걸 알 수 있습니다. 이 내용을 토대로 원하는 결과를 얻을 수 있었으면 좋겠네요.

     

    DdDN5ib.jpg

     

     

    위 그림에서 알 수 있듯이 저와 같은 개발자는 갑을병정무己에 위치하고 있습니다. 노력에 비해 정당한 대우를 받기 어려운 환경이지만, 그래도 기술직이다보니 스스로 창작 활동하기엔 좋은 직업이기도 합니다. 참고로 현업에서 불량을 제거하기 위한 활동으로 Vision Machine Learing을 이용합니다. 생산 라인의 주요 공정마다 카메라가 일렬로 스트리밍하고 이 영상은 리얼타임으로 분석됩니다. 만약, valid하지 않은 경우 해당 이미지는 캡쳐되고 서버에 별도로 저장됩니다. 일부 환경에서는 사용자가 직접 개입해서 한번 더 Negative를 Filtering합니다.

    4ri8RnB.jpg

     

     

    저장된 이미지는 재학습을 거쳐 좀 더 좋은 품질의 가중치 모델을 만들게 됩니다. 제조 공정에서 APC(Advanced Process Control) / R2R(Run to Run)과 같은 플로우를 구성한다면 자가 학습이 가능한 비전 분석 시스템을 구축할 수 있습니다. 지금까지 HARR, Python Tensorflow, Darknet을 사용하면서 가장 쉽게 시스템을 구축하고 학습시킬 수 있는 솔루션은 Darknet이라는걸 알게되었습니다. 그리 어렵지 않으니 한번 도전해보시기 바랍니다.

    감사합니다.

    • 네이버 공유하기
    • 페이스북 공유하기
    • 트위터 공유하기
    • 카카오스토리 공유하기
    추천1 비추천0

    댓글목록

    profile_image

    엔지엠소프트웨어님의 댓글

    엔지엠소프트웨어 쪽지보내기 메일보내기 홈페이지 자기소개 아이디로 검색 전체게시물 작성일 Date

    png 이미지들을 전부 jpg로 변경하려면 아래 프로그램을 사용하세요.
    http://ngmsoftware.com/bbs/board.php?bo_table=free_board&wr_id=2710