yolov3の環境作成を１からやる


# 概要
．参考文献１のような素晴らしいチュートリアルを見つけたけれど，環境構築が辛いのでまとめます．(ライブラリ/パッケージ不足が主ですが)


# 環境
* OS: Ubuntu 18.04.4 LTS x86_64(クリーンインストール)
* Kernel: 5.3.0-51-generic 
* CPU: AMD Ryzen 7 1700
* GPU: NVIDIA GeForce GTX 1060 6GB

#インストール
この通りに入れないと修行がまっています(した)．
## 落とす順番
1.大量のパッケージ/ライブラリ
2.GPUのドライバ
3.cuda
4.cudnn
5.opencv
6.darknet

## 大量のパッケージ/ライブラリ
####1.有名どころと滅多に聞かない（主観）ものをとりあえずインストールします．

```bash:有名どころ
sudo apt install git python3-pip python3-dev wget cmake make build-essential ffmpeg
```

```bash:縁の下の力持ち
sudo apt install zlib1g-dev libcurl4-gnutls-dev build-essential build-dep  \ 
libopencv-dev openalpr openalpr-utils libopenalpr-dev openni2-utils  \
libopenni2-dev libpcl-dev libguava-java libjasper-dev libleveldb-dev  \
liblmdb-dev libnccl-dev libatlas-base-dev libopenblas-dev liblapack-dev  \
libtbb-dev libavcodec-dev libavformat-dev libswscale-dev libavcodec-dev  \
libavformat-dev libswscale-dev libv4l-dev libatlas-base-dev libxvidcore-dev \
libx264-dev libgtk-3-dev libopenexr-dev libwebp-dev libswscale-dev  \
libjpeg-dev libjasper-dev libpng++-dev libavcodec-dev libavformat-dev  \
libxvidcore-dev libx264-dev libatlas-base-dev gfortran python3-numpy
```

```bash:掃除
sudo apt autoremove
sudo apt update
```

## GPUのドライバ
####1.[Nvidia公式](https://www.nvidia.co.jp/Download/index.aspx?lang=jp "Nvidia")から，自分のGPUにあった最新のドライバを落としてきます．

```bash:例
mkdir ~/nvidia_driver && cd ~/nvidia_driver
wget http://jp.download.nvidia.com/XFree86/Linux-x86_64/440.xx/NVIDIA-Linux-x86_64-xxx.xx.run
```

####2.nouveauの息の根を止めます．
やり方は様々あるようですが，私はこれでうまく行きました．

```txt:/etc/modprobe.d/blacklist-nouveau.conf
blacklist nouveau
blacklist lbm-nouveau
```

```txt:/etc/modprobe.d/nouveau-kms.conf
options nouveau modeset=0
```

```bash:shell
sudo update-initramfs -u
sudo reboot
```
再起動すると画面が少々ラリるようですが，気にしないでください．

####3.ドライバを入れます
本体を実行すると英文で選択を迫られますが，それほど難しくないので読みながらやってください．全部左選択で十分使えます．

```bash:shell
cd nvidia_driver
sudo chmod +x NVIDIA-Linux-x86_64-xxx.xx.run
sudo bash ./NVIDIA-Linux-x86_64-xxx.xx.run
```
これで```nvidia-smi```が使えるようになったはずです．

```bash:shell
$ nvidia-smi
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 440.82       Driver Version: 440.82       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 GTX 106...  Off  | 00000000:0C:00.0 Off |                  N/A |
| 66%   73C    P2   122W / 120W |   2491MiB /  6070MiB |     98%      Default |
+-------------------------------+----------------------+----------------------+
                                                                               
+-----------------------------------------------------------------------------+
| Processes:                                                       GPU Memory |
|  GPU       PID   Type   Process name                             Usage      |
|=============================================================================|
|    0     15327      C   ./darknet                                   2481MiB |
+-----------------------------------------------------------------------------+
```

``nvidia-smi``が使えない時は，再起動するかもう一度やってみてください．

## cudaのインストール

最新信者の方も一定数いらっしゃると思いますが，tensorflow-gpuをcuda-10.2で使うにはビルド修行をするしかなさそうなので(2020/5/17),cuda-10.0を入れます．

####1.[Nvidia公式](https://developer.nvidia.com/cuda-10.0-download-archive "Nvidia")で，自分の環境に合わせてポチポチしていき，Installer Typeまで選び切ると公式のやり方が出てくるのでそれを横目に見つつ，右側に表示されているであろう```Download(1.6GB)```をポチって```~/cuda_build/```に保存してください．

```bash:例
mkdir ~/cuda_build && cd ~/cuda_build
wget https://developer.nvidia.com/compute/cuda/10.0/Prod/local_installers/cuda-repo-ubuntu1804-10-0-local-10.0.xxx-xxx.xx_x.x-x_amd64
```

####2.先ほど横目に見た公式のやり方をほとんどそのままターミナルに貼り付けます．

```bash:例
sudo dpkg -i cuda-repo-ubuntu1804-10-0-local-10.0.xxx-xxx.xx_x.x-x_amd64
sudo apt-key add /var/cuda-repo-<version>/7fa2af80.pub
sudo apt-get update
sudo apt-get install cuda
```

####3.パスを通します

```bash:shell
echo 'export PATH=/usr/local/cuda/bin:$PATH' >> ~/.bashrc
echo 'export LD_LIBRARY_PATH=/usr/local/cuda/lib64:$PATH' >> ~/.bashrc
source ~/.bashrc
```

これで```nvcc```が使えるようになったはずです．

```bash:shell
$ nvcc -V
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2018 NVIDIA Corporation
Built on Sat_Aug_25_21:08:01_CDT_2018
Cuda compilation tools, release 10.0, V10.0.130
```

使えない場合パスの設定が怪しいので，```.bashrc```の該当箇所を以下のようにしてみてください．

```bash:.bashrc(旧)
export PATH=/usr/local/cuda/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/cuda/lib64:$PATH
```

```bash:.bashrc(新)
export PATH=/usr/local/cuda-10.0/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/cuda-10/lib64:$PATH
```
## cudnnのインストール
あんまり修行じゃないです．

####1.[Nvidia公式](https://developer.nvidia.com/rdp/cudnn-download "Nvidia")に行きます．アカウントを持ってなければ作ってください．ここで自分の使っているバージョンに合わせたcudnn(今回はcudaが10.0なのでcudnn7.6.5)のライブラリたち(以下)を```~/cudnn_build/```に保存します．

```bash:Libraries
cuDNN Runtime Library for Ubuntu18.04 (Deb)
cuDNN Developer Library for Ubuntu18.04 (Deb)
cuDNN Code Samples and User Guide for Ubuntu18.04 (Deb)
```

####2.dpkgを使ってインストールしていきます．順番通りにやらないとかなり苦行が待っているそうです．

```bash:shell
cd ~/cudnn_build
#本体
sudo dpkg -i libcudnn7_7.6.5.32-1+cuda10.0_amd64.deb
#発展
sudo dpkg -i libcudnn7-dev_7.6.5.32-1+cuda10.0_amd64.deb
#文書
sudo dpkg -i libcudnn7-doc_7.6.5.32-1+cuda10.0_amd64.deb
```

インストールが成功したか検証することは少々大変なので，darknetのコンパイルで検証してください(無責任)．

## opencvのインストール
元祖モンスターです．これまでのビルドでかなり心をやられたので，すごく簡単なopencvを作ります．(ダウンロードしたcontribを使いません)

####1.[opencv公式](https://github.com/opencv/opencv "opencv")から，程よいバージョンを見繕ってwgetでインストールします．今回はなんとなく```opencv-3.4.7```を使います．

```bash:shell
mkdir opencv_build && cd opencv_build
wget -O opencv.zip https://github.com/opencv/opencv/archive/3.4.7.zip
wget -O opencv_contrib.zip https://github.com/opencv/opencv_contrib/archive/3.4.7.zip
```

####2.解凍してビルド用のディレクトリを作ります．

```bash:shell
unzip opencv.zip
unzip opencv_contrib.zip
cd opencv-3.4.7
mkdir build && cd build
```

####3.cmakeしてmakeします．ものすごくシンプルですが，完全体を目指していただいても構いません．ただ，``` ENABLE_PRECOMPILED_HEADERS=OFF```を設定しておかないと失敗します．私の場合は行列計算系のライブラリ不足で怒られました．

```bash:shell
cmake -D CMAKE_BUILD_TYPE=Release -D CMAKE_INSTALL_PREFIX=/usr/local -D ENABLE_PRECOMPILED_HEADERS=OFF ..
make -j16
sudo make install
sudo ldconfig
```
これもインストールが成功したか検証することは少々大変なので，darknetのコンパイルで検証してください(無責任)


## darknetのインストール
これ以外のインストールに比べればすごく簡単です．

####1.[github](https://github.com/pjreddie/darknet.git "darknet")から引っ張ってきます．

```bash:shell
git clone https://github.com/pjreddie/darknet.git
cd darknet
```

####2.```Makefile```の先頭部分を編集してmakeします.

```text:Makefile(旧)
GPU=0
CUDNN=0
OPENCV=0
OPENMP=0
DEBUG=0
```

```text:Makefile(新)
GPU=1
CUDNN=1
OPENCV=1
OPENMP=0
DEBUG=0
```

```bash:shell
make -j16
```

これでうまくいったはずです．楽しい顔検出機の自作をしましょう．

##その他
もし，``hoge.h``がないことを理由にコンパイルエラーになった場合，何も考えずに``sudo apt install libhoge-dev``等で無理やりインストールしてみてください．

## 参考文献

この記事は以下の情報を参考にして執筆しました．

- 1.[YOLO v3による顔検出](https://qiita.com/ha9kberry/items/1bc113cfcd9892a9ddbd)
- 2.[GPUドライバについて](http://nc30mtd.oops.jp/blog/2016/09/titan-xcuda.html)
- 3.[シェルスクリプトの改行](https://qiita.com/kitsuyui/items/35c15b2b46a30ed82d47)