Yolov3をUbuntuで使う
はじめに
物体認識モデルの一つであるYolov3をUbuntu 18.04にインストールする。
物体認識モデルのYolo(You only look once:一度しか見ない)のVersion3で、 Yoloネットワークを実装したものがdarknetである。
環境
- Intel(R) Core(TM) i9-9900K CPU @ 3.60GHz
- 64GB RAM
- GeForce RTX 2080 Ti 11GB
- Ubuntu 18.04 LTS
インストールの流れ
- NVIDIA Graphic Driverのインストール(GPUがある場合)
- CUDAのインストール(GPUがある場合)
- cuDNNのインストール(GPUがある場合)
- OpenCVのインストール
- 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.cfg
のsubdivisions
を大きな数にしてみる
追記 2019-11-22
darknetの更に活発なforkを見つけたのでそちらも使ってみます
コードの更新が数時間おきにあって活発
ビルドはかんたん
$ 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%
次