物体検知(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フレーム/秒ぐらいで多少カクつきますが、やはり目の前にある物を検知した結果を見ると楽しいですし、デモでやるとかなりウケがいいですね。
参考情報
- YOLO: Real-Time Object Detection: YOLO V3の公式サイト
- A PyTorch implementation of a YOLO v3 Object Detector: YOLO V3のPyTorch実装
- Pythonでmatplotlibをimportするとエラーが出る場合の対処策(Mac): matplotlibのimportエラーの対処法
ピンバック: Mac OS Sierra 環境での転移学習 – ハイキングとプログラムに関する趣味のBlogです