chldkato

윈도우에서 YOLO 학습하기 본문

딥러닝

윈도우에서 YOLO 학습하기

chldkato 2019. 7. 12. 17:39

https://github.com/AlexeyAB/darknet

 

AlexeyAB/darknet

YOLOv4 - Neural Networks for Object Detection (Windows and Linux version of Darknet ) - AlexeyAB/darknet

github.com

윈도우에서 YOLO를 테스트할 수 있게 빌드를 먼저 하신 후 아래 과정을 진행해야 합니다

 

 

1. 데이터 준비 : Caltech 101

http://www.vision.caltech.edu/Image_Datasets/Caltech101/

 

Caltech101

We have collected a new data-set of 256 object categories!! *** New Expanded / Improved Caltech 256 Category Data-Set *** Click Here to access the New Data-Set: Caltech256 ---> Description Pictures of objects belonging to 101 categories. About 40 to 800 im

www.vision.caltech.edu

101_ObjectCategories.tar.gz (131Mbytes)를 클릭해서 다운받습니다.

이 중에서 leopard 라벨 80장만을 학습해서 단일 오브젝트 검출을 해보겠습니다.

 

데이터 선정 시 주의해야 할 점은 다음과 같습니다.

1) 검출할 오브젝트가 대부분 가운데에 배치되어 있다.

2) 검출할 오브젝트가 눈에 띄게 크다.

3) 배경이 지나치게 단순하다.

 

위와 같은 조건에서는 학습이 한 쪽으로 치우쳐 실제 테스트에서는 성능이 떨어질 수 있으니 주의해야 합니다.

 

 

2. 위치 정보 구현

학습 데이터셋을 바탕으로 검출할 오브젝트의 위치 정보를 만들어야 합니다.

사용할 수 있는 툴은 bbox-label-tool 등이 있으나 yolo 학습에 용이한 yolo_mark를 사용하겠습니다.

 

https://github.com/AlexeyAB/Yolo_mark

코드를 다운받은 후 yolo_mark.sln을 실행합니다.

 

이전에 윈도우 빌드 환경 설정 과정과 같이 opencv 경로를 설정해줍니다.

 

alt+enter - c/c++ - 일반 - 추가 포함 디렉터리 - opencv의 build\include 경로 설정

             - 링커 - 일반 - 추가 라이브러리 디렉터리 - opencv의 build\x64\vc14\lib 경로 설정

 

완료 후 ctrl+F5를 눌러 한 번 실행해줍니다.

 

yolo_mark\x64\release\data\img에 있는 모든 파일을 지워주시고 학습할 이미지를 넣어줍니다.

 

그리고 data폴더의 obj.data, obj.names 파일을 메모장으로 열어 수정해줍니다.

 

단일 오브젝트 검출이기 때문에 classes를 1로 수정합니다. 검출할 대상이 늘어나면 그만큼 값을 올려주시면 됩니다.

 

라벨을 지정해줍니다. 라벨을 더 추가하고 싶으면 다음 줄에 적으시고 저장하면 됩니다.

 

이제 release폴더로 돌아와서 yolo_mark.cmd 파일을 실행해줍니다.

 

마우스로 드래그하여 오브젝트의 좌표를 결정해주면 됩니다.

결정을 완료하면 data\img 폴더에 텍스트 파일로 좌표 데이터가 저장됩니다.

종료할 때는 esc를 누르면 됩니다.

 

마지막으로 yolo_mark\x64\release의 yolo-obj.cfg 파일을 darknet\build\darknet\x64로,

release\data의 img폴더, obj.data, obj.names, train.txt 파일을 darknet\build\darknet\x64\data에 넣어줍니다.

 

 

3. YOLO 학습하기

 

yolo-obj.cfg에는 학습에 필요한 파라미터들이 저장되어 있습니다.

 

여기서 max_batches는 학습 종료 epoch입니다. 학습이 되는지 확인만 하기 위해서 2000으로 설정하였습니다.

 

맨 밑으로 내려가면 마지막 출력층 필터와 클래스 값을 확인해야 합니다.

클래스는 라벨 수에 맞춰주시면 됩니다.

 

YOLO는 S x S개의 픽셀로 분할하고 후보 영역을 S x S x B개 만듭니다.

그리고 출력층의 노드 수는 다음과 같습니다. S x S x (B x (5 + C)) 

여기서 B는 위 그림의 num 값이며 C는 classes 값입니다.

그리고 마지막 층 필터 값은 (B x (5 + C))이므로 30입니다.

 

cmd창에서 darknet\build\darknet\x64 경로로 이동하여 실행해봅니다.

 

darknet.exe detector train data/obj.data yolo-obj.cfg data/extraction.conv.weights

 

여기서 extraction.conv.weights는 학습용의 초기 모델입니다. 구글링하면 여러 종류의 모델을 구할 수 있습니다.

 

 

4. YOLO 테스트

 

학습이 완료되면 backup 폴더에 학습하여 만든 모델이 저장됩니다.

이 모델을 불러와서 테스트를 해봅니다.

 

darknet detector test data/obj.data yolo-obj.cfg backup/yolo-obj_1000.weights -thresh 0.25 leopard.jpg -ext_output

 

2000이 아닌 1000 epoch에 해당하는 모델을 불러와서 테스트해보았습니다.

 

여기서 thresh 값을 크게 하면 정확도가 더 높은 영역을 검출합니다. 보통 0.1~0.7 정도의 값으로 설정합니다.

 

이미지 화질이 좋지 않았음에도 잘 학습 된것을 확인해볼 수 있습니다.

Comments