04. Yolo v4 설치 실행 및 custom 데이터 인식 - pineland/object-tracking GitHub Wiki

1. Prerequisite

Yolo는 아래와 같이 두가지 프로젝트 버전이 있다.

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