ローリングコンバットピッチなう!

AIとか仮想化とかペーパークラフトとか

夏休みの自由研究: AIロボットCOZMOを画像認識で一時停止、再発進させる(DONKEY COZMO Part.5)

[technology][Deep Learning][chainer]AIロボットCOZMOを画像認識で一時停止、再発進させる(DONKEY COZMO Part.5)

夏休みに入ったのでCOZMOの自律走行スクリプトを少し改造しました。

これまで「前進」「左転回(10度)」「右転回(10度)」という3種類の判断をしていたものに、「何もしない(停止)」という4つ目の判断を追加。
例えばCOZMOの前に障害物を置いて、その直前に停止させる等を学習可能に。

  • 停止、再発進時にCOZMOが音声で通知する様にした

あまり真面目に学習用データを取っていない(画像600枚弱)のですが、ラフに試した結果は下記の動画の通りです。

youtu.be

最新ソースコードを纏めてgithubに置きました。
github.com

Deep Learningで画像認識してロボットを制御するという実験をやってきたのですが、やってみて感じた事をちょっと書いてみます。
どれも文章にすると当たり前というか、まあそうだよね..という話なんですが、他人からの見聞ではなく、自分で試してみると実感として判る感じがします。

たかだが320x240のグレースケール画像を更に縦横1/2に縮小した画像から、ロボットが得る視点とその視点に対する操作(「前進」「左転回(10度)」「右転回(10度)」「何もしない(停止)」を学習(記憶?)させるわけですが、巷の初学者向け情報に載っている様な「畳み込み→Max Pooling→畳み込み→Max Pooling→全結合」という比較的シンプルなネットワーク設計でちゃんと自律走行している(様に見える)のは凄いなと。例えばCOZMOのカメラで得た画像からセンターラインをDeep Learning以外の画像認識手段で認識してトレースという仕組みも作れるのですが、自分が作ったコースだとコースが狭すぎるのと、COZMOのカメラの画角が狭いの二重苦でセンターラインをCOZMOの視界に捉え続けて移動させるのが結構難しい。そういったケースでも壁の模様等から左右の転回を記憶できてしまうがなかなかに凄い。

  • でもけして賢くは無い

といいつつ、やっているのは人間が走行させた際の動きを記憶させているだけなんですよね。人間が教えていない事はあたり前だけど出来ない。色々試していると判るし、当然なのですが、COZMO走行中にコース上に学習時には無かったものを適当に置いたりすると、どう動くか判りません。人間ならコースの脇に何かが置いてあったりしてもそれに惑わされてリしないのですが、Deep Learningでそこまでの汎化性能(と言って良いのか?)を獲得させるには相当幅広いシチュエーションでデータを取って学習させる必要があり、非常に効率が悪いです。

  • 学習データ(教師データ)には意識して一貫性を持たせないと上手く行かない

コースアウト状態や逆向き状態からの復帰を学習させた際に感じたのですが、いわゆる異常状態や準正常状態に陥った際にどのような動きでそこから脱出するか、明確なルール・基準を持って行動を学習させないと、COZMOが迷う様な動きを多々見せます。今回、右回りコースをメインで学習させましたが、例えばCOZMOを逆向きから正常な方向に戻す際に、常に右転回繰り返しで戻す等、決まった動きにしないと、結構COZMOが(一見すると)迷って嵌り込むパターンが散見されました。上手く文章で説明できていないのですが、Deep Learning用に教師データ(アノテーション)を人間が作る際、論理的に一貫した基準に基づいてアノテーションしないと推論精度が落ちるという当たり前といえば、当たり前の話なのですが、この一貫性をもったアノテーションが口で言うほど簡単ではないな...というのが感じるところです。


ちなみに機械学習ディープラーニングをやるのに、理論(数式)の理解は必須か?という議論が良くなされています。色々AI関連の記事を見ていると「ちゃんと理論的背景を理解して取り組まないとダメだよ」派と「細かい理論判らなくても、ニューラルネットワークはTensorFlowとか便利なライブラリがあり、使い方覚えれば誰も動かせるので、道具として使い方・外見えの特性をある程度理解したら、後は実践あるのみ」派にだいたい二分されます。

自分は統計論も線形代数も、ざっくり雰囲気レベルで知っているだけで、数式は全然理解できないレベルの人間です。ハイパーパラメーターの最適化とか、学習結果の品質測定とか、プロとしてやるならある程度理論的バックボーンは理解できた方が良いだろうなとは思います。一方で実際にニューラルネットワークや統計的機械学習を使ったアプリを組み、データを集めて学習させると、そのアプリケーションとかユースケース特有の特性に応じて設計する事(データをどうベクトル化するか?どういう粒度で採取するかetc)が、ニューラルネットワークそのものの設計以上に大事になるケースも多いだろうという感触。

数式理解できなくても、今回のCOZMO程度のデモは組めるので、ある程度アプリケーションの方向性が出たら、細かいチューニングは専門家の手を借りれば良い。大枠ではDeep Learningをどう使うか?どうユースケースにはめ込むのか?を考える方が大事かなと思います。


前回までの記事:
rc30-popo.hatenablog.com
rc30-popo.hatenablog.com
rc30-popo.hatenablog.com
rc30-popo.hatenablog.com