ROS Advent Calendar 2017 1日目です。
書いているのはもう25日ですが、枠が埋まってないところを埋めます。
はじめに
今回の記事では思いつきで作ったMask R-CNN の ROS パッケージを紹介します。
何をするものなのかは動画を見るのが早いので、まずは動画をご覧ください。
Mask R-CNN とは
Mask R-CNN はFacebook AI Research の Kaiming He, Ross Girshick らにより提案された、物体インスタンスセグメンテーションのためのアルゴリズムです。
同著者らが関わっていた物体検出アルゴリズム Faster R-CNN を改良し、新しい分岐を追加したような構造になっています。
新しい分岐は検出した物体領域バウンディングボックスのうちどのピクセルが物体に含まれているかを表現するマスクを出力する機能を持ちます。
引用元: https://arxiv.org/abs/1703.06870
物体クラス+物体の含まれる矩形領域+実際に物体であるピクセル領域を一度に認識することができ、比較的高速(論文の環境で5Hz)に動作する素敵な性能を持っています。実験的な機能のようですが、人間の姿勢推定もできるようです。(この実装ではできない)
ロボットのカメラ画像をこれで処理できたら楽しそうですよね?
ROS パッケージ化
自分で実装できないことはなさそうなのですが、論文によれば学習にTesla M40 x8で1〜2日かかるそうなので、自前実装を自宅で学習させると一回の学習に1周間以上かかってしまいそうです。EC2などでGPUマシンを借りてもやっても良いのですが、ありがたいことに既に学習済みモデル付きで実装を公開してくれている方々が複数おられます。時間的猶予もあまりないので今回はそれを利用させてもらうことにしました。今回のコードの大部分は、Matterport, Inc. によるKeras実装を元にしています。したがって本パッケージ機能の大部分は彼らの寄与によります。感謝。
ROSに対応させる上で元の実装からの変更点を以下にまとめます。
* Python 2.7 で動作するように細々と修正(ROS Kinetic 対応のため)
* 学習でしか使わない依存パッケージの削除(COCO APIなど)
* 可視化関数の色付けアルゴリズムの変更(同じクラスは同じ色で塗る)
* ROS Node を実装(mask_rcnn_node
)
* 出力メッセージ型の定義
具体的な使い方はREADMEを書いておいたので、GitHubページを参考にしてください。
一応普通のROSパッケージっぽく使えるようにしたつもりです。
実験と結果
RGBD SLAM Datasets から適当なrosbagファイルをダウンロードしてきて、play
コマンドでカメラ画像を流し込んでみました。
それっぽく処理できていますね。
Intel Core i5-4670 3.4GHz, NVIDIA GeForce 980 Ti な環境で、3.5Hz程度で動きました。
論文によれば980 Tiとほぼ同クラスの計算能力を持つTesla M40において5Hzで動作するそうなので、そこからすると若干パフォーマンスが出ていないようです。
CPUの貧弱さか、ROSメッセージからの変換など実装上の問題か、はたまた別の原因か興味の湧くところですが未調査です。
見て楽しむ以外の用途
- Point Cloudの元のRGB画像に適用して、物体のポイントクラウドだけを切り出すなどすると良さそうです。
既知の問題
- 可視化の部分は元々MatplotlibでプロットしているところからFigureのバッファを取ってきて変換してるのですが、うまく余白が消せませんでした。情報求む。
フィードバック
思いつきで作ったので色々粗が残っていると思います。GitHub での Issue や PullRequest をお待ちしております。