ロボット研究者の戯言

YOLOで物体検出

   

YOLOって何

物体検出の方法で有名なものにFaster R-CNNというものがあります.Faster R-CNNを使うと,確かにかなりの精度で物体検出を行うことができるのですが,ロボットで使うには少し計算量が多いかなというのが本音です.

一方,YOLOは1回の処理で物体の位置(バウンディングボックスの位置)とスコアが同時に求まるので,高速な検出が可能!精度は気になりますが,とりあえず学習済みネットワークを用いて試してみましょう.
(※Faster R-CNNも1つのネットワークに物体領域候補の検出と認識のネットワークが含まれているが,大きなネットワークの中でサブネットが2つに分かれている)

そうそう.余談ですがYOLOはYou Only Look Onceの頭文字を取ったもので,スラング英語のYOLO(You Only Live Once)をもじったっぽいです.多分.コンピュータ科学者のこういう風なユーモア,僕は好きです.

スポンサーリンク


環境

実行環境は以下です.

  • OS:Ubuntu 16.04
  • GPU: Nvidia GTX-970

この手のサンプルコードはcaffeをいじくり回して作ったものが多いですが,YOLOの公式サンプルコードは発案者が開発しているDarknetというフレームワークを使用しています.DarknetはC言語とCUDAをベースに作られているそうで,それだけ聞くとすごく速そうで期待が高まります.

インストール

いつもどおり公式サイトを見ながら,インストールしていきます.

YOLO公式ページ
https://pjreddie.com/darknet/yolo/

まずはDarknetをインストール

以下のように,git cloneしてmakeして終了です.

なお,Makefileの最初の4行に設定フラグが記述されているので,必要に応じてここを編集しましょう.私の場合はGPUを使用するので以下のように設定しました.

超簡単!と言いたいところですが,

error: expected a “;”

というエラーが大量に出てきて,止まりました.どうやらCUDA関連のエラーのようです.困った時はStack Overflowに聞いてみましょう.大体のエラーに関してはすぐ解決策が出てきます.今回のケースもすぐに見つかりました.

http://stackoverflow.com/questions/39287744/ubuntu-16-04-nvidia-toolkit-8-0-rc-darknet-compilation-error-expected-a

よくあることですが,パスの問題だったようです.~/.bashrcに以下を追加します.

保存して,sourceで設定を有効にします.

再度Makeすると無事コンパイルできました.

学習済みデータをダウンロード

以下のコマンドでYOLOの学習済みデータをダウンロードします.

スポンサーリンク


実行

では実際に物体検出を行ってみます.

結果はこのようになりました.

きちんと検出できていますね.

ただし,YOLOは粗いグリッドに沿って物体検出を行うためスケールの変化に弱い,と言った特性があるそうです.位置精度を重視する場合はこれまた最近話題のSSD(Single Shot MultiBox Detector)の方が良いかもしれませんね.

 - C(C++), Ubuntu, 機械学習 , , , , , , ,