【抓取算法】Contact GraspNet
一、论文笔记
标题:Contact-GraspNet: 在杂乱场景中高效生成6-DoF抓取
期刊会议:ICRA2021
作者团队:Martin Sundermeyer(NVIDIA)
时间:2021
代码:https://github.com/NVlabs/contact_graspnet
数据集:
1.1 目标问题
提出了一种端到端的网络,从图像的深度数据中生成6D抓取分布。
1.2 方法
使用原始的深度图,以及(可选使用对象掩码),生成6D抓取建议以及抓取宽度。
(1)抓取表示方法
可以发现,大多是可以预测的两手指抓取,在抓取前至少可以看到两个接触点的一个。因此可以将抓取问题简化为估计平行板抓取器的3D抓取旋转和抓取宽度。
其中a是接近向量,b是抓取基线向量,d是从抓取基线到抓取基座的距离。使用这种表示方法可以加速学习过程,提高预测精度,且没有歧义和间断区域。
(2)数据生成
使用了ACRONYM数据集。在场景中以随机稳定的姿态放置具有密集抓取注释的对象网格。其中会导致夹爪与模型碰撞的抓取姿态将被删除。
(3)网络
使用PointNet++中提出的集合概要和特征传播层来构建非对称的U形网络。
网络有四个检测头,每个检测头包括两个1D卷积层,每个点输出s∈R,z1∈R3,z2∈R3、o∈R10,从中我们形成了我们的抓取表示。
将抓取的宽度划分为10个等距的抓取宽度,来抵消数据不平衡问题,然后选择置信度最高的抓取宽度表示。由于接近方向和基线方向是正交的,通过进行正交归一化预测,将这一性质加入到训练过程,有助于3D旋转的回归。
1.3 思考
在数据集中预先定义好了抓取姿态,然后进行监督训练。使用时根据深度图首先确定物体所在区域,然后利用其点云预测抓取分布。
自定义物体的数据集不易制作。
二、算法复现
2.1 准备工作
(1)环境搭建
下载代码
1 | git clone https://github.com/NVlabs/contact_graspnet.git |
创建虚拟环境
(这个环境是没问题的,如果出现依赖不满足要求的情况,可以先删掉那项,创建完环境后再手动安装)
1 | conda env create -f contact_graspnet_env.yml |
重新编译pointnet_tfops
1 | sh compile_pointnet_tfops.sh |
(2)模型和数据准备
从作者给出的连接下载trained models,并将它们放到./checkpoints/
,下载test data,并将它们放到./test_data
2.2 预测抓取
给定一个深度图(.npy文件/单位m),相机内参,2D实例分割图,运行下面的命令
1 | python contact_graspnet/inference.py \ |
--np_path
:输入的.npz/.npy文件,带有深度、内参、实力分割图、RGB信息
--ckpt_dir
:checkpoint目录,默认为checkpoint/scene_test_2048_bs3_hor_sigma_001
,非常干净的深度数据使用scene_2048_bs3_rad2_32
,非常混乱的深度数据使用scene_test_2048_bs3_hor_sigma_0025
--local_regions
:裁剪的3D实例分割
--filter_grasps
:筛选抓取点,使他们只为于对象的表面
--skip_border_objects
:忽略碰到深度图边缘的实例分割
--forward_passes
:前向计算的次数,增加可以提高抓取的采样点
--z_range
:[min, max]的z值来裁剪输入点云
--arg_configs TEST.second_thres:0.19 TEST.first_thres:0.23
:覆盖抓取的配置置信度来获得更多或更少的抓取候选
2.3 训练网络
(1)下载数据集
- 下载Acronym数据集
- 从https://www.shapenet.org/下载ShapeNet meshe
- 创建watertiget
- 下载并构建https://github.com/hjwdzh/Manifold
- 创建watertight mesh,假设物体路径为model.obj:
manifold model.obj temp.watertight.obj -s
- 简化:
simplify -i temp.watertight.obj -o model.obj -m -r 0.02
下载10000个带有Contact抓取信息的桌面训练场景Google Drive,解压为下面的格式
1 | acronym |
(2)训练Contact-GraspNet
如果在没有外设的服务器上训练,设置环境变量
1 | export PYOPENGL_PLATFORM='egl' |
使用配置文件contact_graspnet/config.yaml
开始训练
1 | python contact_graspnet/train.py --ckpt_dir checkpoints/your_model_name \ |
(3)生成自己的Contact Grasps和场景
所下载的scene_contacts
是从Acronym数据集生成的,要生成自己的数据集,下载安装acronym_tools。
第一步,对象的6D抓取被映射到保存在mesh_contacts
的接触点
1 | python tools/create_contact_infos.py /path/to/acronym |
根据生成的mesh_contacts
,可以创建桌面场景保存到scene_contacts
1 | python tools/create_table_top_scenes.py /path/to/acronym |
一个线程大约花费3天,可以多次运行命令在多个核上并行处理。
可视化显示创建的桌面场景和抓取
1 | python tools/create_table_top_scenes.py /path/to/acronym \ |