更新: Amazon Robotics Challenge 2017 の収納タスクで 1 位を獲得した、新しいビジョン システムのコードと論文をここでリリースしました。
このリポジトリには、Amazon Picking Challenge 2016 で 3 位と 4 位を獲得したビジョン システムのツールボックス コードが含まれています。RGB-D Realsense センサー ドライバー (スタンドアロンおよび ROS パッケージ)、2D オブジェクト セグメンテーション用の深層学習 ROS パッケージ (トレーニングとテスト)、 6D 姿勢推定用の ROS パッケージ。これは、この論文のモデルとコードのリファレンス実装です。
アンディ・ゼン、クアンティン・ユー、シュラン・ソン、ダニエル・スオ、エド・ウォーカー・ジュニア、アルベルト・ロドリゲス、ジャンション・シャオ
IEEE ロボティクスとオートメーションに関する国際会議 (ICRA) 2017
倉庫自動化は近年大きな関心を集めており、おそらく最も顕著なのは Amazon Picking Challenge (APC) です。完全自律型ピックアンドプレイス システムを実現するには、オブジェクトとその 6D 姿勢を確実に認識する堅牢なビジョン システムが必要です。しかし、雑然とした環境、自己閉塞、センサーノイズ、および多種多様な物体のため、倉庫環境では解決策が得られません。この論文では、APC 2016 で保管作業とピッキング作業でそれぞれ 3 位と 4 位を獲得したビジョン システムについて紹介します。私たちのアプローチは、マルチビュー RGB-D データとデータ駆動型の自己教師あり学習を活用して、課題を克服します。前述の困難。より具体的には、最初に完全畳み込みニューラル ネットワークを使用してシーンの複数のビューをセグメント化し、ラベルを付けます。次に、事前にスキャンした 3D オブジェクト モデルを結果のセグメンテーションに適合させて、6D オブジェクトのポーズを取得します。セグメンテーション用にディープ ニューラル ネットワークをトレーニングするには、通常、手動ラベルを含む大量のトレーニング データが必要です。私たちは、面倒な手動セグメンテーションを行わずに、より多くのオブジェクト カテゴリに簡単にスケールアップできる大規模なラベル付きデータセットを生成する自己教師ありの方法を提案します。私たちは、私たちのシステムがさまざまなシナリオの下でオブジェクトの 6D 姿勢を確実に推定できることを実証します。
このコードが自分の仕事に役立つと思われる場合は、次のコードを引用することを検討してください。
@inproceedings{zeng2016multi,
title={Multi-view Self-supervised Deep Learning for 6D Pose Estimation in the Amazon Picking Challenge},
author={Zeng, Andy and Yu, Kuan-Ting and Song, Shuran and Suo, Daniel and Walker Jr, Ed and Rodriguez, Alberto and Xiao, Jianxiong},
booktitle={ICRA},
year={2016}
}
このコードは、Simplified BSD License に基づいてリリースされています (詳細については、LICENSE ファイルを参照してください)。
関連するすべてのデータセット情報とダウンロードはここで見つけることができます。
ご質問がある場合、またはバグを見つけた場合は、Andy Zeng までお知らせください。 andyz[at]princeton[dot]edu
深層学習 FCN ROS パッケージからの事前計算されたオブジェクト セグメンテーションの結果を使用して、サンプル シーン データ ( data/sample
内) 上の 6D オブジェクトのポーズを推定します。
git clone https://github.com/andyzeng/apc-vision-toolbox.git
(注: ソース リポジトリのサイズは ~300MB です。クローン作成には時間がかかる場合があります)cd apc-vision-toolbox/ros-packages/catkin_ws/src/pose_estimation/src/
mdemo
実行します。 RGB-D オブジェクト セグメンテーションの結果に基づいて ICP を使用してモデル フィッティングを行うことで 6D オブジェクトの姿勢を推定するための Matlab ROS パッケージ。オブジェクトとビンの 3D 点群モデルはここにあります。
ros_packages/.../pose_estimation
catkin ワークスペースのソース ディレクトリ (例: catkin_ws/src
) にコピーします。pose_estimation/src/make.m
の上部にある指示に従ってください。pose_estimation/src
で GPU CUDA カーネル関数をコンパイルします。 nvcc -ptx KNNSearch.cu
roscore
開始するpose_estimation/src/startService.m
を実行します。各呼び出しで ( pose_estimation/srv/EstimateObjectPose.srv
」で説明されているサービス リクエストの形式を参照)、サービスは次の処理を行います。roscore
起動するmkdir /path/to/your/data/tmp
rosrun marvin_convnet detect _read_directory:="/path/to/your/data/tmp"
pose_estimation/src
に移動します。demo.m
の上部でファイル パスとオプションを編集します。startService.m
demo.m
librealsense を使用してリアルタイムでデータ (RGB-D フレームおよび 3D 点群) をストリーミングおよびキャプチャするためのスタンドアロン C++ 実行可能ファイル。 Intel® RealSense™ F200 カメラを使用して Ubuntu 14.04 および 16.04 でテスト済み。
realsense_standalone
を参照
cd realsense_standalone
./compile.sh
コンパイル後、 ./stream
を実行して、Realsense デバイスから RGB-D フレームのストリーミングを開始します。ストリーム ウィンドウがアクティブなときに、スペースバー キーを押して、現在の RGB-D フレームをキャプチャし、ディスクに保存します。関連するカメラ情報とキャプチャされた RGB-D フレームは、 data
の下のランダムな名前のフォルダーに保存されます。
Realsense デバイスが接続されているにもかかわらず検出されない場合は、別の USB ポートを使用してみてください。これが失敗した場合は、デバイスが接続されていないときに次のスクリプトを実行して、USB ポートを更新します。
sudo ./scripts/resetUSBports.sh
librealsense を使用してリアルタイムでデータ (RGB-D フレームおよび 3D 点群) をストリーミングおよびキャプチャするための C++ ROS パッケージ。 Intel® RealSense™ F200 カメラを使用して Ubuntu 14.04 および 16.04 でテスト済み。
この ROS パッケージには 2 つの異なるバージョンがあります。どのバージョンがインストールされるかは、システムで利用可能なソフトウェアによって異なります。
ros-packages/realsense_camera
参照してください。
ros_packages/.../realsense_camera
catkin ワークスペースのソース ディレクトリ (例: catkin_ws/src
) にコピーします。realsense_camera/CMakeLists.txt
を構成します。catkin_make
を使用してパッケージをコンパイルします。devel/setup.sh
roscore
開始するrosrun realsense_camera capture
/realsense_camera
センサーからデータを返します (応答データ形式はrealsense_camera/srv/StreamSensor.srv
で説明されています)。rosrun realsense_camera capture _display:=True
実行します。 FCN (完全畳み込みネットワーク) と軽量の GPU 専用ニューラル ネットワーク フレームワークである Marvin を使用した深層学習ベースのオブジェクト セグメンテーションのための C++ ROS パッケージ。このパッケージは、事前トレーニングされた ConvNet を介して RGB-D データを転送し、オブジェクトのセグメンテーション結果を取得します。ニューラル ネットワークは、Marvin を使用してオフラインでトレーニングされます (Marvin を使用した FCN トレーニングを参照)。
ros-packages/marvin_convnet
参照してください。
最初に Realsense ROS パッケージをコンパイルする必要があります。
CUDA 7.5 および cuDNN 5。NVIDIA への登録が必要な場合があります。以下に、cuDNN 5 をセットアップするための追加手順をいくつか示します。注異なるソフトウェア パッケージには異なるバージョンが必要になる可能性があるため、異なるバージョンの cuDNN を異なるディレクトリ (例: /usr/local/cudnn/vXX
) にインストールすることを強くお勧めします。
LIB_DIR=lib $( [[ $( uname ) == " Linux " ]] && echo 64 )
CUDNN_LIB_DIR=/usr/local/cudnn/v5/ $LIB_DIR
echo LD_LIBRARY_PATH= $LD_LIBRARY_PATH : $CUDNN_LIB_DIR >> ~ /.profile && ~ /.profile
tar zxvf cudnn * .tgz
sudo cp cuda/ $LIB_DIR / * $CUDNN_LIB_DIR /
sudo cp cuda/include/ * /usr/local/cudnn/v5/include/
ros_packages/.../marvin_convnet
catkin ワークスペースのソース ディレクトリ (例: catkin_ws/src
) にコピーします。realsense_camera/CMakeLists.txt
を構成します。catkin_make
を使用してパッケージをコンパイルします。devel/setup.sh
ros_packages/.../marvin_convnet/models/competition/
に移動し、bash スクリプト./download_weights.sh
を実行して、オブジェクト セグメンテーション用のトレーニングされた重み (トレーニング データセットでトレーニングされたもの) をダウンロードします。marvin_convnet/src/detect.cu
を編集します。ファイルの先頭に、ネットワーク アーキテクチャの .json ファイルと .marvin の重みへのファイルパスを指定します。apc-vision-toolbox/data
にtmp
というフォルダーを作成します (例: apc-vision-toolbox/data/tmp
)。ここでは、marvin_convnet が RGB-D データの読み取り/書き込みを行います。 tmp
内のデータの形式は、データセット内のシーンの形式と、Realsense Standalone によって保存されたデータの形式に従います。save_images
とdetect
2 つのサービスを提供します。前者は Realsense ROS パッケージから RGB-D データを取得し、 tmp
フォルダー内のディスクに書き込みます。一方、後者はtmp
フォルダー内のディスクから読み取り、RGB-D データを FCN 経由で転送し、応答イメージをディスクに保存します。rosrun marvin_convnet save_images _write_directory:= " /path/to/your/data/tmp " _camera_service_name:= " /realsense_camera "
rosrun marvin_convnet detect _read_directory:= " /path/to/your/data/tmp " _service_name:= " /marvin_convnet "
tmp
フォルダーにあると仮定): rosservice call /marvin_convnet [ " elmers_washable_no_run_school_glue " , " expo_dry_erase_board_eraser " ] 0 0
軽量の GPU 専用ニューラル ネットワーク フレームワークである Marvin で FCN (完全畳み込みネットワーク) を使用してオブジェクト セグメンテーションをトレーニングするためのコードとモデル。 convnet-training/models
にネットワーク アーキテクチャ .json ファイルが含まれ、 convnet-training/apc.hpp
に Marvin データ レイヤーが含まれており、セグメンテーション トレーニング データセットから RGB-D 画像 (RGB および HHA) をランダムにサンプリングします。
convnet-training
参照してください。
/usr/local/cudnn/vXX
) にインストールすることを強くお勧めします。 LIB_DIR=lib $( [[ $( uname ) == " Linux " ]] && echo 64 )
CUDNN_LIB_DIR=/usr/local/cudnn/v5/ $LIB_DIR
echo LD_LIBRARY_PATH= $LD_LIBRARY_PATH : $CUDNN_LIB_DIR >> ~ /.profile && ~ /.profile
tar zxvf cudnn * .tgz
sudo cp cuda/ $LIB_DIR / * $CUDNN_LIB_DIR /
sudo cp cuda/include/ * /usr/local/cudnn/v5/include/
convnet-training/
ディレクトリに移動します。models/train_shelf_color.json
のネットワーク アーキテクチャの APCData 層でトレーニング データセットのファイルパスを指定しますmodels/weights/
に移動し、bash スクリプト./download_weights.sh
を実行して、VGG の事前トレーニングされた重みを ImageNet にダウンロードします (事前トレーニングされた重みの詳細については、Marvin を参照してください)。convnet-training/
に移動し、ターミナル./compile.sh
を実行して Marvin をコンパイルします。./marvin train models/rgb-fcn/train_shelf_color.json models/weights/vgg16_imagenet_half.marvin
実行して、シェルフ内のオブジェクトを使用して RGB-D データのセグメンテーション モデルをトレーニングします (トート内のオブジェクトの場合は、ネットワーク アーキテクチャmodels/rgb-fcn/train_shelf_color.json
)。 私たちの論文で実験を実行するために使用されたコード。 「Shelf & Tote」ベンチマーク データセットで完全なビジョン システムをテストします。
evaluation
見る
apc-vision-toolbox/data/benchmark
に抽出します (例: apc-vision-toolbox/data/benchmark/office
、 `apc-vision-toolbox/data/benchmark/)倉庫」など)evaluation/getError.m
で、ベンチマーク データセット ディレクトリのファイルパスを指すように変数benchmarkPath
変更します。evaluation/predictions.mat
で提供されています。 「Shelf & Tote」ベンチマーク データセットのグラウンド トゥルース ラベルに対してこれらの予測の精度を計算するには、 evaluation/getError.m
を実行します。 RGB-D データ上のグラウンド トゥルース 6D オブジェクトのポーズに注釈を付けるための、WebGL ベースのオンライン ツール。 RGB-D Annotator の実装に従い、小さな変更を加えています。アノテーターの正確なコピーへのダウンロード リンクは次のとおりです。