Contents
イントロ
あらま、今日もComputer visionネタで失礼します。今日はDeep Learning によるDetection手法でメジャーなYOLOをビルドしてUSBカメラで動かしてみたので、メモしておきます。
環境
OS: Linux
Distribution: Ubuntu18.04
GPU: Nvidia Geforce GTX 1060
USB camera: Logicool HD720p
YOLOとは
You Only Look Onceの略で、DeepLearning による物体検出手法のメジャーなアルゴリズムの一つ。性能は結構良い上、動作が早いことが特徴。アルゴリズムの詳細は原論文をご参考に。ざっくり理解したい人にはこちらのサイトの説明が分かりやすかったです。
CPUでの実行
オリジナルのサイト(https://pjreddie.com/darknet/yolo/)でCPUでの実行までは簡単に行きました。何かのアルゴリズムを実行しようとするときは、大抵ビルドで引っかかるのに、YOLOは依存関係がほぼ何もないのでなんのトラブルもありませんでした。ビルドもCMakeを使わずMakeのみで書かれています。すごい!
一応手順を書きますが、オリジナルサイトのままです。
git clone https://github.com/pjreddie/darknet
cd darknet
make
wget https://pjreddie.com/media/files/yolov3.weights
./darknet detect cfg/yolov3.cfg yolov3.weights data/dog.jpg
eog predictions.jpg
上記コマンドだけで結果の表示までできました。
GPUでの実行
ここでちょっとだけ詰まったので一応今回メモを書くことにしました。
Nvidiaドライバのインストール
今までUbuntuのaptからインストールしたもの(nvidia-driver 390)で事足りていたのですが、一応Nvidiaのサイトで検索すると、私の設定に最適なものはversion 440と出て、aptでインストールしようとするとエラーがでました。aptのリポジトリを追加しないといけないみたいです。具体的には下記を実行すれば大丈夫。
sudo add-apt-repository ppa:graphics-drivers/ppa
sudo apt update
sudo apt install nvidia-driver-440
reboot
リブート後、nvidia-smiでGPU情報が出ればOK.
CudaToolKitのインストール
driverも最新にしたので、Cuda Toolkitも最新にしておきましょう。Nvidiaのサイトから自分に合ったCudaToolKitを選び、 dev(local)をダウンロードします。私の場合はバージョン10.2だったので、こちらのコマンドでした。.debパッケージ名は適宜読み替えて下さい。
sudo dpkg -i cuda-repo-ubuntu1804-10-2-local-10.2.89-440.33.01_1.0-1_amd64.deb
sudo apt update
sudo apt install cuda cuda-drivers
reboot
その後、~/.bashrc に以下を追記します。
export PATH="/usr/local/cuda/bin:$PATH"
export LD_LIBRARY_PATH="/usr/local/cuda/lib64:$LD_LIBRARY_PATH"
CUDNNのインストール
Nvidiaのサイトで登録して、以下2つをダウンロードします。
cuDNN Runtime Library for Ubuntu18.04 (Deb)
cuDNN Developer Library for Ubuntu18.04 (Deb)
その後下記コマンドでインストールします。パッケージ名は適宜読み替えて下さい。
sudo dpkg -i libcudnn7_7.6.5.32-1+cuda10.2_amd64.deb
sudo dpkg -i libcudnn7-dev_7.6.5.32-1+cuda10.2_amd64.deb
YOLOv3をCUDA付きでビルド
こちらも上記CUDA周りが終わっていれば、YOLOの本家サイト通りで可能です。具体的には、darknet/Makefileを開き、以下のように編集します。OpenCVはインストール済みと仮定します。
GPU=1
CUDNN=1
OPENCV=1
OPENMP=1
その後、make すると、ちゃんとビルド出来るはずです。
YOLOv3をCUDAで実行
これでこのまま、
./darknet detect cfg/yolov3.cfg yolov3.weights data/dog.jpg
を再度実行すると、今度はCUDA版で実行してくれるはずです。しかし、今回個々で下記エラーが出ました。
57 CUDA Error: out of memory
darknet: ./src/cuda.c:36: check_error: Assertion `0' failed.
原因は表示どおりで、私のGPUではメモリーが不足するようです。対策はバッチサイズを減らすことで、 cfg/yolov3.cfg を開いて、6行目を下記のように変更します。
batch=32
これで再度上記コマンドを叩くとちゃんとdetectできます。
CUDA版をUSBカメラで実行
USB版カメラをPCに繋いで、下記コマンドを打てば実行できます。
./darknet detector demo cfg/coco.data cfg/yolov3.cfg yolov3.weights
実行結果がこちら。何か変な音がなりますがなぜでしょうね。
終わりに
なんでまたこんなもの上げ始めたの?って疑問には近日中にお答えいたします〜。ではまた近いうちに!更新頻度上げてくつもりですから、から!