画像の認識 〜 Yolo


Yolo を試してみました

以前、子供のために、Raspberry Pi Zero+Pi Camera を使ったプラレールを制作しました。

先頭車両に穴をあけてカメラを取り付け、Raspbian にインストールした MJPG Streamer で映像をストリーミング、モーターは WebSocket でコントロール、そしてライト機能を追加して、スマホや PC のブラウザで遊びます。1
映像を見ながらカメラ付きプラレールを操作するだけでも楽しいのですが、これに Yolo 画像認識を組み合わせたら、例えば、信号が赤なら止まる。電車が近くにあったら速度調整、駅に着いたら自動停止といったことも可能なのではないか?

という考えが頭に浮かび、Yolo が実際にどんなものなのか、触って確かめてみることにしました。

Yolo, Darknet とは?

Yoloは、"You only look once" の略で、リアルタイム画像認識を行うアルゴリズム(およびその実装)です2。Yolo は Darknet というフレームワークを使用して実装しています。
Darknet は C で書かれた機械学習フレームワークです。位置づけとしては、Tensorflow や Chainer のようなものになります。FCN というネットワークを使用していますが、これは darknet 以外の機械学習フレームワークでも実現可能ということで、すでに有志の方々が、Yolo の Tensorflow版Chainer版 を実装されています。
今回はおためしなので、Darknet を使用します。

インストール

自分の環境は、すでに CUDA と OpenCV がインストールされているので、必要なものだけインストールしました。

$ cd git
$ git clone https://github.com/pjreddie/darknet.git
$ cd darknet

ここで、Makefile を編集、GPU と OpenCV を有効にします。

$ diff Makefile Makefile.org 
1c1
< GPU=1
---
> GPU=0
3c3
< OPENCV=1
---
> OPENCV=0

そして make

$ make

これだけです。

実際に動かしてみる

静止画

この写真は、邪魔しに来た我が家の猫(♀)です。猫も、猫の下敷きになっているマウスもきちんと検出しています。

$ ./darknet detector test cfg/coco.data cfg/yolo.cfg yolo.weights '/home/kmori2/ピクチャ/img_6643.jpg' 

GPU メモリ使用量を示すため、nvidia-smi の画面も貼り付けます。3
darknet が GPU メモリを 1.3GB 使用しています。
最低でも 4GB の GPU メモリを搭載したボードでないと、darknet を使用するのはつらいかもしれません。

動画

以前、子供と一緒にリモコンプラレールで遊んだ時に録画した映像を、Yolo にかけました。
上記静止画と同様、通常のモデル(Tiny ではない)を使用しています。
なお、この動画は 4 倍速です。動画を最後まで識別させるために、実際には 6 分以上かかりました。

$ ./darknet detector demo cfg/coco.data cfg/yolo.cfg yolo.weights ~/ビデオ/test0416-01.mp4

※画像をクリックすると youtube で再生されます。

予想していたことですが、プラレールの運行中に視界に入るものについて、レールや駅など、列車に関わるものは全く認識していません。おおよそ Bed 、Laptop、Keyboard の3つとして検出してます。
乗り物の運行に関するものは特に学習していないようなので、これは当たり前ですね。

しかし、レゴの警官ミニフィグやソフビのウルトラマンは、しっかりと人(Person) として認識しています。ちょっと感動しました。(^^;

Yolo は検出したオブジェクトのリージョンまで検出するので、例えば「レール上に人(人形)が横たわっているので停止する」といった動作であれば簡単に実現できそうです。
まずはプラレールについて学習させ、モデルを作成しなければなりませんが、今後、楽しみです。


  1. 配線図やソースコードなど、いずれ公開しようと思います。 

  2. 論文 https://arxiv.org/abs/1612.08242 

  3. これまで、GTX1050(2GB) を使用していましたが、先日、GTX1080ti(11GB)に換装しました。こちらの製品です。