Window - YOLO Maker를 이용한 Custom 학습 및 검출

2020. 7. 22. 22:03

☞    문서의 내용은 가장 하단 참고문헌 및 사이트를 참고하여 필자가 보기 쉽도록 정리한 내용입니다.

☞    틀린 내용 및 저작권 관련 문의가 있는 경우 문의하시면 수정 및 삭제 조치하겠습니다.


YOLO Maker를 위한 환경 구성하기

 

※ YOLO Maker를 이용한 custom 학습 및 검출은 Yolo 환경이 필요합니다. 환경 구축은 링크에서 확인 할 수 있습니다.


YOLO Mark 설치 및 실행

 

이미지에서 객체를 라벨링하기 위해서 Yolo Mark를 다운로드 합니다.

다운로드는 (https://github.com/AlexeyAB/Yolo_mark)에서 할 수 있습니다.

 

 

 

 

다운로드 받은 Yolo_maker -> yolo_mark.sln을 실행합니다.

 

 

 

빌드 환경을 Release/ x64로 변경합니다.

 

 

 

OpenCV 경로 설정을 위해서 프로젝트 속성으로 들어갑니다.

C/C++ -> General -> Additional Include Directories에서 경로를 수정해줍니다.

 

 

 

 

OpenCV 링크 설정을 위해서 프로젝트 속성으로 들어갑니다.

Linker -> General -> Additional Include Directories에서 링크 경로를 수정해줍니다.

 

 

 

 

모든 설정을 끝낸 후 빌드를 해줍니다.

 

 

 

 

OpenCV관련 dll(Opencv_world348.dll, opencv_ffmpeg348.dll)을 Yolo Mark-> x64 -> Release에 복사해줍니다.

※ opencv뒤에 붙은 숫자의 경우 본인 버전에 해당하는 숫자입니다. (ver 3.4.8 ->348)

 

 

 

빌드가 성공했다면  Yolo_mark -> x64 -> Release -> yolo_mark_cmd를 실행합니다.

 

 

 

아래 그림과 같이 Yolo mark가 동작하는 것을 볼 수 있습니다.

 

 

 


YOLO Mark를 이용한 Custom파일 만들기

 

Yolo mark가 정상적으로 동작하면 Release -> data에 들어갑니다.

 

 

 

img 폴더로 들어갑니다.

img 폴더에는 아래 사진과 같이 라벨링할 이미지와 라벨링 좌표가 들어있는 txt파일이 있습니다.

 

 

 

샘플로 저장된 jpg, txt를 전부 삭제합니다. 그리고 라벨링할 이미지들을 img 폴더에 넣어줍니다.

 

 

 

Release -> data에 돌아와 obj.names를 실행합니다.

 

 

 

obj.names는 classes의 이름을 정의하는 파일입니다.

obj.names에 기존에 작성된 air, bird를 지우고 cat, dog를 작성합니다.

(우리는 강아지와 고양이만 분류하기 때문에 cat, dog를 작성합니다. 만약 다른 추가적인 동물을 분류하려면 차례대로 작성해주시면 됩니다.) 

 

 

 

Yolo mark -> x64 -> Release 폴더로 돌아와 yolo_mark.cmd를 실행합니다.

 

 

 

다음과 같이 Yolo mark를 이용하여 모든 사진을 라벨링 해줍니다.

 

 

 

 

Yolo mark 단축키


[←] - prev_img :  이전 이미지로

[→] - next_img :  다음 이미지로

[ c ] - clear_marks : 모든 라벨링 삭제

[ 0_9 ] - obj_id : obj.names에 정의한 Object id 선택

[ m ] - show coords : 마우스 x,y좌표 보여지게 하기

[ esc ] - exit : 종료

[ w ] - line width : 라인 굵기

[ k ] - hide obj_name : 객체 이름 숨기기

[ o ] - track objects : 현재 라벨링을 다음 이미지에 복사

[ r ] - mouse delets selected : 현재 마우스 커서 라벨링 삭제


 

 

 

img 폴더에 txt 파일이 생기는지 확인 합니다.

txt 파일은 [class id][center x][center y][w][h]로 구성됩니다.

 

 

 


YOLO v3를 이용해서 학습하기

 

Release -> data에 돌아와 obj.data를 실행합니다.

 

 

 

obj.data는 학습을 위한 내용이 담겨 있는 파일입니다.

※ Classes는 분류할 개수만큼 적어주면 됩니다. (ex : 강아지와 고양이를 분류하고 싶으면 2로 적어주면 됩니다.)

※ Train은 학습을 위해 필요한 라벨링 이미지의 링크 정보가 정의된 파일의 링크를 적어준다.

※ valid는 학습 데이터 비교를 위해 필요한 라벨링 이미지의 링크 정보가 정의된 파일의 링크를 적어준다.

※ names는 calsses의 이름을 정의한 파일의 링크를 적어준다.

※ backup은 학습 진행 중, 학습 종료에 저장되는 weight 파일이 저장될 경로를 적어준다.

 

 

 

Release -> data에 돌아와 train.txt를 실행합니다.

 

 

 

train.txt는 라벨링을 위해 저장된 이미지 링크 정보가 정의된 파일입니다.

 

 

 

img폴더, obj.data, obj.names, train.txt파일을 darknet-mater > build > darknet > x64 > data에 복사합니다.

 

 

 

 

darknet-mater > build > darknet > x64에서 yolov3.cfg를 복사합니다. 그리고 testcfg라는 폴더를 만들어 그곳에 yolov3.cfg를 넣어줍니다. (testcfg폴더가 아닌 다른 폴더여도 상관없습니다.)

 

 

yolov3.cfg를 실행합니다.

※ cfg파일은 모델 구조와 train과 관련된 설정이 들어있는 파일이다.

 

 

 

학습을 위해 조절하는 값


  • batch
    • 기본 값은 64입니다.
    • 이 뜻은 한 training step에 64개의 이미지를 사용하겠다는 뜻입니다.
  • subdivisions
    • batch size 64를 얼마나 나누어 학습할 것인가의 설정 값입니다.
    • 기본 값은 8이지만 out of memory에러가 날 경우 12, 32 ,64로 조절하여 학습을 시도합니다.
  • width 및 height
    • 416, 608, 832로 변경하여 학습 할 수 있습니다.
    • 608, 832로 해상도가 높아질 수록 정확도가 좋아질 수 있습니다.
  • angle
    • 이미지 회전에 대한 설정 값입니다.
    • 다양한 각도에서 학습하고 싶은 경우 30~45정도로 설정합니다.
  • saturation
    • 이미지에 채도를 추가하고자 할 때 설정하는 값입니다.
  • exposure
    • 노출 값을 추가하고자 할 때 설정하는 값입니다.
  • hue
    • 색상을 변경하고자 할 때 설정하는 값입니다.
  • learning_rate
    • 보통 0.001
    • multi-gpu 사용시 학습률을 0.001/gpu 수 만큼 조절하기도 합니다.
  • burn_in
    • 보통 1000
    • multi-gpu 사용시 몇 만큼의 iteration이 지날 때 마다 학습률을 조정할 것인지에 대한 값입니다.
    • multi-gpu 사용시 1000 * gpu 수 만큼 조절합니다.
  • max_batches
    • 언제까지 iteration을 돌건지 설정하는 값입니다.
    • 보통 class 수 * 2000으로 설정합니다. (넉넉하게 3000~ 5000을 곱하는 경우도 있습니다.)
  • steps
    • max_batches 사이즈의 80% , 90%를 설정합니다.
  • classes
    • class의 수
  • filters
    • filter의 수
    • (4 + 1 + class 수) * 3

 

 

 

 

 

yolov3.cfg의 해당부분을 수정합니다. 

※ 학습을 위해서 수정하는 부분은 매우 다양하고 모두 다릅니다. 필자가 수정하는 값이 정답이 아닙니다.

[net]
# Testing
#batch=1
#subdivisions=1
# Training
batch=64
subdivisions=16
width=416
height=416
channels=3
momentum=0.9
decay=0.0005
angle=0
saturation = 1.5
exposure = 1.5
hue=.1

learning_rate=0.001
burn_in=1000
max_batches = 4200 (( class * 2000 + 200)으로 계산해서 4200으로 수정합니다.)
policy=steps
steps=3200, 3600 (max_batches 사이즈의 80%, 90%를 설정합니다.)
scales=.1,.1

...... ...... ...... ...... ...... ...... ...... ...... ...... ...... 

 

아래 부분은  ctrl + f를 이용하여 모두 찾아 수정해주세요.

 

[convolutional]
size=1
stride=1
pad=1
filters=21 ((4+1 + class) *3로 변경해줍니다.)
activation=linear


[yolo]
mask = 0,1,2
anchors = 10,13,  16,30,  33,23,  30,61,  62,45,  59,119,  116,90  (anchors변경은 아래에서 설명합니다.)
classes=2 (현재 글에서는 cat, dog 2개의 class를 가지고 있어 2로 설정합니다.)
num=9
jitter=.3
ignore_thresh = .7
truth_thresh = 1
random=1

 

...... ...... ...... ...... ...... ...... ...... ...... ...... ...... 

 

[convolutional]
size=1
stride=1
pad=1
filters=21 ((4+1 + class) *3로 변경해줍니다.)
activation=linear


[yolo]
mask = 3,4,5
anchors = 10,13,  16,30,  33,23,  30,61,  62,45,  59,119,  116,90  (anchors변경은 아래에서 설명합니다.)
classes=2 (현재 글에서는 cat, dog 2개의 class를 가지고 있어 2로 설정합니다.)
num=9
jitter=.3
ignore_thresh = .7
truth_thresh = 1
random=1

 

...... ...... ...... ...... ...... ...... ...... ...... ...... ...... 

 

[convolutional]
size=1
stride=1
pad=1
filters=21 ((4+1 + class) *3로 변경해줍니다.)
activation=linear


[yolo]
mask = 6,7,8
anchors = 10,13,  16,30,  33,23,  30,61,  62,45,  59,119,  116,90  (anchors변경은 아래에서 설명합니다.)
classes=(현재 글에서는 cat, dog 2개의 class를 가지고 있어 2로 설정합니다.)
num=9
jitter=.3
ignore_thresh = .7
truth_thresh = 1
random=1

 

 

 

 

anchors값을 구하기 위해서 darknet-mater > build > darknet > x64으로 이동합니다. 그리고 경로에 cmd를 입력하여 명령프롬프트를 실행합니다.

 

 

 

열린 명령프롬프트에 아래와 같이 anchors 계산 명령어를 입력합니다. 그리고 계산된 anchors를 .cfg파일에 적용해줍니다.

darknet.exe detector calc_anchors data/obj.data -num_of_clusters 9 -width 416 -height 416

 

 

 

훈련을 위해서는 Imagenet에서 사전 훈련 된 컨볼루션 weight를 사용해야합니다.

darknet53 모델의 가중치는 (pjreddie.com/media/files/darknet53.conv.74)에서 다운로드 할 수 있습니다.

 

 

 

학습을 위해서 darknet-mater > build > darknet > x64으로 이동합니다. 그리고 경로에 cmd를 입력하여 명령프롬프트를 실행합니다.

 

 

 

열린 명령프롬프트에 아래와 같이 학습 명령어를 입력합니다. 

학습 : darknet.exe detector train data\obj.data testcfg\yolov3.cfg data\darknet53.conv.74  -gpu 0

이어서 학습 하기 : darknet detector train data\obj.data testcfg\yolov3.cfg backup/______.weights -gpu 0

 

 

 

문제가 없다면 아래와 같이 학습하는 모습을 볼 수 있습니다.

 

 

 

loss값이 더 이상 감소하지 않거나 증가하는 과적합 현상을 보이거나 학습이 끝나면 darknet-mater > build > darknet > x64 > backup으로 이동하여 weights파일이 생겼는지 확인합니다.

※ 필자의 경우 1000 interation에서 중단했습니다. 

 

 

 

학습을 위해서 darknet-mater > build > darknet > x64으로 이동합니다. 그리고 경로에 cmd를 입력하여 명령프롬프트를 실행합니다.

사진: darknet.exe detector test data\obj.data testcfg\yolov3.cfg backup/yolov3_1000.weights -i 0 -thresh 0.3 test.jpg -ext_output

영상: darknet.exe detector demo data\obj.data testcfg\yolov3.cfg backup/yolov3_1000.weights -i 0 -thresh 0.3 -ext_output 01.mp4

 

 

 

문제가 없다면 아래와 같이 강아지와 고양이를 검출하는 것을 볼 수 있습니다.

※ 아래 사진의 경우 필자가 학습하여 검출한 이미지가 아닙니다. 예시를 위해 올려 놓은 이미지입니다.

 

 

 


참고자료

 

[Object Detection] darknet custom 학습하기

darknet 학습을 위해 이전에 처리해야할 과정들은 다음 포스팅을 참고 [Object Detection] darknet custom 학습 준비하기 https://eehoeskrap.tistory.com/367 [Object Detection] Darknet 학습 준비하기 환경 Ubu..

eehoeskrap.tistory.com

 

 

[YOLO - darknet] Window 10에서 YOLO_MARK로 YOLO 학습(Custom) - 19.8.26. 수정 완료

※ Windows 10 x64 환경을 사용하고 있습니다. ※ 본 포스팅은 아래 페이지를 참고하여 작성되었습니다.  1) 개발자 이상현님 블로그 : https://pgmrlsh.tistory.com/4?category=766787  2) 다크 프로그래머님..

reyrei.tistory.com

 

 

Yolo v3 커스텀 모델 학습

데이터 라벨링 학습을 하기 위해서는 라벨링 된 이미지들이 필요합니다. LabelImg : https://tzutalin.github.io/labelImg/ 위 링크에서 LabelImg 프로그램을 다운로드받습니다. 압축을 푼 후 windows_v1.8.0\da..

go-programming.tistory.com

 

 

Signal Processing Engineer's Blog: [Open Source] YOLO v3 윈도우 버전 설치 및 튜토리얼 한방에 정리

yolo v3 설치하는 방법과 간단한 튜토리얼을 제공합니다.

studyingcoder.blogspot.com

 

COMMENT

  • rek 2021.02.23 18:20 좋은 정보 공유 감사드립니다.
    공부 잘하고 갑니다.
  • Luke 2021.03.21 18:56 글 잘 봤습니다. 시작하는데 많은 도움이 됐습니다. 그런데, darknet train중에 응용 프로그램 오류가 뜨면 자꾸 멈춤니다. 그리고 중간에 Wrong Annotation: 다른 프로세스에서 사용중이어서... 가 자주 출력됩니다. 원인과 해결책이 있을까요?
  • 쿠다쿠다 2021.03.30 10:01 정말 도움이 많ㅇ ㅣ되었씁니다. 감사합니다.
  • charile 2021.05.03 15:34 글 읽고 많은 도움이 되었습니다. 감사합니다! 그리고 혹시 바운딩박스의 좌표를 얻을 수 있는 방법이 있을까요?
  • dgfdg 2021.05.13 15:43 혹시 사진 몇장 쓰신지 알 수 있을까요?
  • BlogIcon gogo5911 2021.05.14 17:20 신고 글에 있는 강아지, 고양이 검출 사진의 경우는 예시를 위해 올려 놓은 이미지라서 정확하게 몇 장의 데이터가 사용된지 알 수 없습니다.

    저의 경우 yolo를 자동차 번호판 검출에 사용했었습니다. 이때 100만장 데이터를 사용했었고 검출률의 경우에는 10만장은 88.45% 100만장은 92%가 나왔습니다.

    참고로 각 영상마다 검출률이 달랐습니다. 편의를 위해 제가 실험한 Video_1에서의 검출률을 예시로 말합니다.
  • sunljh310 2021.05.24 04:51 안녕하세요 혹시 학습을 한후 1000번째 가중치를 사용하여 학습결과를 확인해보려고 하는데
    마지막에 보이는 코드를 cmd에 입력하면
    Cannot load image test.jgp라고 떠서 문의드려요..
    혹시 test사진을 따로 지정해야하는건가요? 만약에 지정해야한다면 어떤방식으로 해야하나요?
  • BlogIcon gogo5911 2021.05.26 20:34 신고 darknet.exe detector test data\obj.data testcfg\yolov3.cfg backup/yolov3_1000.weights -i 0 -thresh 0.3 test.jpg -ext_output

    위의 명령어 부분 중 test.jpg 부분에 이미지 경로와 이미지 이름을 넣어주시면 됩니다.
  • KINAKYU 2021.06.03 10:28 filters= in the [convolutional]-layer doesn't correspond to classes= or mask= in [yolo]-layer

    학습하려는데 해당 오류가 발생합니다.
    cfg파일이 잘못된건가요?
    cfg파일은 build\darknet\x64\ 경로에있는 yolov3.cfg 파일을 수정했습니다.
  • 안녕하세요! 2021.07.15 20:11 안녕하세요! 혹시 여기서 training set이랑 validation set 비율이 어떻게 되는지 알 수 있는 방법이 있나요?
  • 안녕하세요 2021.09.11 15:38 If error occurs - run training with flag: -dont_show
    Saving weights to backup//yolov3_final.weights
    Create 6 permanent cpu-threads
    If you want to train from the beginning, then use flag in the end of training command: -clear
    학습 명령어 부분 도중 이런 에러가 발생하였는데 혹시 해결방법을 아시나요!
    중간에 에러가 떠서 계속 환경설정들을 수정했었습니다