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