☞ 문서의 내용은 가장 하단 참고문헌 및 사이트를 참고하여 필자가 보기 쉽도록 정리한 내용입니다.
☞ 틀린 내용 및 저작권 관련 문의가 있는 경우 문의하시면 수정 및 삭제 조치하겠습니다.
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=2 (현재 글에서는 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
문제가 없다면 아래와 같이 강아지와 고양이를 검출하는 것을 볼 수 있습니다.
※ 아래 사진의 경우 필자가 학습하여 검출한 이미지가 아닙니다. 예시를 위해 올려 놓은 이미지입니다.
참고자료