Hatena::ブログ(Diary)

shi3zの長文日記 RSSフィード Twitter

2016-10-06

[][]週末に人工知能搭載ロボットを作ってみた 07:12

https://i.gyazo.com/1afe867ab04b0ae95fe55650b232ebbc.png


 9月の頭に、マクニカさんから「Deep Learning Dayになんか出しませんか?ロボットとか」とお誘いを受け、とはいえあと一ヶ月もないし、週末も毎週のようになんかしらのイベントで埋まってるし・・・と思ったんだけど、機材と足回りのセットアップはマクニカさんから提供してくださるということなので、せっかくなので残り少ない休日を潰してJetsonTX1とiRobot Createを組み合わせて深層ニューラル・ネットワーク搭載ロボを作ってみることに。なにごともやってみなければわからないし


 とはいえ計算資源がない。社内のはパンパンで、だからといってドワンゴの機械を使うわけにも行かないし、ここはもう諦めてプリトレインドモデルだけでなんとかする方向でやることにした。


 プリトレインドモデル、つまり訓練済みモデルを使う場合、選択肢は限られてくる。蒸留したりする資源がないわけだから、TX1用でない普通のネットワークでなんとかする必要があるというわけだ。


 いの一番にFaster RCNNを使うことを考えたが、Faster RCNNはあくまでも「(比較的)速い」RCNNなのであって、Jetson TX1で動かすとインファレンスに3秒程度掛かってしまう。むう!使えん!


 機械制御で3秒というのは考えてないも同然である。


 そこで普通のGoogLeNetを使ってみると、これは0.3秒程度で終了する。

 ただし、当たり前だけど、GoogLeNetは画面全体がそれっぽいかそれっぽくないかでしか判断できない。


 FasterRCNNは推定されるオブジェクトのクラス数が少ないのが問題といえば問題だが、万が一代替手段が見つかったときのために、FasterRCNNでもGoogLeNet(というかILSVRC2012ベースの学習済みモデル)でもいけるようなちょうどいい目標物を決める必要があった。


 幸い、FasterRCNNではペットボトルをbottleと認識でき、GoogLeNetではwaterと認識されるので代替可能と判断し、まずはGoogLeNetでの実装を検討することにした。


https://i.gyazo.com/580eb5e070ed59a9acb34444b6d10ac2.png


 Selective Searchというか、Faster RCNNであろうと結局はどこのバウンディングボックスに目標物があるか調べる仕組みに過ぎない。


 だから自分でバウンディングボックスを決めてしまえば大まかな位置が推定できるはずだ。

 また、横軸の制御しかしないので縦方向にどっちだ、という情報は必要ない。

 そこで画面の中央部を横方向に6分割して位置推定をすることにした。


 すると2秒くらいかかってしまう。なぜだ。


 どうもJetsonTX1は極めて強力なGPUを内蔵してはいるが、CPUは皆さんご存知ARMコアなので、どうもGPUに画像を転送する処理で時間を食ってるらしい。そのかわりARMコアは4つ載ってる。シングルプロセスだと他の3基が寝てるようだった。


 そこでプロセスを4つに分けることにした。

 ひとつのプログラムでマルチスレッディングする方法も考えたがプロセスを4つに分けて独立して動かすほうが結局は安定性が高い。


https://i.gyazo.com/a8c7028db6531929b6d448e9e1934616.png


 これが吾輩が「MAGI方式」と呼ぶ3賢者(AI)による分割統治システムである。

 

 まず、カメラ画像を撮影して他のプロセスに送るプログラム。

 次に、画像を受け取って二枚の画像をそれぞれGPUに送信し、そこにペットボトルがあるかどうか判断する3つのサブプロセス、カスパー、メルキオール、バルタザールの三プロセスがそれぞれの結論を報告すると、最後に運動が生成されて、ペットボトルを追いかけるロボが完成した。


https://i.gyazo.com/86535c9023adf3d2f1bfd3e54e988eae.gif


 ところがひとつ誤算が。

 ペットボトルと似たものが会場に山ほどあったのだ。

 それはバッヂである。


 参加者が首から下げるバッヂのテカテカが、ペットボトルと良く似た性質を持っているためバッヂをペットボトルとご認識してしまうというハプニングがあった。


 まあでも週末の工作としてはご愛嬌かな。

 もうちょっと時間があればもっと精度の高い追尾が作れるけど、iRobot Createが中途半端に家電製品ぽくて、動作中に充電してると動かないという謎の仕様で苦しめられた。そのくせ電池が持つわけでもないし


 あと、この程度でも本当は強化学習とか使えばもっと精度よく一発でピタッとペットボトルを画面の中心に捉えるような学習ができると思うけど今回は時間切れ


 今日明日は今月のディープラーニングセミナーなので、その話もしようかと。


 そして今月はなんと二回もディープラーニングセミナーをやります。


 13日(木曜)、14日(金曜)のディープラーニングセミナーでも、蒸留の話やロボット開発の手法についても話をしたいと思います。


 まだ若干名行けますので、もしご興味があればこちらまで → http://deepstation.jp/seminar/


 今月17日に発売予定の「よくわかる人工知能」も好評予約受付中です。

 昨夜、ついに見本誌ができたらしい。