Macで物体検知アルゴリズムYOLO V3を動かす

投稿者: | 2018-05-18

物体検知(object detection)アルゴリズムとして有名なYOLO(You Only Look Once)のバージョンが上がりYOLO V3がリリースされました。YOLO V2も高速/高精度でしたがさらなる高速化、高精度化がなされています。

MacでYOLO V3を使って

  • 画像の物体検知
  • 動画の物体検知
  • 内蔵カメラを使ったリアルタイム物体検知

を行う機会があったのでその手順を紹介します。

実行環境

以下の環境で動作をさせています。

  • Mac: MacBook Air 2013 Mid
  • OS: High Sierra
  • Anaconda 5.0.1

GPUは搭載されていないのでCPUのみでYOLO V3を動かします。

Python環境の構築

まずYOLO V3用の環境を作成します。環境管理コマンドcondaを使って

$ conda create -n yolo_v3 python=3.6 pip
$ source activate yolo_v3

とPython仮想環境を作成します。

次に必要なパッケージ群をインストールします。

(yolo_v3) $ conda install pandas opencv
(yolo_v3) $ conda install pytorch torchvision -c pytorch
(yolo_v3) $ pip install matplotlib cython

Macだとmatplotlibのバックエンドに問題がありimport時に

RuntimeError: Python is not installed as a framework. 
The Mac OS X backend will not be able to function correctly 
if Python is not installed as a framework. See the Python 
documentation for more information on installing Python 
as a framework on Mac OS X. Please either reinstall 
Python as a framework, or try one of the other backends. 
If you are using (Ana)Conda please install python.app and 
replace the use of 'python' with 'pythonw'. See 'Working 
with Matplotlib on OSX' in the Matplotlib FAQ for more information.

というエラーが出るので

(yolo_v3) $ cd /anaconda/envs/yolo_v3/lib/python3.6/site-packages/matplotlib/mpl-data/
(yolo_v3) $ vi matplotlibrc

としてmatplotlibrcを開き、

backend : macosx

という行を探し

backend : Tkagg

に変更し保存しておきます。

YOLO V3の設定

YOLO V3の公式サイトのコードで物体検知をできますが、PyTorchを使った実装「A PyTorch implementation of a YOLO v3 Object Detector」が公開されており

  • 公式コードから不要なコードが削除されておりシンプル
  • ドキュメントが丁寧
  • 動画の物体検知、内蔵カメラを使ったリアルタイム物体検知のスクリプトも提供

と扱いやすい実装になっているので、今回はこちらを利用しました。

まず、

(yolo_v3) $ git clone https://github.com/ayooshkathuria/pytorch-yolo-v3.git

とスクリプトを落とします。公式サイトにYOLO V3の学習済みのモデルが公開されているのでダウンロードします。

(yolo_v3) $ cd pytorch-yolo-v3
(yolo_v3) $ wget https://pjreddie.com/media/files/yolov3.weights

画像の物体検知

imgsディレクトリに物体検知をしたい画像を入れ以下を実行します。

(yolo_v3) $ python detect.py --images imgs --det det

物体検知した結果はdetディレクトリに保存されています。実行サマリをみると

SUMMARY
----------------------------------------------------------
Task                     : Time Taken (in seconds)

Reading addresses        : 0.000
Loading batch            : 1.609
Detection (11 images)    : 12.107
Output Processing        : 0.000
Drawing Boxes            : 0.139
Average time_per_img     : 1.260
----------------------------------------------------------

と大体、1画像1秒ちょっとで物体検知をできています。

imgsフォルダによく物体検知の例として使われる犬と自転車が写った画像

が入っており、物体検知した結果を見ると

と「dog」「bicycle」と「truck」1)「car」の方が適切だと思いますを検知できていますね。

動画の物体検知

静止画だけでなく動画の物体検知もできます。著作権フリー動画を集めたPexels Videosから「Playing Tennis At The Beach」という動画をダウンロードし、解像度が大きいのでiMovieで540pに変更し「sample.mp4」として保存します。

(yolo_v3) $ python video_demo.py --video sample.mp4

と実行すると物体検知した結果が動画再生されます。

人が確かに「person」と認識されているのと二人の男性が打ち合うボールが「sports ball」2)ボールのような小さい物体の認識は難しく、フレームによっては認識されなかったり「kite」「bird」などと誤認識されることもあります。と認識されているのがわかります。ただ、認識速度は0.7フレーム/秒くらいなのでかなりのスロー再生になります。精度を犠牲にしてもよければ

(yolo_v3) $ python video_demo.py --video sample.mp4 --reso 64

と入力解像度を下げる(デフォルト解像度は416)と8フレーム/秒くらいまで高速化できます。

内蔵カメラを使ったリアルタイム物体検知

内蔵カメラを使ったリアルタイム物体検知用のスクリプトも用意されており

(yolo_v3) $ python cam_demo.py

とすると内蔵カメラの映像をリアルタイムに物体検知した結果が表示されます。自分の机を写してみたところ

とちゃんとモニタ2つとキーボード/マウス、本が正しく認識されています。認識速度は2.7フレーム/秒ぐらいで多少カクつきますが、やはり目の前にある物を検知した結果を見ると楽しいですし、デモでやるとかなりウケがいいですね。

参考情報

脚注   [ + ]

1. 「car」の方が適切だと思います
2. ボールのような小さい物体の認識は難しく、フレームによっては認識されなかったり「kite」「bird」などと誤認識されることもあります。

スポンサーリンク


コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です