화재감지 군집 드론을 구현하기 위해 fire detector을 위한 YOLO weights파일이 필요했다. 검색을 해보았지만 나오지를 않아 직접 학습시키기 기로 하였다.
젯슨 나노에는 Jetpack 4.2.2를 설치하였고 우분투 18.04.2 버전이 올라가 있다. 이는 전 게시물에서 확인 가능하다.
젯슨 나노에 darknet을 우선 설치해야 한다. 필자는 darknet_ros를 사용하기 위해 아래의 방법대로 설치를 하였다 이 안에는 기본적인 darknet도 포함되어있다. YOLO학습을 할 때에는 darknet_ros안에 있는 darknet에서 진행할 것이다.
$ cd catkin_ws/src
$ git clone --recursive https://github.com/leggedrobotics/darknet_ros.git
$ cd ..
$ catkin_make -DCMAKE_BUILD_TYPE=Release
# 빌드가 완료되었다면
$ rospack profile
출처: https://taemian.tistory.com/entry/ROS-1-n-darknetros를-활용한-Yolo-v3-사용법 [Taemian]
위에 서 git clone을 완료하면 보는 것과 같이 darknet_ros가 받아진다. 옆에 있는 jetson_camera는 카메라로 yolo를 인식하기 위해 따로 받은 것이기 때문에 신경 쓰지 않아도 된다. 후에 darknet_ros를 이용해 서버에서 yolo데이터를 받는 방법도 올리겠다.
위에 darknet_ros를 들어가 보면 아래의 사진과 같이 파일이 있다. 이중 darnet에 들어가 Makefile을 수정해준다.
처음에 Makefile을 열면 맨 위에 GPU, CUDNN, OPENCV 모두 0으로 초기화되어있을 것이다. 이를 1로 수정해 주어야 한다.
GPU를 사용해야 YOLO를 학습시킬 때의 속도가 매우 크게 증가한다. 필자는 처음에 이를 설정하지 않아 하나의 데이터를 학습시키는데 22초 정도가 소요되었는데 위에 처럼 설정하니까 0.2초로 크게 줄어들었다. 또한 CUDNN을 1로 설정하여 NVIDIA에서 제공하는 쿠다를 이용하고 OPENCV를 1로 초기화해줘야 YOLO 테스트 시 GUI 환경으로 결과를 출력받을 수 있다. 이는 조금 있다 출력 화면에서 보여주겠다.
위의 Makefile을 수정했으면 mak 하여 다시 컴파일해준다.
make
Yolo_mark 다운
YOLO를 학습시키기 위해서는 yolo_mark를 다운로드하아야 한다.
darknet 디렉터리에서 아래의 명령어를 통해 yolo_mark를 다운로드한다.
git clone https://github.com/AlexeyAB/Yolo_mark
다운로드한 후
cd Yolo_mark
cmake .
make
./linux_mark.sh
※ 만약 linux_mark.sh 가 실행 권한이 없으면 chmod 700 linux_mark.sh 명령어로 권한을 준다. 실행이 되었으면 확인만 하고 닫아버린다.Yolo_mark/x64/Release/data 에 보면 obj.data obj.names train.txt 이렇게 3개의 파일이 있다.
obj.data //여기 폴더에서는 classes만 수정해 주면 된다.
classes= 2 //구별을 원하는 객체의 갯수
train = data/train.txt
valid = data/train.txt
names = data/obj.names
backup = backup/
obj.names //객체의 이름 정하기
fire
smoke
이렇게 2개의 파일을 수정해주고 이미지 마킹을 진행하면 된다.
이미지 마킹
이미지를 마킹하기 전에 어떠한 object detect를 할 것일지 설정을 해야 한다.
학습시켜야 할 이미지를 Yolo_mark/x64/Release/data/img 폴더 안에 넣어주고./linux_mark.sh를 실행시켜준다.
실행을 시키면 다음과 같은 화면이 뜨고 드래그드래그해서 Bounding Box를 그려 마킹해준다.
마킹을 취소하려면 cc를 누르면 된다.
저장하고 다음 그림으로 넘어가려면 space bar를 누르면 된다.
필자는 화재감지를 위한 fire detector를 weights 파일을 만들기 위해 약 300장에 사진에 마크를 하였다. 이렇게 하나하나 마크를 하게 되면 Yolo_mark/x64/Release/data/img 폴더 안에 jpg 파일뿐만 아니라 마크를 나타내는 txt 파일이 추가로 생성된다. 욜로 학습을 위한 사진은 무조건 jpg 파일이어야 한다.
Marking을 하면 Yolo_mark/x64/Release/data/img에 마킹한 좌표 값이 들어 있는 txt 파일이 생성이 된다.
그리고 Yolo_mark/x64/Release/data의 train.txt에 마킹한 이미지의 경로가 다음과 입력된다.
이미지 학습
Yolo_mark/x64/Release/data 안에 들어있는 img폴더, obj.data, obj.names, train.txt 파일을 복사한 후
darknet/data에 넣어준다.
여기서 train.txt 파일을 보면 경로가 x64/Release/data/img로 나와있다. 여기서 x64/Release를 지워주던가 아니면 이경로에 이미지 파일을 저장해 주어야 한다. 필자는 train.txt에 있는 경로에 맞게 폴더를 만들어 사진을 저장하였다.
cfg 파일 설정
본격적으로 weight파일을 만들기 전에 cfg파일을 설정해 주어야 한다. 이는 YOLO의 버전마다 다르기 때문에 자신이 원하는 버전에 맞게 수정해 주어야 한다. 필자는 yolov2-tiny를 사용하였다.
darknet/cfg 안에 보면 많은 cfg파일들이 있다. 만약 본인이 원하는 YOLO버전의 cfj파일이 존재하지 않는다면 다운로드하여 사용해야 한다.
yolov2-fire.cfg
맨 위에 부분
[net]
# Testing
#batch=1
#subdivisions=1
# Training
batch=64
subdivisions=16
width=416
height=416
channels=3
momentum=0.9
decay=0.0005
angle=0
saturation = 1.5
exposure = 1.5
hue=.1
learning_rate=0.001
burn_in=1000
max_batches = 500200
policy=steps
steps=400000,450000
scales=.1,.1
맨 아래 부분
[convolutional]
batch_normalize=1
size=3
stride=1
pad=1
filters=512
activation=leaky
[convolutional]
size=1
stride=1
pad=1
filters=35 //(classes +5)*5 에 맞게 수정해준다
activation=linear
[region]
anchors = 0.57273, 0.677385, 1.87446, 2.06253, 3.33843, 5.47434, 7.88282, 3.52778, 9.77052, 9.16828
bias_match=1
classes=2 // 아까 obj.data에서 설정한 classes와 같게 수정한다.
coords=4
num=5
softmax=1
jitter=.2
rescore=0
object_scale=5
noobject_scale=1
class_scale=1
coord_scale=1
absolute=1
thresh = .6
random=1
yolov2-tiny 경우 위에화 같이 2 부분만 수정해주면 된다. 이는 yolov2 버전도 동일하다.
darknet convolution layer 다운
/darknet 경로에 darknet convolution layer를 다운로드한다.
wget https://pjreddie.com/media/files/darknet53.conv.74
./darknet detector train data/obj.data cfg/yolov2-fire.cfg darknet53.conv74
이러면 학습 이 시작된 거다.
맨 아랫줄을 보면 37: 327.945455, 385.457397 avg 가 있는데 avg가 가장 적어질 때까지 돌려야 한다. 기본적으로 한 개당 2000번의 학습을 기준으로 하고 있다.
weights파일 확인
darknet/backup 안에 weights 파일이 저장된다. 기본 설정으로 100개 단위마다 저장이 되고 1000개 이상부터는 10000 단위로 저장이 된다. 즉 100, 200, 300..... 900, 10000, 20000 이런 식으로 저장이 되는 것이다. 이 저장 설정을 바꾸기 위해서는 darknet/examples detector.c 들어가 138번째 줄을 다음과 같이 수정해 주어야 한다.
if(i%3000==0){ //3000개마다 저장이 되게 수정했다
TEST
test 하기 전에 cfg 파일의 설정을 변경해 주어야 한다.
[net]
# Testing
batch=1 #트레이닝 시킬때에는 아래의 주석을 없애야한다.
subdivisions=1
# Training #트레이닝시 여기 주석 취소
#batch=64 #트레이닝시 여기 주석 취소
#subdivisions=16
width=416
height=416
channels=3
momentum=0.9
decay=0.0005
angle=0
saturation = 1.5
exposure = 1.5
hue=.1
learning_rate=0.001
burn_in=1000
max_batches = 500200
policy=steps
steps=400000,450000
scales=.1,.1
./darknet detect cfg/yolov2-fire.cfg backup/yolov2-fire_3000.weights data/img/123.jpg
실행시키면 된다 여기서 위에서 말한 Makefile에서 opencv = 1로 해주지 않으면 실행한 결과가 사진으로 나오지 않는다.
'군집드론' 카테고리의 다른 글
[Ubuntu]라즈베리파이 Ubuntu Mate ROS 설치하기 (0) | 2021.08.18 |
---|---|
[라즈베리 파이] Ubuntu Mate Windows에서 원격으로 조종하기 (0) | 2021.08.16 |