Ubuntu
初心者
DeepLearning
Chainer
新人プログラマ応援

ubuntu環境構築(誰でもDeepLearningを使った物体検出ができるようになる)

全くのlinux初心者がubuntuの環境構築を行い、Deepを用いた物体検出(Faster-RCNN)をするまでの道のりをまとめました

非常に長い記事ですが、誰かの参考になれば幸いです。

自分の動作環境

GeForce GTX 560 Ti (OEM)
Ubuntu16.04.2LTS

以下の環境を構築

Anaconda3-4.3.17
CUDA8.0
cuDNN5.1
OpenCV3.1
Chainer1.24.0

WARNING!!!!

多くの日本語サイトでまず"pyenv"を入れるように指示されていますが、入れる必要はないです。
というか入れない方がいいです。

入れてみたところ、anacondaと衝突してエラー地獄でした。

正直これがこの記事で一番伝えたかったことです

各種インストール

apt-getを最新に

$ sudo apt-get update && sudo apt-get upgrade

gitのインストール

$ sudo apt-get install git

anacondaのインストール

$ bash ~/Downloads/Anaconda3-4.3.1-Linux-x86_64.sh

vimのインストール

$ sudo apt-get install vim

仮装環境を構築

py35という名前のpython3.5の仮想環境を構築

$ conda create -n py35 python=3.5

$ conda create -n python=**
で"my env"という名前のpython**の仮想環境が作れます
"my env"の部分は好きな仮想環境名でいいです

作成した仮想環境に入る

$ source activate py35

こうして自分の仮想環境を作り、そこで環境構築すると、どんなに汚しても他の人に迷惑がかからないので何かと便利です

ちなみに仮想環境からは

$ source deactivate

で抜けられます

opencvのインストール

$ conda install -c https://conda.anaconda.org/menpo opencv3

インストールできたかの確認

$ python -c "import cv2;print(cv2.__version__)"

これでopencvのバージョン名が出てきたらOKです

Nouveauドライバ無効化

この後CUDAを使うため、NVIDIAのドライバを入れますが、その時、ubuntuのデフォルトに入っているNouveauというドライバと衝突してしまうため、ここで無効化します。

$ sudo vim /etc/modprobe.d/blacklist-nouveau.conf

vimのエディタが開かれたら
iを押してインサートモードに入り、
以下を記入して

blacklist nouveau
options nouveau modeset=0

escを押してノーマルモードに戻り、:wqと打って保存して終了します
ここら辺のvimのコマンドについては、以下のサイトなどいろいろなところでまとめてあるので参照してください

http://qiita.com/hide/items/5bfe5b322872c61a6896

そして以下のコマンドを打って

$ sudo update-initramfs -u

再起動してください
画質がめちゃめちゃ悪くなるはずです

CUDAのインストール

自分のGPUの型番を確認して下記URLから、対応しているCUDAのバージョンを調べる

https://en.wikipedia.org/wiki/CUDA#GPUs_supported

NVIDIAのサイトからCUDAをダウンロード

https://developer.nvidia.com/cuda-downloads

選択は

Linux → x86_64 → Ubuntu → 16.04 → deb(local)

で基本的に問題ないです

以下のコマンドを実行してください
最初のコマンドのパッケージ名の部分はダウンロードされたものを参照して適宜変更してください

$ sudo dpkg -i cuda-repo-ubuntu1604-8-0-local-ga2_8.0.61-1_amd64.deb
$ sudo apt-get update
$ sudo apt-get install 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

インストールできたかの確認

$ nvcc -V

CUDAのバージョンが確認できればOKです

以下のコマンドを打つとnvidia-●●●-と数字が出てくるので、その数字を覚えてください

$ dpkg -l | grep nvidia  

自分の場合はnvidia-375-でした

覚えた番号を用いて以下のコマンドを打ってください
番号の部分は各自、自分の番号に変更してください

$ sudo modprobe nvidia-375-uvm
$ lsmod | grep nvidia

最後のコマンドを打った後、出てきた文字列に

nvidia_uvm ●●
nvidia ●●
drm ●●

が出てくればOKです
●●の部分は各自の環境に依存する数字です

ubuntuを再起動すると画質が復活します

cuDNNのインストール

以下のURLから登録してcuDNNをダウンロードします

https://developer.nvidia.com/cudnn
自分のCUDAのバージョンにあった最新のcuDNNをダウンロードしてください

ダウンロード完了次第、以下のコマンドを入力してください

$ cd Downloads/
$ tar -zxf cudnn-8.0-linux-x64-v6.0.tgz
$ sudo cp -a cuda/lib64/* /usr/local/cuda/lib64/
$ sudo cp -a cuda/include/* /usr/local/cuda/include/

chainerのインストール

以下のコマンドでchainerがインストールできます。

$ pip install chainer=="1.24.0"

pip install chainerでもchainer自体のインストールは可能ですが、それだと最新のver2.0.1(2017/7/10現在)がインストールされてしまい、この後のfaster-RCNNが回せないです
今の所、世に落ちてるchainerを使ったコードの多くはまだchainerのver1を使っているので、こちらをインストールした方がいいと思います

インストールできたか確認

$ python -c "import chainer"

で何も起こられなければ無事chainerがインストールされてます。
また

$ python -c "import cupy.cudnn"

と打って何も起こられなければ無事cudnnも入ってます。

試しに物体検出をやってみよう

せっかくなのでディープラーニングを用いた物体検出アルゴリズムを試してみます

以下のコマンドを入力してgitからトレーニング済みのモデルをダウンロードしてください

$ git clone https://github.com/mitmul/chainer-faster-rcnn  
$ cd chainer-faster-rcnn  
$ python setup.py build_ext -i
$ if [ ! -d data ]; then mkdir data; fi; cd data
$ wget https://dl.dropboxusercontent.com/u/2498135/faster-rcnn/VGG16_faster_rcnn_final.model?dl=1 -o data/VGG16_faster_rcnn_final.model
$ cd ..

faster-RCNNの実行!!

CPUを使う場合

$ python forward.py --img_fn <入力画像のパス> --out_fn <出力画像のパス> --gpu -1

GPUを使う場合

$ python forward.py --img_fn IMG_1620.jpg --out_fn result1.jpg --gpu 0

生半可なgpuではout of memoryとなって落ちます

例)入力画像(IMG_1620.jpg)がchainer-faster-rcnnディレクトリ内に保存されている場合

$ python forward.py --img_fn IMG_1620.jpg --out_fn result.jpg --gpu -1

result.jpgが生成されます。

お疲れ様でした。

今回は以下のURLを参考にさせて頂きました

http://shibafu3.hatenablog.com/entry/2016/11/03/122850

ほぼ同じ流れですが、pyenvを入れてはいけないところが一番重要な変更点です