Yolov3をUbuntuで使う

はじめに

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

pjreddie.com

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

pjreddie.com

環境

  • Intel(R) Core(TM) i7-6700K CPU @ 4.00GHz
  • 32GB RAM
  • GeForce GTX 980 4GB
  • 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
Thu Nov 21 09:10:30 2019       
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 418.87.01                          Driver Version: 418.87.01     |
|-------------------------------+----------------------+----------------------+
| 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 GTX 980     On   | 00000000:01:00.0  On |                  N/A |
|  0%   54C    P5    20W / 196W |    885MiB /  4040MiB |      4%      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 |
+-----------------------------------------------------------------------------+

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

# GPUを認識しているか確認
$ sudo ubuntu-drivers devices
== /sys/devices/pci0000:00/0000:00:01.0/0000:01:00.0 ==
modalias : pci:v000010DEd000013C0sv00001462sd00003170bc03sc00i00
vendor   : NVIDIA Corporation
model    : GM204 [GeForce GTX 980]
driver   : nvidia-driver-390 - distro non-free
driver   : nvidia-driver-410 - third-party free
driver   : nvidia-driver-430 - distro non-free
driver   : nvidia-driver-418 - third-party free
driver   : nvidia-driver-435 - distro non-free
driver   : nvidia-driver-440 - third-party free recommended
driver   : xserver-xorg-video-nouveau - distro free builtin
# 認識していればインストール
$ sudo ubuntu-drivers autoinstall
$ reboot

CUDA

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

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

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
$ sudo ln -s /usr/local/cuda-10.2/ /usr/local/cuda
$ 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 -y ./libcudnn7_7.6.5.32-1+cuda10.2_amd64.deb
$ sudo apt install -y ./libcudnn7-dev_7.6.5.32-1+cuda10.2_amd64.deb
$ sudo apt install -y ./libcudnn7-doc_7.6.5.32-1+cuda10.2_amd64.deb
$ tar xvf cudnn-10.2-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のインストール

今後の開発に必要そうなもの

$ sudo apt install -y build-essential gcc g++ dpkg-dev pkg-config \
make autoconf automake flex bison clang binutils swig curl apt-transport-https ca-certificates \
subversion ccache zip unzip libopenblas-dev liblapack-dev libtbb-dev \
libxi-dev libsndfile1-dev libopenexr-dev libjpeg-dev libalut-dev libsdl-dev \
libavdevice-dev libavformat-dev libavutil-dev libavcodec-dev libswscale-dev \
libx264-dev libxvidcore-dev libmp3lame-dev libspnav-dev libglu1-mesa-dev libv4l-dev \
libprotobuf-dev protobuf-compiler protobuf-c-compiler libgoogle-glog-dev libhdf5-dev \
libboost-dev libboost-system-dev libboost-filesystem-dev libboost-thread-dev \
libbz2-dev libsqlite3-dev libssl-dev libreadline-dev libpng-dev libjpeg-dev \
libtiff-dev zlib1g-dev libx11-dev libgl1-mesa-dev libxrandr-dev libxxf86dga-dev \
libxcursor-dev libfreetype6-dev libvorbis-dev libeigen3-dev libopenal-dev libode-dev \
libbullet-dev libgtk2.0-dev libgtk-3-dev libatlas-base-dev gfortran git wget p7zip-full

Python関係

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

Intel MKL, Intel TBB, Intel MPI, Intel Distribution for Python

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
# exit
$ sudo wget https://apt.repos.intel.com/setup/intelproducts.list -O /etc/apt/sources.list.d/intelproducts.list
$ sudo apt update
$ sudo apt install -y intel-mkl-64bit-2019.4-070 intel-ipp-64bit-2019.4-070 intel-tbb-64bit-2019.6-070 intel-daal-64bit-2019.4-070 intel-mpi-2019.4-070 intelpython3

W: ディストリビューションが競合しています: https://apt.repos.intel.com/intelpython binary/ InRelease (binary/ を期待していたのに を取得しました)とでるがとりあえず無視する

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.15.5.tar.gz -O /tmp/cmake-3.15.5.tar.gz
$ cd /usr/local/src
$ sudo tar xvf /tmp/cmake-3.15.5.tar.gz
$ cd cmake-3.15.5
$ sudo su
# ./configure --system-curl --system-zlib
# make -j8
# make install

OpenCV

依存関係のインストール

$ sudo apt install -y openalpr openalpr-utils libopenalpr-dev openni2-utils libopenni2-dev \
primesense-nite-nonfree libpcl-dev libguava-java

ダウンロードする

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

ビルドする

$ cd opencv-4.1.2
$ 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/opencv_contrib/modules \
-D INSTALL_TESTS=ON \
-D INSTALL_C_EXAMPLES=ON \
-D INSTALL_PYTHON_EXAMPLES=ON \
-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 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 WITH_FFMPEG=ON \
-D OPENCV_GENERATE_PKGCONFIG=ON \
-D OPENCV_PC_FILE_NAME=opencv.pc \
-D BUILD_EXAMPLES=ON \
-D BUILD_opencv_cudaimgproc=ON ..
# 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

学習は次書きます