2016年10月17日月曜日

車の自動運転ってどうやってやるんだろ

おじさん、五歳の娘に「アニアは夜になると動くんだよ」と言ったところ、うちの娘はおじさんが寝ている間にアニアをリビングに移動させ、おじさんが起きた時に「アニアがほんとうに動いてた」と言ってました。五歳児の人をまねる能力って本当にすごいです。おじさんがやろうとしていることを想像して先に自分がやるんですね。



これとくらべると最近話題の機械学習も人間のやることをまねしているだけなんですが、猿まねというか五歳児以下ですね。

おじさん、五歳児に嘘を見破られてくやしいので、頭をよくするために車の自動運転のソフトウェア技術を勉強してみました。
しばらく勝手に車の自動運転の技術について勝手に解説しようと思っています。

車の自動運転では、信号とか歩行者や対向車などを判別しないといけないんですが、まずは歩行者などを判別するところまで。

映像の中から物体を識別するには

1. 物体候補領域抽出
2. 画像認識

という二段階が必要らしいです。

映像の中からなんか人とか物がありそうな領域を抽出して、その領域一つ一つに対して画像認識をして、画像が何かを判別するんですね。

2に関しては前回のブログで比較的最先端なものをやったので今回はパス。
今回は1の部分をやってみたいと思います。


物体候補領域抽出アルゴリズムはBING(Binarized Normed Gradients for Objectness Estimation)とかSelectiveSearchとかいうものがあるそうです。

この部分、結構処理が重たいらしく、いろいろな企業や研究機関で高速物体候補領域
抽出の研究がされているようです。

この辺のライブラリ、Pythonで書かれていることが多いのですが、将来商品に入れることを考えると、PCのフルPythonでしか動かないライブラリを使うのではなくて、やはりC++でやりたいですね。

ということで今回はDlibというライブラリでSelectiveSearchをやってみたいと思います。最新の19.2はVisualStudio2015以上でしか動かないので、僕は18.16を取ってきました。

このライブラリも面白いですね。allというディレクトリにあるsource.cppというファイルを一つコンパイルするだけで、ライブラリが使えます。


Selective SearchのC++のソースコードはここにあるのでそのまま取ってきます。
http://nonbiri-tereka.hatenablog.com/entry/2016/07/15/110000


先ほどのファイルと上記のメイン関数のファイル、二つをコンパイルすると実験ができちゃうんです。この10分くらいでサクッとビルドできて実験できちゃう感じがほんと便利。ライブラリの作者の頭の良さが伝わってきます。


ということで、アニアの画像を物体候補領域抽出してみました。


僕のPCでは20秒くらいかかる・・・・。
でもなんか正しいっぽいいじゃん。