Mask RCNN Object Measurement Package (Mask RCNNで物体径計測)


About this ROS package こういうの作った

RealSenseのようなRGBDセンサを用いて、深層学習により複数の任意のオブジェクトを区別して推測し、それぞれのオブジェクト上の重心を通る最大・最小の径を算出する。結果はROSトピック(mrcnn/result)として取得可。
https://github.com/moriitkys/mrcnn_measurement
参考になったらLGTMお願いします。

こちらはスナップエンドウの大きさを計測する様子。以下で示すボルトや丸太も、自分で学習させた。学習方法についてはこちら( https://github.com/matterport/Mask_RCNN )を参考に。(要望があれば解説の記事書く予定)また、スナップエンドウのrosbagはmrcnn_measurementでダウンロード可。

ボルトの計測の様子。

原木材(丸太)の計測の様子。こちらは非常に数が多いので実行もリアルタイムでは難しい。

最後に、cocoでも実行可能。

実行速度はMask RCNNの推測速度に大きく左右されるので(僕の実行環境で1回推測に約0.2s)、グラボを良くしたりバックボーンをモバイル向け(mobilenetなど)にするとよりリアルタイム性が向上する。
径計測にかかる時間は物体の数が多くなるにつれて増大するので注意。

2021/03/23追記 応用例として最近上げたものに以下のようなものがあるので、そっちの記事も見ていただけると幸いです。

Usage 使用方法

2021/03/23追記 以下のdownload_files.shがうまく実行されない場合は以下のリンクからbagファイルをダウンロードしてください。Notice! If you get an error by executing download_files.sh, please download from under URLs.
https://drive.google.com/file/d/1jDSxzqlHILCcwQGtHmI43A78a8lG1hSb/view?usp=sharing
https://drive.google.com/file/d/1rrKQBYAzL9TwhA3B7sgVlmE0XPD2Ji8f/view?usp=sharing
https://drive.google.com/file/d/1p6egLmlxAb4cv7UfUwLtZ0oZxJkFhBhs/view?usp=sharing
https://drive.google.com/file/d/1710BCuNIz8KxsLGuOWHk0Z8VsHMvR1iO/view?usp=sharing

センサがある場合

# 0, Download h5 & rosbag data  <= First time only
sh download_files.sh  # in this package directory
cd ~/catkin_ws
catkin_make
# 1, Turn on RealSnese D435
roslaunch realsense2_camera rs_aligned_depth.launch
# 2, Start mrcnn_measurement
roslaunch mrcnn_measurement mrcnn_measurement.launch

センサがない場合、rosbagでテスト

# 0, Download h5 & rosbag data  <= First time only
sh download_files.sh  # in this package directory
cd ~/catkin_ws
catkin_make
# 1, Start rosbag & mrcnn_measurement
roslaunch mrcnn_measurement mrcnn_measurement_rosbag.launch
  • scripts/print_result.pyはmrcnn/resultトピックの中身を読んで表示するサンプルプログラム。物体が一つであればわかりやすく、csvなどにも書き出しやすい(そもそもこのパッケージは物体一つの計測を推奨している)。
  • scripts/mrcnn_measurementは実行可能にする必要あるかも。(そのディレクトリでchmod +x mrcnn_measurementなど)
  • shファイルを実行するとh5ファイルとrosbagがダウンロードされる。数百GBなので通信環境によってはしばらく待つ必要あり。
  • launchファイルのparam name="~model" value="mymodel"のmymodelをcocoにするとmask_rcnn_coco.h5を読み込む。
  • Mask RCNNへと入力する画像サイズによっては推測結果が大きく変わるので、注意。例えば、このパッケージではcocoの学習結果を用いる際320*240の画像サイズで入力しているが、640*480で入力すると結構変わる。
  • self.array_lines(径計測用の配列)の定義では角度分解能self.angle_stepを6度としているが、より細かく形状の最大最小を見つけたい場合にはself.angle_stepを小さくすること。
  • scripts/files/mymodel_classes.csvの"object"を別の名前に変更可。

Rough commentary ざっくり中身の解説

1, RealSenseからのRGB&Depthトピックを受け取る(message_filter)。
2, RGB画像をMask RCNN(ResNet)により物体推測。
3, 推測で生成されたマスク画像のエッジ(mask_i_xy_edges)と、クラス初期化時に作成した径計測用配列(self.array_lines)のアダマール積をマスク重心において実行し、各角度におけるオブジェクト径を計算、diameter_pointsにappendしていく。

self.array_lines 径を求めるときの概念図

4, オブジェクトの重心を通る最大径max(diameter_points)と最小径min(diameter_points)を求め、RealSenseのカメラパラメータfxとマスク部の深度平均(外れ値を除外)から幾何的にオブジェクトの実際の径を計算。

5, 可視化。

Error 誤差

現在調査中だけど学習の良し悪しも関係するのでざっくり10%くらい誤差がでると考えたほうがいいかも。丸太のような円形とかなら精度よくなるかも。

Task 課題

計測の誤差を小さくすること。
径計測にかかる時間を小さくすること(特にmaskのROIごとのfor文がネックになっている)。

Future work 今後

解説は充実させていくつもり。この記事は更新予定あり

Requirements

ros kinetic
h5py==2.7.0
Keras==2.1.3
scikit-image==0.13.0
scikit-learn==0.19.1
scipy==0.19.1
tensorflow-gpu==1.4.0
GTX1060, cudnn==6.0, CUDA==8.0
realsense2_camera ( http://wiki.ros.org/realsense2_camera )

参考

http://wiki.ros.org/ja/ROS/Tutorials/WritingPublisherSubscriber%28python%29
http://wiki.ros.org/realsense2_camera
https://github.com/matterport/Mask_RCNN
https://qiita.com/_akio/items/5469913fce7fdf0c732a

本記事の著者

moriitkys 森井隆禎
ロボットを作ります。
AI・Robotics・3DGraphicsに興味があります。最近はいかにしてお金を稼ぐかを考え、そのお金でハードをそろえようと企んでいます。
資格・認定:G検定、Pythonエンジニア認定データ分析試験、AI実装検定A級、TOEIC:810(2019/01/13)