Suction-Net 其实根graspnet是同宗分出来的另外一个分支,graspnet的抓取工具是两指的,Suction-Net是吸盘,作为野生游侠,没实验室设备,只有教学的工业机器人用配了吸盘末端工具,因此重点学习了suction-Net,为记忆,大概写个总结,想着后面要弄个吸盘抓取的网络。
这篇论文的点主要包括:
1.数据集的制作,数据集非常大,跟graspnet是一样的数据集,两台深度相机 kinect 和realsense D435i,88个物品,每次从88个物品中抽出一些出来放到平台上,共190个场景,两台相机装在机械臂上,每个场景进行256个不同的视角拍摄(视角是固定的,有机械部跑出来),每个场景共2*256张,数据集非常大,按场景来存放,每一个场景分为kinect和Realsense数据包,数据包括annotation、depth、lable、meta、rgb图。
2.标签的制作是利用算法实现的,每个场景的物品利用已有3d模型进行配准找出其位姿(w.r.t相机)再利用256个不同视角已知的变换矩阵(机器人跑出来,自然就知道不同的视角相对第一个视角的坐标变换,只需求出第一个场景物体的物体位姿,就可以计算出后面255个视角下的位姿),吸取的方向就算该抓起点的法向量)
3.lossfuction包括两个重要的值,一个是点可吸取分(用来找出吸取点,吸取点密封性,其方法参考了DexNet的方法进行了简化改良,密封性分数由两个数据相乘得到:
(1)一个是S_deform,是根据吸盘在法向量方向在物体上的投影,吸盘上均匀选取一定的数量的点进行投影,计算相邻的点在物体上的投影点的长度,与在吸盘上对应的长度比较计算变形率,找出最大的变形率,该吸取点的变形分就是:1-最大的变形率
(2)利用所选取点在物体上法向量方向的投影点来拟合一个平面,计算每个点到这个平面的距离误差平方均值,该吸取点的fit分就是:1-距离误差平方,利用(1)*(2)即得密封性分数。
另外一个是能吸上的分数wrench分(也是参考DexNex3.0,进行了简化),我认为这是这篇论文主要的贡献点,即用两种方法对数据集进行了计算作标签。
4.网络,网络真的每什么特别的所以论文也每怎么介绍其网络结构,就一张简图,其实就算deeplab3+的结构,backbone+金字塔空洞卷积、借鉴CenterNet等的思路。网络是基于pixel的。
其结构就算用Resnet-101进行了特征提取(backbone,encoder),1000个深度的特征,大小为图像大小,然后提取Backbone中的第一块残差块输出(256维)作为计算wrench分的输入进入一个project模块,这个模块很简单就算一个一般的conv2D模块,输出48维的热点图,另外提取Backbone中的第四块残差块输出(2048维)的分别作了四个不同空洞率的卷积(输出都是256d的),然后进行了concat,并进行了下采样,让size与48维的wrench热点图一样,并进行了concat拼接,再丢进一个Conv2d模块(classify模块)
self.classifier = nn.Sequential( nn.Conv2d(304, 256, 3, padding=1, bias=False), nn.BatchNorm2d(256), nn.ReLU(inplace=True), nn.Conv2d(256, num_classes, 1) )
最后网络的输出是size*2d,2d中一个是seal score ,另一个是center score(近视wrench score)。
源代码已各种接口的模式提供,可选不同的网络类型参数进行实验比较,抓去对象是各种不同的物品,有几个点可以借鉴,数据生成的方式,第二是参考了centernet(Objects as points),这个对于3d点处理值得借鉴。