更新:我们在这里发布了新视觉系统的代码和论文,该系统在 2017 年亚马逊机器人挑战赛的装载任务中获得了第一名。
该存储库包含我们的视觉系统的工具箱代码,该系统在 2016 年亚马逊拣货挑战赛中获得了第三名和第四名。包括 RGB-D Realsense 传感器驱动程序(独立和 ROS 包)、用于 2D 对象分割(训练和测试)的深度学习 ROS 包、用于 6D 位姿估计的 ROS 包。这是我们论文的模型和代码的参考实现:
Andy Zeng、余宽廷、宋舒然、Daniel Suo、Ed Walker Jr.、Alberto Rodriguez 和肖建雄
IEEE 国际机器人与自动化会议 (ICRA) 2017
近年来,仓库自动化引起了人们的极大兴趣,最明显的可能是亚马逊拣选挑战赛 (APC)。实现完全自主的拾放系统需要强大的视觉系统,能够可靠地识别物体及其 6D 姿态。然而,由于环境杂乱、自遮挡、传感器噪声和物体种类繁多,仓库环境中无法找到解决方案。在本文中,我们提出了一种视觉系统,该系统在 APC 2016 的装载和拣选任务中分别获得第三名和第四名。我们的方法利用多视图 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}
}
此代码在简化 BSD 许可证下发布(有关详细信息,请参阅许可证文件)。
所有相关的数据集信息和下载都可以在这里找到。
如果您有任何疑问或发现任何错误,请告诉我: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
Matlab ROS 包,用于通过在 RGB-D 对象分割结果上使用 ICP 进行模型拟合来估计 6D 对象姿势。可以在此处找到对象和垃圾箱的 3D 点云模型。
ros_packages/.../pose_estimation
复制到 catkin 工作区源目录(例如catkin_ws/src
)pose_estimation/src/make.m
顶部的说明为Matlab编译ROS自定义消息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
一个独立的 C++ 可执行文件,用于使用 librealsense 实时流式传输和捕获数据(RGB-D 帧和 3D 点云)。使用英特尔® 实感™ 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
一个 C++ ROS 包,用于使用 librealsense 实时传输和捕获数据(RGB-D 帧和 3D 点云)。使用英特尔® 实感™ F200 摄像头在 Ubuntu 14.04 和 16.04 上进行了测试。
该 ROS 软件包有两个不同的版本。安装哪个版本将取决于您系统的可用软件:
请参阅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
一个 C++ ROS 包,用于使用 FCN(全卷积网络)和 Marvin(一种轻量级仅 GPU 神经网络框架)进行基于深度学习的对象分割。该包通过预先训练的 ConvNet 向前馈送 RGB-D 数据以检索对象分割结果。神经网络使用 Marvin 进行离线训练(请参阅使用 Marvin 进行 FCN 训练)。
请参阅ros-packages/marvin_convnet
需要先编译Realsense ROS Package。
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
。前者从 Realsense ROS 包中检索 RGB-D 数据并将其写入磁盘的tmp
文件夹中,而后者从磁盘中的tmp
文件夹中读取数据并通过 FCN 向前馈送 RGB-D 数据并将响应图像保存到磁盘中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
使用 FCN(全卷积网络)和 Marvin(一种仅使用 GPU 的轻量级神经网络框架)来训练对象分割的代码和模型。包括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
以在 ImageNet 上下载 VGG 预训练权重(有关更多预训练权重,请参阅 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
一种基于 WebGL 的在线工具,用于在 RGB-D 数据上注释地面实况 6D 对象姿势。遵循 RGB-D Annotator 的实现,并进行了一些小的更改。这是我们的注释器的精确副本的下载链接。