Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

画像の認識 〜 Yolo

More than 3 years have passed since last update.

Yolo を試してみました

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

先頭車両に穴をあけてカメラを取り付け、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' 

スクリーンショット_2017-04-18_21-05-56.png

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

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

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


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

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

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

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away