Yolov3をUbuntuで使う

はじめに

物体認識モデルの一つであるYolov3をUbuntu 18.04にインストールする。

pjreddie.com

物体認識モデルのYolo(You only look once:一度しか見ない)のVersion3で、 Yoloネットワークを実装したものがdarknetである。

pjreddie.com

環境

  • Intel(R) Core(TM) i9-9900K CPU @ 3.60GHz
  • 64GB RAM
  • GeForce RTX 2080 Ti 11GB
  • Ubuntu 18.04 LTS

インストールの流れ

  1. NVIDIA Graphic Driverのインストール(GPUがある場合)
  2. CUDAのインストール(GPUがある場合)
  3. cuDNNのインストール(GPUがある場合)
  4. OpenCVのインストール
  5. darknetのビルド

NVIDIA関係のインストール

NVIDIA Graphic Driver

GPUを積んでいるPCならドライバは大丈夫だと思うがnvidia-smiと端末で打ってみてDriver Versionを確認しておく

$  nvidia-smi
Mon Dec 16 12:24:47 2019       
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 440.33.01    Driver Version: 440.33.01    CUDA Version: 10.2     |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|===============================+======================+======================|
|   0  GeForce RTX 208...  On   | 00000000:01:00.0  On |                  N/A |
|100%   60C    P2   292W / 300W |   7496MiB / 11016MiB |     69%      Default |
+-------------------------------+----------------------+----------------------+

+-----------------------------------------------------------------------------+
| Processes:                                                       GPU Memory |
|  GPU       PID   Type   Process name                             Usage      |
|=============================================================================|
|    0      1134      G   /usr/lib/xorg/Xorg                            39MiB |
|    0      1200      G   /usr/bin/gnome-shell                          49MiB |
|    0      2080      G   /usr/lib/xorg/Xorg                           349MiB |
|    0      2215      G   /usr/bin/gnome-shell                         194MiB |
|    0      2596      G   ...uest-channel-token=15935874221952217047   245MiB |
+-----------------------------------------------------------------------------+

ここでCUDAのバージョンが表示されているがこれはDriverをビルドしたときのCUDAランタイムのバージョンなのでインストールされているバージョンとは異なる。

ドライバが入っていなければ以下でインストールする。

# GPUを認識しているか確認
$ sudo ubuntu-drivers devices
# 認識していればインストール
$ sudo ubuntu-drivers autoinstall
$ reboot

CUDA

CUDA(Compute Unified Device Architecture:クーダ)とは、NVIDIAが開発・提供している、GPU向けの汎用並列コンピューティングプラットフォーム(並列コンピューティングアーキテクチャ)およびプログラミングモデルである。 - Wikipedia

以下のようにCUDA10.1をインストールする

CUDA Toolkit 10.2 Download | NVIDIA Developer

$ wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64/cuda-ubuntu1804.pin
$ sudo mv cuda-ubuntu1804.pin /etc/apt/preferences.d/cuda-repository-pin-600
$ sudo apt-key adv --fetch-keys https://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64/7fa2af80.pub
$ sudo add-apt-repository "deb http://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64/ /"
$ sudo apt update
$ sudo apt -y install cuda-10-1
$ reboot

.bashrcなどに追加しておく

export PATH="/usr/local/cuda/bin:$PATH"
export LD_LIBRARY_PATH="/usr/local/cuda/lib64:$LD_LIBRARY_PATH"

cuDNN

NVIDIACUDA®ディープニューラルネットワークライブラリ(cuDNN)は、ディープニューラルネットワーク用のプリミティブのGPUアクセラライブラリです。 - NVIDIA cuDNN | NVIDIA Developer

https://developer.nvidia.com/rdp/cudnn-download ここから

  • cuDNN Library for Linux
  • cuDNN Runtime Library for Ubuntu18.04 (Deb)
  • cuDNN Developer Library for Ubuntu18.04 (Deb)
  • cuDNN Code Samples and User Guide for Ubuntu18.04 (Deb)

をダウンロードする(要ログイン)

ダウンロードするしたものをインストール

$ sudo apt install ./libcudnn7_7.6.5.32-1+cuda10.1_amd64.deb
$ sudo apt install ./libcudnn7-dev_7.6.5.32-1+cuda10.1_amd64.deb
$ sudo apt install ./libcudnn7-doc_7.6.5.32-1+cuda10.1_amd64.deb
$ tar xvf cudnn-10.1-linux-x64-v7.6.5.32.tgz
$ sudo cp -a cuda/include/cudnn.h /usr/local/cuda/include/
$ sudo cp -a cuda/lib64/libcudnn* /usr/local/cuda/lib64/
$ sudo chmod a+r /usr/local/cuda/include/cudnn.h /usr/local/cuda/lib64/libcudnn*
$ sudo cp -r cuda /usr/local/cudnn

テストする

$ cp -r /usr/src/cudnn_samples_v7/ ~/
$ cd ~/cudnn_samples_v7/mnistCUDNN
$ make
$ ./mnistCUDNN
...
Test passed!

OpenCVのインストール

Python関係

$ sudo apt -y install python3-dev python3-setuptools python3-pip python3-numpy

Intel MKL

intelのCPUを使っていれば最適化されるのでインストールする

公式ページ software.intel.com

$ sudo su
# cd /tmp
# wget https://apt.repos.intel.com/intel-gpg-keys/GPG-PUB-KEY-INTEL-SW-PRODUCTS-2019.PUB
# apt-key add GPG-PUB-KEY-INTEL-SW-PRODUCTS-2019.PUB
# rm GPG-PUB-KEY-INTEL-SW-PRODUCTS-2019.PUB
# echo "deb https://apt.repos.intel.com/mkl all main" > /etc/apt/sources.list.d/intelproducts.list
# exit
$ sudo apt update
$ sudo apt install -y intel-mkl-64bit-2019.5-075

Cmake

後のdarknetのビルドで最新版が必要となるので、cmakeの最新版をインストールする

$ sudo apt -y install zlib1g-dev libcurl4-openssl-dev
$ wget https://github.com/Kitware/CMake/releases/download/v3.15.5/cmake-3.16.1.tar.gz -O /tmp/cmake-3.16.1.tar.gz
$ cd /usr/local/src
$ sudo tar xvf /tmp/cmake-3.16.1.tar.gz
$ cd cmake-3.16.1
$ sudo su
# ./configure --system-curl --system-zlib
# make -j8
# make install

OpenCV

依存関係のインストール

$ sudo apt install -y build-essential bzip2 ca-certificates  curl ffmpeg \
        libavcodec-dev libavformat-dev libavresample-dev libcurl4-openssl-dev \
        libjpeg-dev libpng-dev libswscale-dev libtbb-dev libtiff-dev libv4l-dev \
        libopenalpr-dev libopenni2-dev libopenblas-dev libpcl-dev libgtkglext1-dev \
        libguava-java libgtk2.0-dev libgtk-3-dev openalpr openalpr-utils \
        openni2-utils primesense-nite-nonfree pkg-config unzip wget zlib1g-dev

ダウンロードする

$ cd /usr/local/src
$ sudo git clone https://github.com/opencv/opencv_contrib.git 
$ cd opencv_contrib
$ sudo git checkout 4.1.2 #OpenCVとバージョンを揃える
$ cd ..
$ sudo git clone https://github.com/opencv/opencv.git 
$ cd opencv
$ sudo git checkout 4.1.2

ビルドする

$ cd /usr/local/src/opencv
$ sudo su
# mkdir build
# cd build
# CUDA_PATH="/usr/local/cuda" CFLAGS="-I/usr/local/cuda/include" LDFLAGS="-L/usr/local/cuda/lib64" \
cmake -D CMAKE_BUILD_TYPE=RELEASE \
-D CMAKE_INSTALL_PREFIX=/usr/local \
-D OPENCV_EXTRA_MODULES_PATH=/usr/local/src/opencv_contrib/modules \
-D INSTALL_PYTHON_EXAMPLES=OFF \
-D BUILD_TESTS=OFF \
-D BUILD_PERF_TESTS=OFF \
-D BUILD_EXAMPLES=OFF \
-D BUILD_opencv_python2=OFF \
-D BUILD_opencv_python3=ON \
-D PYTHON_DEFAULT_EXECUTABLE=python3 \
-D OpenBLAS_INCLUDE_DIR=/usr/include/x86_64-linux-gnu \
-D OpenBLAS_LIB=/usr/lib/x86_64-linux-gnu/libopenblas.so \
-D OPENCV_DNN_CUDA=ON \
-D WITH_PYTHON=ON \
-D WITH_TBB=ON \
-D WITH_CUDA=ON \
-D WITH_MKL=ON \
-D WITH_CUBLAS=ON \
-D WITH_CUDNN=ON \
-D WITH_NVCUVID=OFF \
-D WITH_FFMPEG=ON \
-D CUDA_FAST_MATH=ON \
-D CUDA_ARCH_BIN=7.5 \
-D CUDA_ARCH_PTX=7.5 \
-D ENABLE_FAST_MATH=ON \
-D OPENCV_GENERATE_PKGCONFIG=ON \
-D OPENCV_PC_FILE_NAME=opencv.pc ..
# CUDA_PATH="/usr/local/cuda" CFLAGS="-I/usr/local/cuda/include" LDFLAGS="-L/usr/local/cuda/lib64" make -j8
# make install
# /sbin/ldconfig
# exit

cmakeのオプションでGPUを積んでいないPCなら

-D OPENCV_DNN_CUDA=ON \
-D CUDA_FAST_MATH=ON \
-D WITH_PYTHON=ON \
-D WITH_MKL=ON \
-D WITH_CUDA=ON \
-D WITH_CUBLAS=ON \
-D WITH_CUDNN=ON \
-D WITH_NVCUVID=OFF \
-D BUILD_opencv_cudaimgproc=ON

ココらへんを削除する

バージョンを確認する

$ python3 -c "import cv2; print( cv2.__version__ )"
4.1.2

darknetのビルド

本家の方は開発が滞っているようで最新のOpenCVでは動作しないのでforkされたものを使用する github.com 本家

github.com fork

$ git clone https://github.com/tiagoshibata/darknet.git
# Makefileを以下のように修正する
$ diff --git a/Makefile b/Makefile
index fa6edd5..121c3d1 100644
--- a/Makefile
+++ b/Makefile
@@ -1,7 +1,7 @@
-GPU=0
-CUDNN=0
-OPENCV=0
-OPENMP=0
+GPU=1
+CUDNN=1
+OPENCV=1
+OPENMP=1
 DEBUG=0
 
 ARCH= -gencode arch=compute_30,code=sm_30 \

$ make

実行してみる

$ cd result
$ wget https://pjreddie.com/media/files/yolov3.weights
$ cd ..
$ ./darknet detect cfg/yolov3.cfg results/yolov3.weights data/dog.jpg
...
Loading weights from results/yolov3.weights...Done!
data/dog.jpg: Predicted in 0.079761 seconds.
dog: 100%
truck: 92%
bicycle: 99%

CUDA Error: out of memoryと出た場合はcfg/yolov3.cfgsubdivisionsを大きな数にしてみる f:id:akashisn:20191121114409p:plain

追記 2019-11-22

darknetの更に活発なforkを見つけたのでそちらも使ってみます

github.com

コードの更新が数時間おきにあって活発

ビルドはかんたん

$ git clone https://github.com/AlexeyAB/darknet.git
$ cd darknet
$ mkdir build_release
$ cd build_release
$ cmake ..
$ make
$ make install

実行

$ mkdir models
$ wget https://pjreddie.com/media/files/yolov3.weights -O models/yolov3.weights
$ ./darknet detect cfg/yolov3.cfg models/yolov3.weights data/giraffe.jpg
...
Done! Loaded 107 layers from weights-file 
data/giraffe.jpg: Predicted in 29.941000 milli-seconds.
giraffe: 100%
giraffe: 62%
zebra: 96%

f:id:akashisn:20191122154645p:plain

blog.akashisn.info