지난 글에서 Yolo mark를 이용해 데이터를 라벨링 하는 방법을 알아보았습니다. 이번 글에서는 이 라벨링 된 데이터를 가지고 학습을 진행하는 방법에 대해 알아보겠습니다.
1. 학습 준비
우선 darknet-master\build\darknet\x64\data에 들어갑니다. 그리고 여기에 라벨링 할 때 사용한 obj.name과 obj.data를 복사 붙여 넣기 해줍니다. 그리고 Yolo mark에 만들어진 train.txt 파일도 붙여 넣어 줍니다. 그리고 img 폴더에 라벨링 한 모든 사진과 txt 파일을 넣어줍니다.
이때 train.txt에 적혀있는 모든 사진들이 img 폴더에 존재해야 합니다. 만약 없다면, 학습 과정에서 오류가 나게 됩니다.
그리고 http://pjreddie.com/media/files/darknet53.conv.74에서 weights 파일을 다운로드해서 data 폴더 내에 위치시켜줍니다.
지금까지 한 작업들을 darknet-master\data에서 한 번 더 해줍니다. 똑같이 obj.name과 obj.data, train.txt를 복사 붙여 넣기 해주고, img 폴더에 사진과 txt 파일도 넣어줍니다.
여기까지 한 뒤에 darknet-master\build\darknet\x64로 들어갑니다. 그리고 yolov3.cfg 파일을 열어줍니다. 여기서 몇 가지 수치를 고칠 수 있습니다.
subdivision은 8, 16, 32, 64 중에 선택하시면 됩니다. 숫자가 작아질수록 성능은 좋아지지만, GPU 성능에 따라 에러가 날 수 있습니다. 작은 숫자부터 시도해보면서 올려주면 됩니다.
height와 width도 숫자가 커질수록 성능은 좋아지지만, subdivision과 같이 에러가 날 수 있습니다. 13의 배수로 설정해주면 됩니다.
max_batches는 학습할 횟수를 뜻합니다. 보통 class의 개수 * 4000 또는 class의 개수 * 4000 + 200 정도로 지정해 줍니다.
steps는 max_batches의 0.8 값과 0.9 값으로 지정해줍니다. 만일 max_batches가 8000이라면 steps는 6400, 7200으로 지정해주시면 됩니다.
그리고 쭉 내리다 보면 [yolo]라는 항목이 몇 군데 존재합니다. 이 [yolo]의 바로 위에 있는 [convolution]의 filters의 개수를 3*(class의 개수 + 5)로 변경시켜 줍니다. 그리고 [yolo]의 classes 개수를 자신이 분류하고 싶은 classes의 개수로 바꿔줍니다.
[yolo]에 anchors라는 항목이 있을 것입니다. 우선 Desktop\darknet-master\build\darknet\x64라는 폴더로 이동해서 경로에 cmd를 검색하면 해당 경로의 cmd 창이 뜨게 됩니다.
여기에 darknet.exe detector calc_anchors data/obj.data -num_of_clusters 9 -width 416 -height 416이라는 명령어를 작성해줍니다. width와 height는 본인이 위에서 지정한 값과 똑같이 맞춰주시면 됩니다.
실행시키시면 제일 아래에 자신에게 맞는 anchors 값이 나온 것을 확인할 수 있습니다. 그대로 복사해서 cfg 파일에 붙여 넣어줍니다.
filters와 classes, anchors 값을 cfg 파일을 내려가면서 [yolo]가 나올 때마다 수정해줍니다.
2. 학습 진행
여기까지 학습을 위한 준비를 모두 마쳤습니다. 이제 실제 학습에 들어가 보도록 하겠습니다. 다시 위에서 처럼 Desktop\darknet-master\build\darknet\x64에서 cmd를 실행시켜 줍니다. 그리고 다음의 명령어를 실행시켜줍니다.
darknet detector train data/obj.data yolov3.cfg data/darknet53.conv.74 -gpu 0
굵게 처리된 부분들은 자신의 경로와 맞는지 확인을 해야 합니다. 그리고 -gpu 뒤에는 자신의 gpu 개수에 따라 하나면 -gpu 0, 두 개면 -gpu 0,1로 작성해줍니다.
그리고 엔터를 치면 학습이 시작됩니다. cmd 창에서 계속 내용이 올라오고, 그래프 창이 떠 있으면 학습이 제대로 시작된 것입니다.
혹시 out of memory라는 에러가 발생하면 cfg 파일에서 subdivision이나 height, width의 값을 조정해 성능을 조금 낮추어주어야 합니다.
그리고 CPU 문제로 컴퓨터가 꺼졌다 켜지거나, 혹은 다른 문제로 인해 학습이 중단될 수 있습니다. 이럴 때는 당황하지 말고 Desktop\darknet-master\build\darknet\x64\backup으로 이동하면 weight 값들이 저장되어 있습니다. 여기서 yolo-obj_last.weights가 가장 마지막에 저장된 weights이니 이 파일을 darknet53.conv.74.weights 대신에 명령문에 넣고 다시 실행하시면 됩니다.
darknet detector train data/obj.data yolov3.cfg backup/yolo-obj_last.weights -gpu 0
weights 파일들은 1000번 학습이 될 때 마다 자동으로 하나씩 생기고, 학습이 지정한 횟수만큼 완료되면 final 이 생성됩니다. Last는 마지막 weights를 저장하므로 학습이 끝까지 완료되었다면 final과 last는 같은 값을 가지고 있습니다.
3. 테스트
이렇게 학습이 완료되면 이 weights 값을 이용해 잘 학습이 되었는지 확인해 볼 수 있습니다.
사진 : darknet detector test data/obj.data yolo-obj.cfg backup/yolo-obj_last.weights data/1.jpg
영상 : darknet detector demo data/obj.data yolo-obj.cfg backup/yolo-obj_last.weights data/1.mp4
굵은 글씨체 부분은 본인이 원하는 경로에 원하는 사진이나 영상을 넣고 실행하시면 됩니다. 그러면 다음과 같이 결과를 확인하실 수 있습니다.
다행히 잘 찾아내는군요 ^^
'프로젝트 및 실습 > Yolo' 카테고리의 다른 글
[Yolo] Yolo-Mark 사용법 (2) | 2021.01.17 |
---|---|
[Yolo] Windows에 Yolo darknet 설치하기 (3) | 2021.01.12 |
[Yolo] Windows에 Yolo-Mark 설치하기 (1) | 2021.01.12 |