DarknetでYolov4の推論を実行してみた。
- 20/05/02
- Ubuntu18.04.4
- GeForce RTX 2060
- Docker version 19.03.8
1. Darknetコンテナを作成
dockerfileで一気に作成したかったがうまく行かなかったので以下の手順を踏んだ。
dockerfile
FROM nvcr.io/nvidia/cuda:10.2-cudnn7-devel-ubuntu18.04 ENV DEBIAN_FRONTEND=noninteractive # OpenCV # ref:https://www.pyimagesearch.com/2020/02/03/how-to-use-opencvs-dnn-module-with-nvidia-gpus-cuda-and-cudnn/ RUN apt update && apt install -y --no-install-recommends \ build-essential cmake unzip pkg-config \ libjpeg-dev libpng-dev libtiff-dev \ libavcodec-dev libavformat-dev libswscale-dev \ libv4l-dev libxvidcore-dev libx264-dev \ libgtk-3-dev \ libatlas-base-dev gfortran \ ffmpeg \ python3-dev nano curl git \ && rm -rf /var/lib/apt/lists/* RUN curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py RUN python3 get-pip.py && rm get-pip.py RUN pip3 install --no-cache-dir \ numpy WORKDIR /opt ENV CV_VER=3.4.0 RUN curl -L https://github.com/opencv/opencv/archive/${CV_VER}.zip -o opencv-${CV_VER}.zip \ && curl -L https://github.com/opencv/opencv_contrib/archive/${CV_VER}.zip -o opencv_contrib-${CV_VER}.zip RUN unzip opencv-${CV_VER}.zip \ && unzip opencv_contrib-${CV_VER}.zip \ && rm opencv-${CV_VER}.zip opencv_contrib-${CV_VER}.zip # pascal(GTX1060 ...) -D CUDA_ARCH_BIN=6.1 WORKDIR /opt/opencv-${CV_VER} RUN mkdir build && cd build \ && cmake -D WITH_CUDA=ON \ -D WITH_CUDNN=ON \ -D OPENCV_DNN_CUDA=ON \ -D ENABLE_FAST_MATH=1 \ -D CUDA_FAST_MATH=1 \ -D CUDA_ARCH_BIN=7.5 \ -D WITH_CUBLAS=1 \ -D BUILD_opencv_python3=ON \ -D BUILD_opencv_python2=OFF \ -D BUILD_TESTS=OFF \ -D BUILD_PERF_TESTS=OFF \ -D BUILD_EXAMPLES=OFF \ -D CMAKE_BUILD_TYPE=RELEASE \ -D OPENCV_EXTRA_MODULES_PATH=../../opencv_contrib-${CV_VER}/modules \ -D CMAKE_INSTALL_PREFIX=/usr/local .. \ && make -j"$(nproc)" \ && make install -j"$(nproc)" \ && make clean RUN echo $(pkg-config --modversion opencv)
Darknetコンテナの作成・起動
# OpenCV-CUDAコンテナ作成 cd docker-build docker build -t opencv/cuda:3.4.0 . # コンテナ起動 docker run -it --rm --gpus all -w /workspace opencv/cuda:3.4.0 # Darknetをコンパイル git clone https://github.com/AlexeyAB/darknet.git \ && cd darknet \ && mkdir build-release \ && cd build-release \ && cmake .. \ && make \ && make install \ && make clean # コンテナから抜ける(ctl+p ctrl+q) # コンテナIDを確認 docker container ls # コンテナをイメージ化 docker commit <container id> darknet:yolov4 # コンテナを止める docker stop <container id> # コンテナにマウントするディレクトリを作成 cd ~/Darknet mkdir -p data/{weights,cfg,inputs,outputs} # 学習済みwightsをダウンロード wget --inet4-only -P ./weights https://pjreddie.com/media/files/yolov3.weights \ https://pjreddie.com/media/files/yolov3-tiny.weights \ https://github.com/AlexeyAB/darknet/releases/download/darknet_yolo_v3_optimal/yolov4.weights # コンテナを起動する xhost + docker run -it --rm --gpus all \ -e DISPLAY=$DISPLAY \ -v /tmp/.X11-unix:/tmp/.X11-unix \ -v /etc/group:/etc/group:ro \ -v /etc/passwd:/etc/passwd:ro \ -u $(id -u $USER):$(id -g $USER) \ -v ~/Darknet/data:/workspace/data \ -w /workspace/darknet \ darknet:yolov4
2. 推論の試行
# 1画像の推論結果を画面表示する(./predictions.jpgとして結果画像も作成される) ./darknet detector test cfg/coco.data cfg/yolov4.cfg /workspace/data/weights/yolov4.weights data/dog.jpg # ホスト側で確認できるようにデータを移動する(もっと良い方法があれば・・・) mv ./predictions.jpg /workspace/data/outputs/dog-predictions.jpg # 複数画像の推論結果を画面表示する(filelistの最後の画像のみ./predictions.jpgとして作成される) # /data内のjpgファイルを/workspace/data/inputsにコピーする cp data/*.jpg /workspace/data/inputs/ # filelistを作成する cd /workspace/data/inputs/ find $PWD -name "*.jpg" > filelist.txt # filelist.txtを渡して実行 cd /workspace/darknet ./darknet detector test cfg/coco.data cfg/yolov4.cfg /workspace/data/weights/yolov4.weights </workspace/data/inputs/filelist.txt # 複数画像の推論結果を保存する(入力画像と同じディレクトリに同名のtxtファイルができる) ./darknet detector test cfg/coco.data cfg/yolov4.cfg /workspace/data/weights/yolov4.weights -dont_show -save_labels </workspace/data/inputs/filelist.txt # 確認 cat /workspace/data/inputs/dog.txt 58 0.9106 0.2290 0.0476 0.0789 16 0.2877 0.6653 0.2401 0.5495 7 0.7477 0.2140 0.2874 0.1618 1 0.4473 0.4807 0.5964 0.5186
3. yolov4 vs yolov3 vs Yolov3-tiny
Sofia TerzoniによるPixabayからの画像
# Yolov4 処理時間:36.516000 msec ./darknet detector test cfg/coco.data cfg/yolov4.cfg /workspace/data/weights/yolov4.weights /workspace/data/inputs/japan-4141578_1920.jpg # Yolov3 処理時間:16.956000 msec ./darknet detector test cfg/coco.data cfg/yolov3.cfg /workspace/data/weights/yolov3.weights /workspace/data/inputs/japan-4141578_1920.jpg #Yolov3-tiny 処理時間:3.018000 msec ./darknet detector test cfg/coco.data cfg/yolov3-tiny.cfg /workspace/data/weights/yolov3-tiny.weights /workspace/data/inputs/japan-4141578_1920.jpg
Yolov4 結果画像
Yolov3 結果画像
Yolov3-tiny 結果画像
以上。