본문 바로가기

머신러닝&딥러닝/YOLO

7. (YOLO) 이미지 학습

Ubuntu 18.04에서 이미지를 학습시키기 전 Yolo_mark를 사용하여 Yolov3와 v2 학습을 위한 이미지에 bounded boxes 마킹을 할 것이다.

학습 시킬 이미지 데이터는 (Crawler) selenium으로 이미지 크롤링에서 소개한 방법과 인터넷 사이트에서 제공해주는 데이터셋 등을 이용해도 된다.


이번 포스트에서는 인터넷 사이트에서 제공해주는 데이터셋을 이용하여 이미지를 학습시킬 것이다.

참고한 사이트는 http://pascal.inrialpes.fr/data/human/ 에서 person 이미지를 다운받았다.


해당 사이트에서 받은 이미지 포맷은 bmp 파일이다. 

이미지 학습을 위해서 포맷을 jpg로 변경해준다.

Window의 경우 알씨 프로그램을 사용한다.

Linux의 경우 다음 명령어를 통해 변경한다.

1
mogrify -format jpg *.bmp
cs

1. Yolo_mark


YOLO_MARK는 이미지 파일에 직접 Bounding Box를 마킹하여 Box의 좌표를 지정해준다.

Window와 Linux에서 모두 사용 가능하다.

YOLO_MARK 사용법은 https://github.com/AlexeyAB/Yolo_mark 에서 확인 가능하다.

Yolo_mark 설치

1
git clone https://github.com/AlexeyAB/Yolo_mark
cs

컴파일 및 예제 실행

1
2
3
4
cd Yolo_mark
cmake .
make
./linux_mark.sh
cs
※ 만약 linux_mark.sh 가 실행권한이 없으면 chmod 700 linux_mark.sh 명령어로 권한을 준다.

이미지 마킹

학습 시켜야할 이미지를 Yolo_mark/x64/Release/data/img 폴더 안에 넣어주고 ./linux_mark.sh를 실행시켜준다.
1
./linux_mark.sh
cs

실행을 시키면 다음과 같은 화면이 뜨고 드래그 해서 Bounding Box를 그려 마킹해준다.
마킹을 취소하려면 c 를 누르면 된다.
저장하고 다음 그림으로 넘어가려면 space bar를 누르면 된다.


Marking을 하면 Yolo_mark/x64/Release/data/img에 마킹한 좌표 값이 들어 있는 txt 파일이 생성이 됩니다.
그리고 Yolo_mark/x64/Release/data의 train.txt에 마킹한 이미지의 경로가 다음과 입력됩니다.

2. 이미지 학습



Yolo_mark로 마킹한 이미지를 학습시켜 weight 파일을 만들어 테스트 해보겠습니다.

cfg 파일 설정

새롭게 cfg파일을 작성해도 되지만 저는 yolov3.cfg 파일을 복사, 수정하여 사용했습니다.
1
2
3
cd darknet/cfg
cp yolov3.cfg ./yolov3-obj.cfg
vi yolov3-obj.cfg
cs

저는 한개의 클래스를 사용 할 것이기 때문에 다음을 수정해야합니다.

- yolo layer 3개의 classes=1
- 라인 번호 : 610, 696, 783

- convolutional layer 3개의 filters=18
-라인 번호 : 603, 689, 776


yolo 3개의 layer classes=1로 변경


convolutional 3개의 filters=18로 변경

(변경해야 되는 갹 convolutional은 yolo layer 위에 있다.)

⑵ data 파일 생성

darknet/cfg 폴더에 obj.data 파일에 자신이 사용하는 class의 이름을 작성합니다.

1
vi obj.data
cs

⑶ names 파일 생성

darknet/data 폴더에 obj.names 파일에 자신이 사용하는 class의 이름을 작성합니다.

1
2
cd ../data
vi obj.names
cs

⑷ darknet convolution layer 다운

/darknet 경로에 darknet convolution layer를 다운로드한다.
1
wget https://pjreddie.com/media/files/darknet53.conv.74
cs

⑸ 학습 이미지 및 train.txt 이동 및 수정

마킹한 Yolo_mark/x64/Release/data/img를 -> darknet/data으로 복사한다..
1
cp -r /home/jremind/Yolo_mark/x64/Release/data/img /home/jremind/darknet/data/
cs

Yolo_mark/x64/Release/data/ 의 train.txt를  -> darknet/data으로 복사하고 train.txt 내부의 경로를 변경해준다.

1
2
3
cp -/home/jremind/Yolo_mark/x64/Release/data/train.txt /home/jremind/darknet/data/
cd /home/jremind/darknet/data/
vi train.txt
cs

⑹ valid.txt 생성

darknet/data 경로에 valid.txt를 생성합니다.
train 이미지와 valid 이미지 비율은 8:2로 했습니다.
1
vi valid.txt
cs

⑺ 학습 실행

1
./darknet detector train cfg/coco.data cfg/yolov3.cfg darknet53.conv.74
cs

※ gpu를 사용하여 학습을 하고자 한다면 Makefile을 아래와 같이 수정하고 실행합니다.

gpu 버전에 따른 ARCH는 https://github.com/tpruvot/ccminer/wiki/Compatibility 에서 참고했습니다.

ls /usr/local 명령어로 cuda 버전을 확인 후 그에 맞게 수정합니다.


Makefile을 수정했으니 다시 컴파일합니다.

1
make
cs

gpu 1,2,3번을 사용했습니다.

1
./darknet detector train cfg/coco.data cfg/yolov3.cfg darknet53.conv.74 -gpus 1,2,3
cs


실행을 하면 다음과 같습니다.


실행이 끝나면 backup 폴더에 weight 파일이 생깁니다.

⑻ Test

학습이 완료되어 생긴 yolov3_6000.weights를 가지고 yolo에서 기본적으로 제공해주는 data/person.jpg를 테스트한 결과 잘 작동했습니다.
1
./darknet detect cfg/yolov3-obj.cfg backup/yolov3_6000.weights data/person.jpg
cs