YOLOv4를 이용하여 커스텀학습하는 법에 대해 알아보도록 하겠습니다.
이 글은 webnautes님의 블로그를 참고하여 작성했습니다.
https://webnautes.tistory.com/1482
기본적으로 다크넷이 설치 되어있어야 합니다.
설치법은 이전에 작성한 게시물을 참고하면 됩니다.
https://kumoh-irl.tistory.com/19?category=1228699
학습을 시키기 위해서는 데이터셋이 필요합니다.
이미지 파일을 준비하시거나, 동영상이 있다면
https://kumoh-irl.tistory.com/40?category=1265125
프레임별로 나눠 이미지로 만들어줍니다.
먼저 커스텀 학습을 위한 파일을 생성하고 그 안에 학습시킬 이미지들을 넣어줍니다.
cd
mkdir custom_yolo_test
cd custom_yolo_test
mkdir img
저는 이미지를 train용 데이터와 test용 데이터를 8:2 비율로 나눠서 train폴더와 test폴더로 구분한 뒤 img 폴더에 넣어줬습니다.
그리고 darknet에서 제공하는 annoation 프로그램인 Yolo_mark를 이용해 Bounding Box를 쳐줍니다.
Yolo_mark를 설치합니다.
cd
git clone https://github.com/AlexeyAB/Yolo_mark.git
cd Yolo_mark
cmake .
make
obj.names라는 파일을 만들어 학습하고자 하는 대상의 이름을 적어줍니다. 여러 개라면 이름 하나 당 엔터를 쳐줘서 구분해줍시다.
gedit obj.names
Yolo_mark를 실행시켜줍니다.
./yolo_mark ~/custom_yolo_test/img/train ./train.txt ./obj.names
custom_yolo_test/img/train 폴더 안에 있는 이미지에 대해 바운딩 박스를 친다는 뜻이고,
바운딩 박스를 쳐서 나오는 데이터들(바운딩 박스의 xy좌표, 너비, 폭)을 train.txt에 저장한다는 뜻입니다.
학습시키고자 하는 대상을 드래그로 영역을 지정해줍니다. (최대한 딱 맞게 치는게 좋습니다.)
클래스가 여러개라면 숫자 키보드로 바꿀 수 있습니다.
바운딩 박스를 쳤으면 스페이스바를 눌러 다음 이미지로 이동합니다.
바운딩 박스를 잘못 쳤으면 c를 눌러 다 지우거나 지우고 싶은 바운딩 박스 위에 마우스 커서를 올린 뒤 r을 눌러 제거합니다.
작업을 마쳤으면 esc키로 종료합니다.
train데이터뿐만 아니라 test데이터도 같은 방식으로 해줍니다.
./yolo_mark ~/custom_yolo_test/img/test ./test.txt ./obj.names
학습을 시키기 전에 준비 작업을 해줍시다.
cd
cd custom_yolo_test
cp ~/darknet/darknet .
cp ~/darknet/cfg/yolov4.cfg
darknet 파일에 있는 darknet 실행 파일과 cfg폴더 안의 yolov4.cfg파일을 가져옵니다. (굳이 cp 명령어 안 쓰고 마우스로 폴더에 직접 들어가 ctrl+c, v 하셔도 상관없습니다.)
data 폴더를 만들어서 필요한 파일들을 생성합니다.
mkdir data
gedit data/obj.data
obj.data 안에는 다음 내용을 넣어줍니다.
classes = 1
train = data/train.txt
valid = data/train.txt
names = data/obj.names
backup = backup/
학습시키는 대상이 1개가 아니면 개수에 맞게 classes를 바꿔줍니다.
그리고 data 폴더 안에 좀전에 만든 파일들을 넣어줍니다.
cp ~/Yolo_mark/train.txt ./data/
cp ~/Yolo_mark/test.txt ./data/
cp ~/Yolo_mark/obj.names ./data/
이번에도 마찬가지로 그냥 마우스로 복붙해도 됩니다.
그리고 네트워크 구성 정보가 적힌 cfg파일을 자신의 학습 상태에 맞게 수정해줍니다.
gedit yolo-obj.cfg
#으로 주석된 부분이 아니고 그냥 써져 있는 부분을 고쳐야합니다.
subdivision을 64로
width와 height를 416으로
max_batches는 몇번 반복해서 학습을 할지 정하는 수입니다. 보통 클래스당 최소 2000번은 해줘야 합니다.
학습하는 대상이 2개라면 4000이상으로 설정해주면 됩니다.
steps는 max_batches의 80% 90%를 적어주면 됩니다. max_batches가 4000이면 3200 3600이 되겠죠?
그리고 ctrl+f로 yolo를 검색하면 세 곳이 나올겁니다.
거기에 classes를 자신이 학습시키는 대상의 수에 맞게 수정을 해주고
바로 뒤에 convolution층에 filters를 (class수 + 5)*3로 수정해줍니다.
클래스가 두개라면 (2+5)*3 = 21이 되겠죠?
그리고 anchors는
./darknet detector calc_anchors data/obj.data -num_of_clusters 9 -width 416 -height 416
다음과 같은 명령어로 나온 값을 복붙해서 넣어주면 됩니다.
이걸 3곳 모두 해줘야합니다.
전이학습을 하면 더 빠르고 정확한 모델을 얻을 수 있습니다.
pre-trained model을 다운받아 학습합니다.
wget https://github.com/AlexeyAB/darknet/releases/download/darknet_yolo_v3_optimal/yolov4.conv.137
./darknet detector train data/obj.data yolov4.cfg yolov4.conv.137 -map
만약 yolov4.cfg가 아닌 yolov4-csp.cfg등 다른 cfg파일을 사용한다면 거기에 맞는 pre-trained model 파일을 찾아 학습시켜줘야 합니다.
학습이 끝나면 backup파일에 weights파일들이 저장되어 있을겁니다.
last.weigths 파일은 가장 최근에 학습된 weight들이 저장되어 있는 파일이고,
final.weight 파일은 가장 마지막에 학습된 weight들이 저장되어 있는 파일입니다.
학습이 끝났다면 두 파일은 똑같아집니다.
학습을 통해 얻는 weights 파일을 이용해서 결과를 확인해봅니다.
./darknet detector test data/obj.data yolov4.cfg backup/yolov4_best.weights test1.jpg
./darknet detector demo data/obj.data yolov4.cfg backup/yolov4_best.weights -ext_output 동영상.mp4
./darknet detector demo data/obj.data yolov4.cfg backup/yolov4_best.weights -c 0
순서대로 이미지, 동영상, 웹캠 실행 명령어입니다.
'정나우 > Jetson' 카테고리의 다른 글
TensorRT를 이용해서 Yolov4 성능 향상시키기 (3) | 2022.04.12 |
---|---|
[yolov4] Bounding box 중심점 출력하기 (0) | 2022.03.28 |
[Jetson Xavier agx] YOLO 실시간 객체 인식 시 웹캠 화질 낮추는 방법 (1) | 2021.12.16 |
Jetson xavier agx VScode 설치 및 실행 방법 (0) | 2021.10.12 |
Jetson Xavier agx 부팅 오류 (2) | 2021.10.06 |
댓글