ディープラーニングでターゲットの数字を認識

ラズパイのカメラを経由し、ターゲットに書いてある数字をディープラーニングで学習させたシステムで認識させようとしている。それによって舞台上にある目標位置に、ロボットが自動的に移動できるようにしたいわけだ。
ロボットのシステムソフトはjavaで書いてるので、ロボットのopencvもjavaで動かしたいのだが、色々やってもうまくいかないので、opencvはC++で動かして、それをネットワーククライアントにして、javaのシステムの方にネットワークサーバーを動かしてカメラデータを把握することにした。
ただ、カメラの生データをネットワークで取得すると、時間がかかりすぎりので、クライアント側で、分割して、システムの入力データに合うように加工し、画像認識の28X28ピクセルデータにしてロボットのシステムに送るようにすれば早い。システム側で、その画像に目標とする数字が書いてあるかを認識するのだ。認識システムそのものは、ここにも記載したディープラーニングで学習させたニューラルネットワークにさせる。
 
左上の画像が、ラズパイとカメラ、右上が数字が書いてあるターゲット、左下が、その画像を縦横4分割した場合の画像セットである。下の左から三番目の画像に、数字の4が写っている。それをニューラルネットワークに通すと、だいたい、信頼性の低い形で8とかの認識結果を出すのだが、ターゲットのあるところは、4が最も信頼性がある数字として出してくる。でも、その信頼性はとても低い。4以外にしたのはこの黒い画像も写り込んでいるからだ。

ラズパイのカメラをopencvで制御する

すけるくんに目標追跡機能を持たせる必要がある。
基本的な戦略は、カメラデータを取得して、その中にある目標対象のパターンを読み取り、見える位置などを把握して、距離センサーで、接近していくというものだ。
カメラデータの取得をOpencvにやらせる。当初は、opencvをjavaで動かしたかったが、Raspiにjava用のopencvを入れようとすると、なぜか最終局面で失敗する。それでも、やれないことはなかったが、opencvのコンパイルにむやみやたらに時間がかかるので、その路線を放棄した。
C系の言語でいいわということになったら、一番安直に
http://blue-black.ink/?page_id=2214
の物を入れた。opencvで、ラズパイのカメラが確かに動くサンプルもついていた。記載の通りインストールすると、しっかりカメラデータをライブで取ってきていた。
Netbeansでコンパイルできるように、そのプロジェクト化をする。ただし、一ヶ所だけ、Makefileの中で変えないといけないところがある。
USERLAND_ROOT
を実際にそれがある場所に変更しなければならない。
それで、NeabeansのC/C++ プロジェクト化できる。
サンプルの中の
IplImageデータの中に、カメラで取得したデータ、RGBそれぞれ1バイトずつ入っているので、それを利用すればいい。
戦略としては、画面データを様々なパターンで分割して、どこに標識があるのかを見極めよう。そのために、ディープラーニングで得られたパターン認識力を使う。

「すけるくん」のプロトタイプ


この間、インフルエンザのA型になって外出ができなくて、家に閉じこもっていた。その時間を利用して、なんども組み立て直していた「すけるくん」を、基本的に作り上げた。まだ、声かけに対して言葉を返したり、前後左右、回転などの動きをしたりする機能だけしか持たせていない。
仕様を書いておこう。
モーター(4個):pololu社製(pololu-2824)、統合型直行エンコーダー搭載、50:1、メタルギアドモーター、37mm X54mm 、12vで使用、無負荷時回転数: 200 rpm、無負荷時電流: 300 mA、ストール時電流: 5 A、ストール時トルク: 12 kg-cm (エンコーダーは、現在は使っていないが、いずれ回転数の正確な把握のために使う予定)このモーターの前に、ダイセン社ロボサイトモーターを使ってみたが、トルクが174g-cmしかなく、5kg以上あるすけるくんをしっかりと動かすことができなかった。トルクは70倍になったことになる。
ホイール(4個):メカナムホイール 60mm、6mハブ