Yolo v3をCudaとOpenCVで動かす

#Yolo v3をCudaとOpenCVで動かす

#環境
Server: Supermicro 1029U-TR4
GPU: NVIDIA TESLA V100
CPU: Xeon Gold 5117M x2
Memory: 32GB x4
Storage:800GB SSD
USB Camera：Logicool C270n

#大まかな手順
1, Ubuntu 18.04をクリーンインストール
2, Yolo v3をインストールして単体で動かす
3, CudaをインストールしてMake
4, OpenCVのライブラリをインストールしてMake

---
#1, Ubuntu 18.04をクリーンインストール

1)update 色々
インストーラでは特別変わった設定はなし。
インストール後アップデートとgit,build-esentialを追加しておく
\$sudo apt-get update
\$sudo apt-get upgrade
\$sudo apt-get install git
\$sudo apt-get install build-essential

2)SSHを有効にしておく
\$sudo apt-get install ssh
\$sudo vi /etc/ssh/sshd_config
*PermitRootLoginをprohibit-passwordから***no***に変更*

---
#2, Yolo v3をインストールして単体で動かす
\$git clone https\://github.com/pjreddie/darknet
\$cd darknet
\$make　

\$wget https\://pjreddie.com/media/files/yolov3.weights (20分くらいかかるかも。)
\$./darknet detect cfg/yolov3.cfg yolov3.weights data/dog.jpg
(/data/以下を別のjpgにすると別の写真で実行する。鳥とかキリンとか。)
結果は下記のように出る。
`*data/dog.jpg: Predicted in 20.787187 seconds.
dog: 100%
truck: 92%
bicycle: 99%*`

結果の出力画像はdarknetフォルダにpredictions.jpgという名前で保存される。

![dog.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478729/b3885166-ec79-f1fa-67a0-12ff6773acf8.png)
有名なやつ。

---
#3, CudaをインストールしてMake
1)nouveauを使用しないようにするため、blacklist-nouveau.confを作る
\$sudo vi /etc/modprobe.d/blacklist-nouveau.conf
*blacklist nouveau
options nouveau modeset=0*

2)設定を反映させて再起動
\$sudo update-initramfs -u 
\$reboot

3)
再起動後Ctrl+Alt+F3を押してコンソールにログイン
それか、SSHで入ってコピペした方が良いかも。

4)NVIDIAドライバーのインストール
http://download.nvidia.com 参照
\$wget http\://download.nvidia.com/XFree86/Linux-x86_64/435.17/NVIDIA-Linux-x86_64-435.17.run
\$chmod a+x NVIDIA-Linux-x86_64-435.17.run
\$sudo ./NVIDIA-Linux-x86_64-435.17.run --no-opengl-files
インストーラが起動するのでDefaultで進む。

5)CUDAインストール
https://developer.nvidia.com 
High Performanice ComputingからCuda tool kitの項目を参照
\$wget http\://developer.download.nvidia.com/compute/cuda/10.1/Prod/local_installers/cuda_10.1.243_418.87.00_linux.run
\$chmod a+x cuda_10.1.243_418.87.00_linux.run
\$sudo sh cuda_10.1.243_418.87.00_linux.run --silent --no-opengl-libs --toolkit

6)環境変数の設定
 *始めにバージョンとパス確認=>/usr/local/cudaが有るかどうか確認しておく。*
\$echo 'export PATH=/usr/local/cuda/bin:\$PATH' >> ~/.bashrc
\$echo 'export LD_LIBRARY_PATH=/usr/local/cuda/lib64:\$LD_LIBRARY_PATH' >> ~/.bashrc
\$source ~/.bashrc # CUDAのパスが書き込まれた~/.bashrcを読み込む。

PATHの確認（それぞれの結果に/usr/local/cudaが含まれていればOK）
\$echo \$PATH
\$echo \$LD_LIBRARY_PATH 
\$which nvcc  

7)GPUの確認
\$nvidia-smi
GPUがリストされればOK

8)CUDAでYolo v3をmake
\$cd darknet
\$vi Makefile(GPU=0を1にする。)
GPU=***1***
CUDNN=0
OPENCV=0
OPENMP=0
DEBUG=0
9)makeして再度試すとGPUを使用して検知が行われる
\$make
\$./darknet detect cfg/yolov3.cfg yolov3.weights data/dog.jpg
GPU無しでも動かして比較するといかにGPUが有効かわかる。
\$./darknet -nogpu detect cfg/yolov3.cfg yolov3.weights data/dog.jpg

---

#4, OpenCVのライブラリをインストールしてMake

OpenCVを正しくインストールすると結構ハマります。
取り急ぎ動かしたい場合はlibopencv-devだけでもOK。

\$sudo apt-get install libopencv-dev 
\$cd darknet
\$vi Makefile (OPENCV=0も1にする。)
GPU=***1***
CUDNN=0
OPENCV=***1***
OPENMP=0
DEBUG=0
\$make

\$./darknet detector demo cfg/coco.data cfg/yolov3.cfg yolov3.weights

すると別ウインドが出て、リアルタイムの物体検知が始まります。
![detect.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478729/0f881719-f493-012f-93e5-3a7577e9c427.png)


- - - - - - -
#補足　（OpenCVを完全にインストールしたい場合）
1,OpenCVのインストール準備
\$sudo add-apt-repository 'deb http://security.ubuntu.com/ubuntu xenial-security main' 
\$sudo apt-get update
\$sudo apt-get upgrade
\$sudo apt-get -y install checkinstall cmake unzip pkg-config yasm
\$sudo apt-get -y install git gfortran python3-dev
\$sudo apt-get -y install libjpeg8-dev libjasper-dev libpng-dev libavcodec-dev libavformat-dev \$libswscale-dev libdc1394-22-dev libxine2-dev libv4l-dev
\$sudo apt-get -y install libjpeg-dev libpng-dev libtiff-dev libtbb-dev
\$sudo apt-get -y install libavcodec-dev libavformat-dev libswscale-dev libv4l-dev libatlas-\$base-dev libxvidcore-dev libx264-dev libgtk-3-dev

2,OpenCVのコピー
\$cd /usr/local/src
\$git clone https://github.com/opencv/opencv.git
\$git clone https://github.com/opencv/opencv_contrib.git
\$cd opencv_contrib
\$git checkout -b 3.4.3 refs/tags/3.4.3
\$cd ../opencv/
\$git checkout -b 3.4.3 refs/tags/3.4.3

3,OpenCVのインストール
\$mkdir build
\$cd build
\$cmake -D CMAKE_BUILD_TYPE=Release -D CMAKE_INSTALL_PREFIX=/usr/local -D WITH_TBB=ON -D OPENCV_EXTRA_MODULES_PATH=../../opencv_contrib/modules ..
\$make -j7
\$make install
\$echo /usr/local/lib > /etc/ld.so.conf.d/opencv.conf
\$ldconfig -v

4,上記手順 4, OpenCVのライブラリをインストールしてMake　へ。
（あれ？これだけでよくね？
という事に後で気づきました。）