[8] yolo custom training
yolo를 이용해 저번에 라벨링했던 자신의 데이터 세트를 학습시키는 방법에 대해 알아 보겠습니다.
1. darknet 디렉토리로 들어갑니다.
$ cd darknet
2. daknet 디렉토리 내의 cfg 디렉토리로 이동하여 자신이 학습을 진행시킬 cfg 파일을 바꿔줍니다.
예를들어 yolov3.cfg를 사용하여 학습을 진행할경우 yolov3.cfg를 vi로 열어주고
yolov2.cfg를 사용하여 학습을 진행할 경우 yolov2.cfg를 vi로 열어줍니다.
이글에선 yolov3.cfg를 기준으로 설명해드리겠습니다.
[net] # Testing # batch=1 # subdivisions=1 # Training batch=64 subdivisions=16 width=608 height=608 channels=3 momentum=0.9 decay=0.0005 angle=0 saturation = 1.5 exposure = 1.5 hue=.1 |
batch를 설정하는 라인을 찾아 자신이 원하는 batch를 설정해줍니다.
batch를 너무 크게 설정할 경우 학습이 진행되지 않을수 있으므로 적절하게 설정해줍니다
subdivisions 역시 자신이 원하는 값으로 설정해줍니다.
그런다음 자신이 학습시킬 classes 를 변경해 주어야 합니다.
예를 들어 저희의 경우 포트홀 하나만 탐지할 계획이므로 1 로 변경해주었습니다.
607 [yolo] 608 mask = 6,7,8 609 anchors = 10,13, 16,30, 33,23, 30,61, 62,45, 59,119, 116,90, 156,198, 373,326 610 classes=1 611 num=9 612 jitter=.3 613 ignore_thresh = .7 614 truth_thresh = 1 615 random=1
693 [yolo] 694 mask = 3,4,5 695 anchors = 10,13, 16,30, 33,23, 30,61, 62,45, 59,119, 116,90, 156,198, 373,326 696 classes=1 697 num=9 698 jitter=.3 699 ignore_thresh = .7 700 truth_thresh = 1 701 random=1
780 [yolo] 781 mask = 0,1,2 782 anchors = 10,13, 16,30, 33,23, 30,61, 62,45, 59,119, 116,90, 156,198, 373,326 783 classes=1 784 num=9 785 jitter=.3 786 ignore_thresh = .7 787 truth_thresh = 1 788 random=1 |
classes를 설정해 준 다음 filter 값을 수정해줍니다.
yolo v3 를 사용한 경우 (classes + 5) * 3
yolo v2 를 사용한 경우 (classes + 5) * 5 로 수정해줍니다.
599 [convolutional] 600 size=1 601 stride=1 602 pad=1 603 filters=18 604 activation=linear
685 [convolutional] 686 size=1 687 stride=1 688 pad=1 689 filters=18 690 activation=linear
772 [convolutional] 773 size=1 774 stride=1 775 pad=1 776 filters=18 777 activation=linear |
3. darknet 디렉토리 내의 data 폴더로 이동하여 names 수정
저는 coco.names를 수정해주었습니다.
$ vi coco.names
4. darknet의 cfg디렉토리 내의 coco.data에 자신의 classes의 수, train.txt, coco.names의 위치 수정
5. Yolo_mark를 통해 마킹된 이미지를 darknet/Yolo_mark/x64에서 danknet/x64로 이동
darknet/Yolo_mark/ 내의 디렉토리에 있는 x64디렉토리 darknet/x64의 위치로 이동 시켜 줍니다.
이때 darknet/Yolo_mark/x64/Release/data 디렉토리 내의 train.txt 파일은
darknet/data 폴더로 이동시켜줍니다.
darknet 위치 기준
$ cp -r ./Yolo_mark/x64 ./
$ cp ./x64/Release/data/train.txt ./data
6. darknet에 convolution layer 다운
wget https://pjreddie.com/media/files/darknet53.conv.74
7. GPU 사용시 Makefile 수정
GPU = 1
CUDNN = 1
OPENCV = 1
ARCH = https://github.com/tpruvot/ccminer/wiki/Compatibility
ARCH 는 해당 사이트를 참고하여 자신의 작업환경에맞게 작성해주시면됩니다.
수정이 완료된 이후에는 반드시 make를 해주셔야 됩니다.
8. 학습 진행
./darknet detector train cfg/coco.data cfg/yolov3.cfg darknet53.conv.74 -gpu 0,1,3
해당 이미지처럼 학습이 진행됩니다.
실행이 끝나면 backup폴더에 weight 파일이 생깁니다.
이를 가지고 test를 실행하면 됩니다.
9. 테스트
./darknet detect cfg/yolov3.cfg backup/yolov3_30000.weights data/dmg.jpg
다음과 같이 학습을 진행시켜 나온 결과를 테스트 하여 정확도가 얼마나 나오는지 알 수 있습니다.
다음 글에서는 어플리케이션 사용에있어서 연산 속도를 높일수 있는 tensorflow 기반의 darkflow를 이용하여 yolo를 학습하는 방법을 알아 보겠습니다.
참고
https://j-remind.tistory.com/64