04. Yolo v4 설치 실행 및 custom 데이터 인식 - pineland/object-tracking GitHub Wiki
1. Prerequisite
Yolo는 아래와 같이 두가지 프로젝트 버전이 있다.
- https://pjreddie.com/darknet/ : Yolo 원저자가 만든 프로젝트이다.
- https://github.com/AlexeyAB/darknet : 다른 운영체제(윈도우)에서 쉽게 활용할 수 있으면서, 여러 가지 설정을 변경할 수 있고, Loss와 mAP를 그래프로 확인할 수 있다.
2. 설치
2.1 컴파일 환경설치
sudo apt update && apt upgrade
sudo apt install build-essential cmake
2.2 CUDA & cuDNN 설치 : 별도 참고
2.3 OpenCV 3.4.0 설치
2.3.1 openCV 라이브러리 설치
sudo apt-get install libjpeg-dev libpng-dev libtiff-dev sudo apt-get install libavcodec-dev libavformat-dev libswscale-dev libv4l-dev v4l-utils libxvidcore-dev libx264-dev libxine2-dev -y
sudo apt-get install libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev -y
sudo apt-get install libgtk-3-dev -y
sudo apt-get install mesa-utils libgl1-mesa-dri libgtkgl2.0-dev libgtkglext1-dev -y
sudo apt-get install libatlas-base-dev gfortran libeigen3-dev -y
2.3.2 openCV 설치
# create folder and download opencv module
mkdir opencv && cd opencv
wget -O opencv.zip https://github.com/opencv/opencv/archive/3.4.0.zip
wget -O opencv_contrib.zip https://github.com/opencv/opencv_contrib/archive/3.4.0.zip
unzip opencv.zip
unzip opencv_contrib.zip
# compile
cd opencv-3.4.0
mkdir build && cd build
cmake -D CMAKE_BUILD_TYPE=RELEASE \
-D CMAKE_INSTALL_PREFIX=/usr/local \
-D WITH_TBB=OFF \
-D WITH_IPP=OFF \
-D WITH_1394=OFF \
-D BUILD_WITH_DEBUG_INFO=OFF \
-D BUILD_DOCS=OFF \
-D INSTALL_C_EXAMPLES=ON \
-D INSTALL_PYTHON_EXAMPLES=ON \
-D BUILD_EXAMPLES=OFF \
-D BUILD_TESTS=OFF \
-D BUILD_PERF_TESTS=OFF \
-D WITH_QT=OFF \
-D WITH_GTK=ON \
-D WITH_OPENGL=ON \
-D OPENCV_EXTRA_MODULES_PATH=../../opencv_contrib-3.4.0/modules \
-D WITH_V4L=ON \
-D WITH_FFMPEG=ON \
-D WITH_XINE=ON \
-D BUILD_NEW_PYTHON_SUPPORT=ON \
-D PYTHON2_INCLUDE_DIR=/usr/include/python2.7 \
-D PYTHON2_NUMPY_INCLUDE_DIRS=/usr/lib/python2.7/dist-packages/numpy/core/include/ \
-D PYTHON2_PACKAGES_PATH=/usr/lib/python2.7/dist-packages \
-D PYTHON2_LIBRARY=/usr/lib/x86_64-linux-gnu/libpython2.7.so \
-D PYTHON3_INCLUDE_DIR=/usr/include/python3.6m \
-D PYTHON3_NUMPY_INCLUDE_DIRS=/usr/lib/python3/dist-packages/numpy/core/include/ \
-D PYTHON3_PACKAGES_PATH=/usr/lib/python3/dist-packages \
-D PYTHON3_LIBRARY=/usr/lib/x86_64-linux-gnu/libpython3.6m.so \
../
make -j$(nproc)
sudo make install
sudo sh -c echo '/usr/local/lib/' > sudo /etc/ld.so.conf.d/opencv.conf
sudo ldconfig
2.4 darknet 설치
2.4.1 darknet 다운로드
#git clone https://github.com/pjreddie/darknet
git clone https://github.com/AlexeyAB/darknet
cd darknet
2.4.1 darknet 내부에 있는 Makefile에서 옵션을 변경
GPU=1
CUDNN=1
CUDNN_HALF=1
OPENCV=1
AVX=0
OPENMP=0
LIBSO=1
Makefile 설정 완료 후
make
2.5 실행 및 테스트
2.5.1 weight 파일 다운로드
wget https://github.com/AlexeyAB/darknet/releases/download/darknet_yolo_v3_optimal/yolov4.weights
2.5.2 실행
- 그림 :
./darknet detector test ./cfg/coco.data ./cfg/yolov3.cfg ./yolov3.weights data/dog.jpg(그림파일명) -i 0 -thresh 0.25
- 동영상 :
./darknet detector demo ./cfg/coco.data ./cfg/yolov4.cfg ./yolov4.weights test.mpeg(동영상 파일명) -i 0 -thresh 0.25
위에서 동영상 파일명을 적어주지 않으면, webcam이 자동적으로 실행된다.
3. Custom 데이터 인식
3.1 레이블링 데이터 생성
YOLO_MARK를 이용하여 이미지 파일에 직접 Bounding Box를 마킹하여 Box의 좌표를 지정해준다.
3.1.1 Yolo_mark 설치
git clone https://github.com/AlexeyAB/Yolo_mark
cd Yolo_mark
cmake .
make
chmod +x ./linux_mark.sh
./linux_mark.sh # 테스트
3.1.2 이미지 레이블링
- 학습 시켜야할 이미지를 Yolo_mark/x64/Release/data/img 폴더 안에 넣어주고 classes.txt에 인식할 class만을 작성한다.
- ./linux_mark.sh를 실행한다.
- 실행을 시키면 다음과 같은 화면이 뜨고 드래그 해서 Bounding Box를 그려 마킹해준다. 마킹을 취소하려면 'c' 를 누르면 된다.
- 저장하고 다음 그림으로 넘어가려면 space bar를 누른다.
Marking을 하면 Yolo_mark/x64/Release/data/img에 마킹한 좌표 값이 들어 있는 txt 파일이 생성이 되고 Yolo_mark/x64/Release/data의 train.txt에 마킹한 이미지(경로 포함)가 입력된다.
3.2 이미지 학습
여기서 AlexeyAB github에 적힌 내용대로 진행한다.
3.2.1 cfg 파일 설정
cd darknet/cfg
vi yolov4.cfg # 원본은 백업해놓자.
- batch : cuda memory 에러 시 batch size를 수정
- subdivisions : 16 으로 수정
- width와 height : gpu 메모리를 고려하여 32로 나뉠 수 있는 크기로 조정
- max_batches = 클래스 갯수 * 2000
- steps = max_batches의 80%의 수치와 90%의 수치
(단, 이 것은 최소 추천 iter이므로 만약 훈련이 불충분하다고 느끼면 max_batches와 step를 증가시켜주면 된다.)
yolo 부분에 있는 classes와 yolo위쪽에 있는 filter의 크기를 수정해야 한다. yolo는 3개의 anchor가 있으므로 모두 수정해줘야 한다.
- classes : 훈련시키고자 하는 데이터셋의 class갯수
- filter의 갯수 : (classes + 5) * 3 <= yolo 태그 위에 있는 것만 수정.
3.2.2 data 파일 생성
darknet/cfg 폴더에 custom.data 파일을 생성하여 아래와 같이 학습을 위한 정보를 작성합니다.
classes= 1 # 학습하고자 하는 class 개수
train = cfg/train.txt # 학습 데이터 목록 기록 파일. 위의 YOLO_MARK로 작성된 train.txt를 가져와서 validation.txt와 나눈다.
valid = cfg/validation.txt # 검증 데이터 목록 기록 파일
names = cfg/custom.names # 학습하고자 하는 class 이름
backup = backup/
3.2.3 yolo convolution layer 다운로드
학습모델의 기본 구조로 사용할 yolo (darknet)의 convolution layer를 다운로드한다. 아래 링크에 없으면, AlexeyAB github에 가서 하나 다운로드 받는다.
- yolov4.conv.137 : drive.google.com/open?id=1JKF-bdIklxOOVy-2Cr5qdvjgGpmGfcbp
3.2.4 학습하기
yolo는 학습과정을 확인하기 위해 AlexeyAB의 darknet에서 제공하는 map 태그를 사용할 수 있다.
./darknet detector train cfg/custom.data cfg/yolov4.cfg yolov4.conv.137 -map
※ gpu를 사용하여 학습을 하고자 한다면 Makefile을 아래와 같이 수정하여 다시 make 해줘야 한다.
GPU=1
CUDNN=1
OPENCV=1
OPENMP=0
DEBUG=0
ARCH= -gencode arch=compute_61,code=[sm_61,compute_61] # gpu 버전에 따라 https://github.com/tpruvot/ccminer/wiki/Compatibility 에서 참고
학습이 끝나면 backup 폴더에 weight 파일이 생긴다. 1000iter 마다 생성된 가중치와 함께 학습 iter중 마지막 가중치를 담고 있는 last weight 파일, 학습 중 가장 평가 지표 상 높게 나타났던 best weight파일과 함께 훈련 모두 끝난 최종 파일인 final weight 파일이 떨어져 나오게 된다.
3.2.4 테스트
./darknet detect cfg/yolov4.cfg backup/yolov4_best.weights data/f16.jpg
./darknet detector demo ./custom/custom.data ./custom/yolov4.cfg ./backup/yolov4_best.weights data/f16.mp4 -i 0 -thresh 0.25
# 출력영상 저장 옵션 : -out_filename out.avi