저번 포스팅에선 Yolo 설치와 실행까지 다뤄보았습니다.
이번엔 Yolo mark를 이용해 직접 데이터를 학습시키는 것을 포스팅하려 합니다.
먼저 Yolo mark를 다운받아줍니다.
git clone https://github.com/AlexeyAB/Yolo_mark |
다운을 받고 Yolo_mark 폴더로 들어가 make를 해줍니다.
cmake . make |
make까지 완료가 되면 Yolo mark를 실행시켜봅니다.
./linux_mark.sh |
위 명령어를 입력했을 때 권한이 없다며 실행이 안된다면 change mode로
chmod +x linux_mark.sh |
를 입력해 권한을 변경해줍니다.
Yolo mark를 실행시키게 되면
위와 같은 사진이 아닌 비행기 사진들이 나올겁니다.
사진에서 빨간색, 파란색, 주황색 네모친 곳을 보시면
빨강 : 현재 선택되어있는 class name
파랑 : 이미지 번호 / 이미지 개수
주황 : n번째 class / class 개수
를 나타내고 있습니다.
실행이 잘 된다는 것을 확인했으면 터미널로 돌아가 Ctrl+c 로 Yolo mark를 종료하고 화면에 나오는 이미지들을 모아놓는 폴더로 이동합니다.
darknet/x64/Release/data/img |
안에 있는 파일들을 비워주시고 학습시키고자 하는 이미지 파일들로 채워줍니다.
저는 주로 ffmpeg를 사용해영상을 사진으로 잘라 학습을 시켰습니다.
ffmpeg -i <영상이름> -vf fps=<초당 뽑고싶은 사진 수> <저장하고싶은 이름>%d.jpg |
이 명령어를 통해 영상을 사진으로 잘라낼 수 있습니다.
ffmpeg가 설치되어 있지 않다면 설치하고 실행해줍니다.
sudo apt-get install ffmpeg |
그 다음 바로 다음 상위 폴더인 data 폴더로 이동해 obj.data 파일과 obj.names 파일을 수정해줍니다.
여기서는 본인이 객체를 몇 가지나 학습시킬지 설정해줍니다.
저같은 경우엔 4가지를 학습시켰기 때문에 classes=4 를 해줬습니다.
아래 네 가지 항목들은 경로명이 다르다면 위와 같이 변경해줍니다.
여기선 본인이 학습시킬 객체의 이름을 정해줍니다.
저희 프로젝트에선 도둑들의 행동 중 소매에 넣는 sleeve, 안주머니에 넣는 inner_pocket, 수상해보일 수 있는 마스크와 모자를 쓴 mask_cap 그리고 가방에 넣는 ecoback 네 가지를 학습시켰습니다.
수정을 마치고 train.txt 파일을 열어보고 혹시 내용이 있다면 지워줍니다.
(Yolo mark로 labeling을 한 목록이 들어가고 학습을 할 때 목록대로 하기 때문에 없는 파일이 써있다면 에러가 납니다.)
이제 다시 Yolo_mark 폴더로 돌아와 Yolo mark를 실행해줍니다.
이번엔 직접 넣은 사진이 나오게 됩니다.
labeling하는 화면입니다.
자료는 직접 행동을 묘사해 제작한 영상과 아래 사이트에서 받은 영상 중 의도한 행동과 같은 동작을 하는 shoplifting 영상을 썼습니다.
(총 이미지 3698장)
https://visionlab.uncc.edu/download/summary/60-data/477-ucf-anomaly-detection-dataset
labeling은 마우스를 클릭해 끌어다 놓는 것으로 범위를 지정할 수 있습니다.
labeling 할 클래스 변경은 0~n 숫자키로 바꿀 수 있으며 space bar를 눌러 다음 사진을 불러올 수 있습니다.
이렇게 labeling을 마치면 img 폴더 내부엔 각 사진마다 labeling 데이터가 들어있는 텍스트 파일이 짝을 맞춰 생기게 됩니다.
다시 data 폴더로 이동해 train.txt 파일을 열어줍니다.
이 파일을 darknet 폴더로 옮겨 사용하기 때문에 경로를 바꿔줘야 합니다.
이렇게 바꿔주시면 됩니다.
img 폴더, obj.data, obj.names 와 train.txt 파일을 darknet/data 폴더로 옮겨줍니다.
그 다음 darknet 폴더로 이동해 convolutional weights을 받아줍니다.
wget https://pjreddie.com/media/files/darknet53.conv.74 |
darknet/cfg 폴더로 이동해 yolov3.cfg 파일을 열어줍니다.
여기서 batch size와 learning rate 를 찾아서
batch=64
learning_rate=<0.001 / 사용하는 GPU개수>
로 바꿔줍니다.
저는 GPU를 2장 사용했기 때문에 learning rate를 0.0005로 설정했습니다.
그리고 밑으로 내려가면서 [yolo] 항목들을 찾아줍니다.
[yolo] 항목을 찾았다면 classes를 yolo mark에서 사용한 class 개수로 바꿔주고 바로 위에 있는 [convolutional] 항목의 filters를 (classes+5)*3 으로 수정해줍니다.
저는 class를 4가지 사용하기 때문에 classes=4, filters=(4+5)*3=27 로 수정했습니다.
[yolo] 항목은 총 3개가 있으므로 위와 같이 모두 수정해줍니다.
이번엔 darknet/example 폴더로 이동해 detector.c 를 열어줍니다.
네모친 부분을 수정해서 학습결과인 weights 파일이 생성되는 주기를 바꿀 수 있습니다.
학습이 끝날때까지 진행하려면 시간소모가 매우 심하여 생성 주기를 적당히 조정하여 테스트 해줬습니다.
이제 학습을 위한 준비가 끝났습니다.
darknet 폴더로 돌아가 학습을 시작합니다.
./darknet detector train data/obj.data cfg/yolov3.cfg darknet53.conv.74 |
명령어를 통해 실행을 시키게 되면 darknet/backup 폴더에 weights 파일들이 결과물로 남게 됩니다.
(시간이 지나도 파일이 생성되지 않으면 Ctrl+c 로 학습을 중단하고 detector.c 에서 생성 주기를 짧게 바꿔줍시다.)
darknet 폴더로 돌아가 이 파일을 가지고 학습이 얼마나 되는지 테스트합니다.
./darknet detector test data/obj.data cfg/yolov3.cfg backup/<weights파일> <사진파일> ./darknet detector demo data/obj.data cfg/yolov3.cfg backup/<weights파일> <영상파일> ./darknet detector demo data/obj.data cfg/yolov3.cfg backup/<weights파일> data |
위에서부터 각각 사진파일, 영상파일, 웹캠으로 테스트를 진행할 때 사용하는 명령어입니다.
만약 테스트를 해봤는데 결과가 마음에 들지 않아 학습을 더 진행하고 싶다면 처음부터 다시 할 필요 없이
./darknet detector train data/obj.data cfg/yolov3.cfg backup/<이어서 학습시킬 weights 파일> |
이렇게 하시면 됩니다.
저희는 저장 주기를 600으로 두고 20000번가량 학습을 시켰습니다.
그 중 16800번 학습시킨 weights 파일이 인식률이 가장 좋게 나와서 16800회 학습시킨 weights 파일로 테스트를 했습니다.
인식률은 7~80%를 보여주고 있습니다.
참고 사이트
'Capstone design > Theft Chaser' 카테고리의 다른 글
Theft Chaser : Yolo를 활용한 도둑탐지 - darknet 코드 수정으로 알람 만들기 (3) | 2019.06.23 |
---|---|
Theft Chaser : Yolo를 활용한 도둑탐지 - Yolo 설치 (0) | 2019.06.23 |
Theft Chaser : Yolo를 활용한 도둑탐지 - 학습환경 설정(그래픽 드라이버, CUDA, CUDNN) (0) | 2019.06.23 |
Theft Chaser : Yolo를 활용한 도둑탐지 - 개발환경 구축(가상머신, opencv) (0) | 2019.06.21 |
Theft Chaser (도둑탐지)는 무엇? (0) | 2019.06.21 |