본문 바로가기

Capstone design/Theft Chaser

Theft Chaser : Yolo를 활용한 도둑탐지 - Labeling, Yolo 학습

저번 포스팅에선 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 파일을 수정해줍니다.

obj.data 파일 내부

여기서는 본인이 객체를 몇 가지나 학습시킬지 설정해줍니다.

저같은 경우엔 4가지를 학습시켰기 때문에 classes=4 를 해줬습니다.

아래 네 가지 항목들은 경로명이 다르다면 위와 같이 변경해줍니다.

 

obj.names 파일 내부

여기선 본인이 학습시킬 객체의 이름을 정해줍니다.

저희 프로젝트에선 도둑들의 행동 중 소매에 넣는 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

 

UCF-Anomaly-Detection-Dataset - Download Summary

 

visionlab.uncc.edu

 

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 를 열어줍니다.

136번째 줄에 위치해있다.

네모친 부분을 수정해서 학습결과인 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%를 보여주고 있습니다.

직접 제작한 영상은 모두 가게 주인분들의 허가를 받고 촬영하였음을 알려드립니다.

 

 

 

참고 사이트

이정민 https://jeongmin-lee.tistory.com/m/7?category=765520

개발자 이상현 https://pgmrlsh.tistory.com/6?category=766787