ubuntu16.04に CUDA cuDNN YOLOv3_darknetのインストール

#目的
YOLOv3を使ってobject detectionをする。
前の記事で学習データの作り方と学習方法を書きましたが、この記事ではYOLOv3のインストール方法を書いていきます。
yolov3はROSにも対応していて、ROS上でも動かすことができるので、将来的にROS上で使うことも検討してdarknet_rosもインストールします。これはまた別の記事で。

ただopencv関連でめちゃくちゃ手こずったので、エラー奮闘記を後半に。

#環境
ubunu16.04(ubuntu18.04でも確認済み）
ROS kinetic
Geforce 1080ti
Nvidia driver 384.

#CUDAのインストール
今回YOLOはGPUを使ってやっていきたいので、CUDAとcuDNNもインストールします。
Nvidia driverのバージョンが384系なのでCUDA9.0をインストールします。
ここの対応はめちゃめちゃ大事です。間違えるとログインループに陥ります。

参考URL
https://qiita.com/min9813/items/90a1ef62b3dc37d0cc33
https://qiita.com/JeJeNeNo/items/b30597918db3781e20cf

CUDA Toolkit ダウンロードサイトからCUDA9.0 debを選択download(Network)
downloadしたdirで

```
sudo dpkg -i cuda-repo-ubuntu1604_9.0.176-1_amd64.deb
sudo apt-key adv --fetch-keys http://developer.download.nvidia.com/compute/cuda/repos/ubuntu1604/x86_64/7fa2af80.pub
sudo apt-get update
sudo apt-get install cuda-toolkit-9-0
```

**ここ大事。最後の部分は、sudo apt-get install cuda-9-0やcudaとすると、同梱されているnvidiaドライバーもインストールされるので注意。**

そしてbashrcを編集して末尾にpathを加えておきます。

```
nano ~/.bashrc
```
```	
## CUDA and cuDNN paths
export PATH=/usr/local/cuda-9.0/bin${PATH:+:${PATH}}
export LD_LIBRARY_PATH=/usr/local/cuda-9.0/lib64${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}
```

反映して

```
source ~/.bashrc
```

これらのコマンドでCUDAの情報が現れればokです。

```
nvcc -V　　　	-->CUDAの情報が現れればOK
echo $PATH             # 出力に"/usr/local/cuda-9.0/bin"が含まれているか？
echo $LD_LIBRARY_PATH  # 出力に"/usr/local/cuda-9.0/lib64"が含まれているか？
which nvcc             # 出力が"/usr/local/cuda-9.0/bin/nvcc"になっているか？
nvidia-smi             # nvidiaのGPUの情報が表示されているか？
```


# cuDNNのインストール

cuDNNダウンロードサイトから自分のCUDAのバージョンに合ったcuDNNをダウンロードしてきます。
今回は7.1.4.18をダウンロードしました。
「Runtime Library」と「Developer Library」「Code Samples」の3つをダウンロード
ダウンロードしたフォルダに移動し下記を実行

```
sudo dpkg -i libcudnn7-dev_7.1.4.18-1+cuda9.0_amd64.deb 
sudo dpkg -i libcudnn7-doc_7.1.4.18-1+cuda9.0_amd64.deb 
sudo dpkg -i libcudnn7_7.1.4.18-1+cuda9.0_amd64.deb 
```



#darknetのインストール
参考URL
https://qiita.com/k65c1/items/b80fd2af67a9880a0fd5
https://qiita.com/harmegiddo/items/c3db5fd567fa4c6cc9fb

```
cd workspace/
git clone https://github.com/pjreddie/darknet.git
cd darknet
nano Makefile
```

GPUを使うのでMakefileを修正します。

```
GPU=1
cuDNN=1
OPENCV=1 
```

そしてコンパイル

```
make
```

これでdarknetのディレクトリで./darknet を実行してエラーなしで出力されればokです。

```
$ ./darknet 
usage: ./darknet 
```

#サンプル画像

darknet直下のフォルダにweightをダウンロードして実行すると、色々な％とdetectされた犬が出力されます。

```
wget https://pjreddie.com/media/files/yolov3.weights
./darknet detect cfg/yolov3.cfg yolov3.weights data/dog.jpg
```

#webカメラ
同じくdarknet直下で以下のコマンドを実行

```
./darknet detector demo cfg/coco.data cfg/yolov3.cfg yolov3.weights
```








#エラー奮闘記

最初、犬の検出結果のpredictionが自動で表示されないかつ、webカメラを動かそうとするとopencvが見つからないというエラー発生

- 　/pkgconfig の中に　opencv.pcがなく作成したけどうまく行かず
- 　/bash.bashrcの中にPATHを指定するところも見つからなかったどうなってるの？

自分でも意味不明の謎が…


参考にさせていただきました:bow:
https://qiita.com/MuAuan/items/8190b5f25e8a6f4491c1



#結局
結局opencv.confをいじったり色々してみたけれど、opencvをアンインストールして再インストールしました..

#opencvのアンインストール

opencvをインストールしたディレクトリの中で

```
cd opencv_ws/opencv/build
make clear
sudo make uninstall
```
そして、フォルダごとごみばこへ
さらに、usr/local　のlibとincludeにある残骸を全部削除

実はこの方法で合っているのか分からないのですが、今のところ問題ないです。


#opencvの再インストール
参考にさせていただきました:bow:
https://www.trifields.jp/how-to-install-opencv-on-ubuntu-2742
https://qiita.com/schwalbe1996/items/cfa9fde7ea2b825e4e6b
https://qiita.com/nakasuke_/items/51664807bdd7794db0da
https://github.com/intel/caffe/wiki/Ubuntu-16.04-or-15.10-OpenCV-3.1-Installation-Guide

関連パッケージ諸々をインストール

```
sudo apt-get install cmake libeigen3-dev libgtk-3-dev qt5-default freeglut3-dev \
libvtk6-qt-dev libtbb-dev ffmpeg libdc1394-22-dev libavcodec-dev libavformat-dev \
libswscale-dev libjpeg-dev libjasper-dev libpng++-dev libtiff5-dev \
libopenexr-dev libwebp-dev libhdf5-dev libpython3.5-dev python3-numpy \
python3-scipy python3-matplotlib libopenblas-dev liblapacke-dev
```

自分のworkspaceにディレクトリ作成＆今回はgithubからバージョン指定してダウンロード

```
mkdir opencv3.3 && cd opencv3.3
wget https://github.com/opencv/opencv/archive/3.3.0.tar.gz
tar xvf 3.3.0.tar.gz
cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local -D WITH_TBB=ON -D WITH_V4L=ON -D WITH_QT=ON -D WITH_OPENGL=ON ..
make -j8
sudo make install
```

しかしここでエラー
こちらのissueの通りに、以下のコマンドで解決
https://github.com/pjreddie/darknet/issues/382

```
sudo /bin/bash -c 'echo "/usr/local/lib" > /etc/ld.so.conf.d/opencv.conf'`
sudo ldconfig`
```

そしてもう一度

```
sudo make install
```

opencvあるのになぜか認識してくれず、色々試して…
ここまでが大変だったよぉ



#おわりに
まぁ色々エラーが起きて一筋縄では行きませんでした。
結局opencvを再インストールしたわけですが、その方法も意外と分からず…
でも今は問題なく動いています、