Kinaconの技術ブログ

Ubuntuはじめました。

DarknetでYolov4の推論を実行してみた。

  • 20/05/02
  • Ubuntu18.04.4
  • GeForce RTX 2060
  • Docker version 19.03.8

1. Darknetコンテナを作成

dockerfileで一気に作成したかったがうまく行かなかったので以下の手順を踏んだ。

  • GPU有効化イメージでOpenCV-CUDAをインストールしたコンテナを作成。
  • コンテナでDarknetをビルド。
  • コンテナをイメージ化して保存。


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 結果画像

f:id:m-oota-711:20200502221806j:plain
yolov4

Yolov3 結果画像

f:id:m-oota-711:20200502221841j:plain
yolov3

Yolov3-tiny 結果画像

f:id:m-oota-711:20200502221921j:plain
yolov3-tiny

以上。