CDPN原文链接
这一篇来自ICCV2019的文章,根据单张RGB图像恢复物体6-DoF位姿信息(包括少纹理以及遮挡物体),在LINEMOD和Occlusion数据及上达到了state-of-the-art performance
本文主要贡献
- 第一个结合间接PnP-based策略和直接回归方法估计object pose的方法
- 即使在有检测错误的情况下,Dynamic Zoom In的提出使得pose estimation结果具有鲁棒性
- 为了达到实时的要求,对于rotation的估计,采用了二阶段的object-level的coordinates estimation,并提出了MCC Loss以克服非目标区域的影响
- 提出SITE方法,可得到鲁邦且精确的translation估计结果
- 在LINEMOD数据集上得到很好的结果,并且达到了30ms per image的实时速度
目录
- Previous Work
- Methodology
2.1 Dynamic Zoom In
2.2 Continuous Coordinates Regression
2.3 Scale-invariant Translation Estimation - Training Strategy
- Experiment Result
1. Previous Work
方法 | 缺点 |
---|---|
传统几何方法 | 需要丰富的纹理提取2d-3d的特征点做匹配 |
直接回归法 | 严重依赖后续的精密处理才能得到较好的结果 |
现存coordinates-based方法 | 极度依赖depth信息,并且无法达到实时要求 |
Related work
从RGB图像中识别6-DoF的方法分为直接法和间接法。
间接法
即不是直接的从RGB图像中恢复出6-DoF的信息,而是现在2维RGB图像和它的3维的模型上建立点到点的对应关系,然后通过数学的方法将旋转量(R)和平移量(T)求解出来。直接法
即不依赖于物体的三维模型,通过神经网络去进行学习,直接从物体的RGB像素信息中学习三维的旋转量和平移量。能够快速的对物体的6-DoF进行预测,但是对物体的旋转量的估计精度效果不是很好。
原因:旋转量的空间分布是属于一个SO3的空间量,它具有一定的周期性,也就是说对于一个物体,它的旋转的量是0-360°范围内的一个值,并且因为很多的物体存在对称性的问题,所以往往很多物体旋转一定的角度之后,所呈现的画面就是一样的,这就对用神经网络去预测旋转量产生了很大的干扰。
2. Methodology
给定输入图像,我们首先放大目标对象,然后用两个子网络分别对旋转和位移进行预测。 具体来说,旋转是通过 PnP 从预测的 3D 坐标中得到的,而位移是直接从图像估计的。
2.1 Dynamic Zoom In(DZI)
2.1.1 为什么提出DZI?(Motivation & Merits)
- 物体的大小会根据相机的远近而变化,这也给coordinates regression加大了难度
- 如果物体太小,也很难提取特征
- 在train阶段可以让CPDN独立于各种detector,在test阶段可使CPDN与single-stage detector都能兼容
- 在有检查误差存在时,也能有稳定的performance
问: 就是说什么样的size都能检测到?
答:不是,是说即使检测效果不是那么好,通过DZI也能得到一个不错的效果
问:是因为有很多很多框,所以训练样本更多吗?训练是独立的,就是说检测和后面的处理并没有什么联系,所以只要检测器做的好就ok?
答:训练样本,看代码没多啥,或许是因为将很多预测出来的框合成一个,所以说训练样本更多吧;应该不是检测器的问题,DZI就是为了解决检测器效果不是特别好的问题
问:为什么用的是检测的方法,而不是进行实例分割?
答:实例分割可以将一张图片中的相同的物体抠出来,分割的mask用于pose estimation的话,精度肯定会有所提升,但是因为现在的分割网络的模型都比较大,所以在速度上肯定会比较低,尤其是针对pose estimation的话,因为很多的应用都是实时的,所以对于速度肯定是有一定的要求的。综合考虑实时性,选择了检测的方法。除此之外就是,作者在训练的时候提出的DZI对性能效果的提升十分的显著。在论文中有对这个进行实验的对比。
2.1.2 DZI实践策略
CDPN网络需要的输入是size固定的检测bounding box区域。在训练网络是,原图都经过这DZI这一层预处理,将bounding box区域缩放到网络需要的大小(如上图第二行小图)。
具体细节
给定包含目标对象的图片,还有位置和,然后根据公式(1)定义的被截断的正态分布里采样位置和
采样的范围依赖于物体的高, 宽, 还有参数
用和来截取原图,获得一个bouding box区域,并且resize到一个固定的大小,resize的时候保持长宽比不变(有必要的话进行pad)
公式1
是目标的中心坐标位置
是对应的真实的bounding box的size
是标准正太分布
是累积分布函数
是限制此案杨范围的参数
控制分布的形状
代码实践
def xywh_to_cs_dzi(self, xywh, s_ratio, s_max=None, tp='uniform'):
x, y, w, h = xywh
if tp == 'gaussian':
sigma = 1
shift = truncnorm.rvs(-self.cfg.augment.shift_ratio / sigma, self.cfg.augment.shift_ratio / sigma, scale=sigma, size=2)
scale = 1+truncnorm.rvs(-self.cfg.augment.scale_ratio / sigma, self.cfg.augment.scale_ratio / sigma, scale=sigma, size=1)
elif tp == 'uniform':
scale = 1+self.cfg.augment.scale_ratio * (2*np.random.random_sample()-1)
shift = self.cfg.augment.shift_ratio * (2*np.random.random_sample(2)-1)
else:
raise
c = np.array([x+w*(0.5+shift[1]), y+h*(0.5+shift[0])]) # [c_w, c_h]
s = max(w, h)*s_ratio*scale
if s_max != None:
s = min(s, s_max)
return c, s
2.2 Continuous Coordinates Regression
2.2.1 Coordinates-Confidence Map
子网络输出:object内的逐像素预测该像素的世界坐标系下的三维坐标+该像素属于object的置信度
we merge this task into coordinates regression based on the fact that both of them have the same output size and their values have exact positional correspondences.将坐标回归和分割搞一块的原因是:他们的输出size相同(因为都是每个像素都进行预测),他们的值具有精确的位置对应关系
Rotation Head
网络架构
先用一个backbone提取特征。然后,引入一个Rotation Head,由卷积和反卷积层够构成,最后处理成一个4通道的卷积置信度Map(),其中三个通道是坐标映射(每个通道的值对应一个坐标系),还有一个单通道的置信度映射
2.2.2 Masked Coordinates-Confidence Loss
为了解决背景的问题,背景的真实坐标咱并不知道,有些方法给背景指定了特殊值,这样起效是因为他们用的分类,而不是回归
是不是类似Multi Bin这样的方法?分类是指分成了很多个区间,然后分配到对应区间
答:应该就是,代码里也是用的bin
直接回归连续的坐标的方法,会使得网络在坐标map的物体边缘上预测出尖锐的边缘,这使得回归任务具有挑战性,容易生成错误的坐标
就是说,到了物体边缘,深度差很多,这样回归出来的值就差很大,就很尖锐,是这个意思吗?所以作者在后面只用了前景mask
答:做了实验,确实是效果很差,偏的蛮多的。作者说的分类,是指对应的3D坐标来分类,对于2D像素的预测,我不给你那么多的自由度,不让你做连续的值的会用,用bin分类来束缚,能将值约束到一个还可以接受的范围内
那么,CDPN的处理是这样的
- 3D坐标回归:前景区域
- 置信度预测:全图
是坐标map的通道数
是Hadamard product(两个矩阵对应元素相乘)
2.2.3 Building 2D-3D Correspondences
解决的点
由于变焦,RGB图片上的尺寸通常和坐标图中的不同。
为了建立3D和2D的对应,将预测出来的坐标再映射到RGB图像中,这次的映射是不带预测的损失的。
指定RGB图像中物体的中心和尺寸是和,在坐标map中是和,他们之间的映射关系如下:
对于是映射到RGB的像素,代表no rounding operation。
至此,旋转就可以从对应的3D-2D点对,通过带有RANSAC的PnP算出来,以下是代码实践
dist_coeffs = np.zeros((4, 1)) # Assuming no lens distortion
if cfg.test.pnp == 'iterPnP': # iterative PnP algorithm
success, R_vector, T_vector = cv2.solvePnP(model_points, image_points, cfg.dataset.camera_matrix,
dist_coeffs, flags=cv2.SOLVEPNP_ITERATIVE)
elif cfg.test.pnp == 'ransac': # ransac algorithm
_, R_vector, T_vector, inliers = cv2.solvePnPRansac(model_points, image_points,
cfg.dataset.camera_matrix, dist_coeffs, flags=cv2.SOLVEPNP_EPNP)
else:
raise NotImplementedError("Not support PnP algorithm: {}".format(cfg.test.pnp))
R_matrix = cv2.Rodrigues(R_vector, jacobian=0)[0]
pose_est = np.concatenate((R_matrix, np.asarray(T_vector).reshape(3, 1)), axis=1)
2.3 Scale-invariant Translation Estimation
Translation Head
的任务并不是直接回归绝对的translation,而是基于backbone提取出来的特征,推测出,这三个量的定义如下
是物体中心的原图像坐标
是相机成像中心(即principal point)
是原始图像的被采样的物体大小size
是DZI中resize的比例
预测出来的与全局信息(包含position位置信息和size大小)相结合,就能推算出最终的相机外参中的
代码实现
# compute T from translation head
ratio_delta_c = pred_trans_[:2]
ratio_depth = pred_trans_[2]
pred_depth = ratio_depth * (cfg.dataiter.out_res / s_box_)
pred_c = ratio_delta_c * box_[2:] + c_box_
pred_x = (pred_c[0] - cfg.dataset.camera_matrix[0, 2]) * pred_depth / cfg.dataset.camera_matrix[0, 0]
pred_y = (pred_c[1] - cfg.dataset.camera_matrix[1, 2]) * pred_depth / cfg.dataset.camera_matrix[1, 1]
T_vector_trans = np.asarray([pred_x, pred_y, pred_depth])
pose_est_trans = np.concatenate((np.eye(3), np.asarray((T_vector_trans).reshape(3, 1))), axis=1)
损失函数
SITE能处理bounding box的中心和物体中心不一定的情况,还能处理遮挡的情况
换句话说,通过预测bounding box的中心偏移,处理遮挡情况?反正bounding box能通过detector预测出来
3. Training Strategy
在训练的时候,采用的是交替式训练的策略,用来解决旋转量难以学习的问题。
Stage 1: Training the backbone and rotation head
Stage 2: Training translation head only
Stage 3: Training the backbone,rotation head,translation head
4. Experiment
指标介绍
名称 | 意义 |
---|---|
ADD(Average Distance of Model Points) |
|
预测值与ground truth之间的差值小于这个范围就是认为是预测正确,从而转换成01分类问题的度量 | |
图像重投影误差 |
4.1 Dynamic Zoom In and Masked Coordinates-Confidence Loss
这个表里的Syn
列表示的是是否使用了合成图片进行训练。
值得注意的是,表中的第9、10行。在test的时候,使用Yolov3来提供检测,性能几乎和Faster-RCNN一样。在Tiny YOLOv3上,准确率只损失了一点。我们可以看到,DZI使得位姿网络具有高度的模块化和灵活性,在不需要重新训练的情况下,可以很好地与大部分流行的detector协同工作。
4.2 Detection vs. Segmentation
在准确性和速度上,分别对基于检测的网络和分割的网络进行比较。为了建立分割的baseline,训练了一个Mask-RCNN来提供物体分割的mask。然后,在训练的过程中,使用这个mask对物体进行缩放,并且在测试的时候,使用它作为置信度图去建立2D-3D的对应。
但如上图所示,结合了DZI方法的检测网络,比使用分割的网络,准确率更好,速度也更快
4.3 Scale-invariant Translation Estimation
用SITE而不是直接回归坐标来估计平移,在ADD的标准上提升显著,从75.04到89.96。每一个物体的对比如下图所示。
SITE性能不仅仅更好,而且在各个物体上更加的均衡,提供了更高的准确性。
补充资料
对于旋转量的预测(间接法),有以下几种方法:
- 事先定义好我要找的物体的三维模型的关键点,然后去找这些事先定义好的点在图像上对应的像素位置。方法的缺陷:训练好的模型在不同种类上的泛化能力是很差的,比如说我现在训练的模型,是来预测猫的姿态的,那么在预测飞机,汽车上的话,就不适用,因为三维关键点的信息不一样。
- 不去找物体自身的关键点,去找物体公共的关键点,比如说我不去找物体的关键点,而是去找三维的bounding box的关键点,即8个角点。那么我只需要找这8个顶点在2维的图像上的对应的像素。也能够建立2D 到3D的对应关系。缺陷:它的关键点通常都不是落在物体的表面,那么在图像中去找对应点的时候,它的对应点往往也不是落在图像上,偏离物体一定的范围。
- 基于物体坐标的一种旋转估计,从二维图像出发,物体在图像上的每个像素点,去预测其在物体3维模型中的坐标。
Reference
- CDPN论文理解
- CDPN解读