More Related Content
Similar to Rosとgazeboを使った3d空間での3次元畳み込みニューラルネットによる物体認識 (20)
Rosとgazeboを使った3d空間での3次元畳み込みニューラルネットによる物体認識
- 10. 3次元畳み込みニューラルネットワーク
• 入力層
• S×S×Sのvoxcelの固定サイズ配列を受け入れ。S = 32
• 畳み込み層C1
• チャネル数Nは1となりますので、SxSxSxN。LxLxLxN'の3次元フィルタで畳み込む
• N'個の特徴マップを作成、ReLU活性化関数使用
• プーリング層P1
• 最大プーリング(ダウンサンプリング)
• 畳み込み層C2
• 再び3次元フィルタで畳み込みN’'個の特徴マップを作成します。
• プーリング層P2
• 畳み込み層C2の出力に対し同様にプーリングを行います。
• 全結合層
• 隣接層間のノードすべてを結合した層を2層配置
• 最終層は通常のニューラルネットと同様の設計(クラス分類)
Editor's Notes
- オブジェクトの認識はロボットが現実の環境のなかで自律的に行動できるためには重要な技術です。LiDARやRGBDカメラといったセンシング技術はロボットにとって必要な豊富な3D情報を提供する重要な技術となっています。しかしながらこの情報は大量のPointCloudデータであり、効率的に処理するのは難しいのが現状です。
もしくはPCLで3Dの特徴量を計算するなど、本稿では「VoxcelChain」を提案します。VoxcelChainはディープラーニング(深層学習)による3次元形状の畳み込みニューラルネットワークを利用することにより、この問題を解決します。
- 深層学習用のフレームワークであるChainerでは、主に画像の学習や音声学習で用いられるConvolutiono2DのほかにConvolutionNDというものが用意されています。任意の次元のCNN実装は、たぶんChainer特有、もしくはChainerが一番早かったかと思います。
今回はこのConvolutionNDで3次元形状を学習してみます。
- はい、ではどのように作っていくかをご説明します。
まずは入力データの前処理、これはPCLという点群処理ライブラリの
ユークリッドクラスタ抽出を用い、オブジェクト候補を抽出、物体を認識しています。
抽出したオブジェクト候補を、32かけ32かけ32のボクセルにします。
すると、次のスライドのようなデータになります。
- はい
これは、私の全身データのVoxcelになります。人っぽさをのこしつつデータ量を下げている感じですね。こういったデータ処理が手軽に行えるのがPCLの魅力ですね。
- 正規化したデータは3次元畳み込みニューラルネットワークであるVoxcelChainへの入力となります。このニューラルネットによりオブジェクトクラス検出を行い、最終的に入力されたオブジェクト候補のクラスが判定されます。
- CNNの特徴は畳み込み層およびプーリング層を交互に接続した構造を持つことにあります。画像の場合、畳み込み層により一般的な画像処理での畳込みと同等な画像のぼかしやエッジの強調などといったフィルタが得られますが、3次元のCNNにおいては、3次元空間の畳み込みによって有用な空間フィルタが得られると考えられます。空間フィルタは平面やコーナーと言った空間構造を表すフィルタとなります。畳み込み層の出力はプーリング層への入力となり、プーリング層では画像認識の場合と同様に、空間のどの位置でフィルタの応答が強かったという情報を一部捨て、空間構造内に現れる特徴の微小な位置変化に対する応答の不変性を得られる事が期待されます。
畳み込み層C1
チャネル数Nは1となりますので、畳み込み層はSxSxSxNの入力を受け取ります。
この層ではLxLxLxN'の3次元フィルタで畳み込むことによってN'個の特徴マップを作成します。その後ReLU活性化関数を経て畳み込み層の出力とします。畳み込みではnarrow convolutionを使用しzero paddingは行いません。
プーリング層P1
この層では受容野空間の各ノードからの入力の最大値を出力とする最大プーリングの手法により各ノードの値を1つの値に置き換えることでボリュームの、ダウンサンプリングを実現します。プーリングの処理はストライドsを用いて間引いて行います。
畳み込み層C2
チャンネル数N'のプーリング層の出力を受け再び3次元フィルタで畳み込みN''個の特徴マップを作成します。
プーリング層P2
畳み込み層C2の出力に対し同様にプーリングを行います。
全結合層
隣接層間のノードすべてを結合した層を2層配置します。この最終層は通常のニューラルネットと同様の設計であり、今回クラス分類が我々の目的であるため、目的のクラス数と同数のノードn個を配置し、活性化関数にソフトマックス関数を用います。
- さて、NNはできたのですが、学習するためにはデータが大量に必要になります。点群のデータなんてその辺に転がっているわけではありませんし。かといって、3DCADデータを使うのでは、実データではないですし、デプスカメラの2.5次元でーた、つまり後ろっかわ、センサーの影になるデータがないでたーにならない、うしろまであるでーたになっちゃう。そうすると、認識率の限界が来るのが目に見えています。そこで、実用的な認識率を出すには大量の実データ、となるわけですが、収集が難しい。
そこで、Gazeboの出番です。
- じゃあ具体的にどうやって、点群データを取り出すかというと、
センサーから得られる点群には壁も床もその他対象物以外のオブジェクトも含まれるため、対象物だけ切り出す処理が必要。(写真と一緒ですよ、認識したい被写体も写っていればそうでないものも写っている、だから「ここからここが対象物ですよ」とおしえてやる、切り出してやる、そうやって教師データを作るんですね。画像の場合そういうツールが沢山あります。点群の場合それがないので、自作しました。
以下にそのツールの使い方を説明する。
ツールは3つのフェーズにわかれていて、
点群キャプチャツール
これは点群をキャプチャしてファイルに保存する処理である。例えるなら写真を撮るのと同じですね。
物体切り出しクラス分けツール
これは、点群キャプチャファイルを開き、物体をクリックするとタップした物体だけを抜き出す。
カテゴリ分けが表示されるので、物体のカテゴリをクリックすると、フォルダ分けして物体の点群が保存されるようになっている。
最後に、
32x32x32のvoxcelへと正規化
して、ディープラーニング用シュリンクデータの作成を行います。
- これが、写真を撮るのと同じで、キャプチャボタンを押すとその瞬間のPointCloudデータをファイルに保存します。
- ラベリングを行います。
クリックすると、クリックした場所を中心に物体とおもわれる場所を自動的に切り出してくれます。切り出した点群は「人」「自転車」「車」などにラベリングして、個別のファイルとして保存しています。
- ディープラーニング用シュリンクデータの作成
上記「物体切り出しクラス分けツール」で切り出ししたデータをvoxel単位にシュリンクした0,1データへと変換する。
処理は以下
• 32×32×32のvoxelを用意し、配列 [x][y][z] となる配列 [32][32][32] を用意する。
• データがあれば、1、データがなければ0とする。
• 出力される配列は1次元配列データ。チェイナーで処理しやすいよいうに加工しています。
Voxcel化したデータはこのようにビューワーで閲覧できるようにしています。このビューワーもPCLのものだったかと思います。
- 学習は2,000件のデータのうち1/5をテストデータとし、学習を行った。
人、テーブル、バイク、自転車、ポスト、犬、パイロンといった10クラスを分類
青が精度、緑が誤差関数の値である。学習が進むにつれ精度が1に近づいている様子が確認できる。
- 実際にこの深層学習データを使って、GAZEBO内で物体の認識をさせているところです。自転車を正しく自転車として認識することができています。
- なおこの3次元のCNNのChainerのソースコードと、サンプルの学習データ一式をgithubにおいていますのでソースやデータなど参考にしていただければと思います。
- 余談ですが、TurtleBot3購入しました!
TurtleBot3はROSの学習機、6万〜7万円で、360度LiDERを搭載!
これの魅力は、パーツのデータがオープンなことです。3Dデータや細かなパーツのメーカーリストが入手可能なので、追加で購入したり、パーツを3Dプリンタで印刷することができます。
いまやっと本体組み上げたところです。いまからラズパイにUbuntu入れて動かしてみるところ。
これから、これにIntelのRealSense ZR300を搭載してみたいともくろんでいるところです。