CDPN:Coordinates-Based Disentangled Pose Network for Real-Time RGB-Based 6-DoF Object Pose Estima...

CDPN原文链接

这一篇来自ICCV2019的文章,根据单张RGB图像恢复物体6-DoF位姿信息(包括少纹理以及遮挡物体),在LINEMODOcclusion数据及上达到了state-of-the-art performance

本文主要贡献

  1. 第一个结合间接PnP-based策略直接回归方法估计object pose的方法
  2. 即使在有检测错误的情况下,Dynamic Zoom In的提出使得pose estimation结果具有鲁棒性
  3. 为了达到实时的要求,对于rotation的估计,采用了二阶段的object-level的coordinates estimation,并提出了MCC Loss以克服非目标区域的影响
  4. 提出SITE方法,可得到鲁邦且精确的translation估计结果
  5. 在LINEMOD数据集上得到很好的结果,并且达到了30ms per image的实时速度

目录

  1. Previous Work
  2. Methodology
    2.1 Dynamic Zoom In
    2.2 Continuous Coordinates Regression
    2.3 Scale-invariant Translation Estimation
  3. Training Strategy
  4. Experiment Result

1. Previous Work

方法 缺点
传统几何方法 需要丰富的纹理提取2d-3d的特征点做匹配
直接回归法 严重依赖后续的精密处理才能得到较好的结果
现存coordinates-based方法 极度依赖depth信息,并且无法达到实时要求

Related work

从RGB图像中识别6-DoF的方法分为直接法和间接法。

  1. 间接法
    即不是直接的从RGB图像中恢复出6-DoF的信息,而是现在2维RGB图像和它的3维的模型上建立点到点的对应关系,然后通过数学的方法将旋转量(R)和平移量(T)求解出来。

  2. 直接法
      即不依赖于物体的三维模型,通过神经网络去进行学习,直接从物体的RGB像素信息中学习三维的旋转量和平移量。能够快速的对物体的6-DoF进行预测,但是对物体的旋转量的估计精度效果不是很好。
      原因:旋转量的空间分布是属于一个SO3的空间量,它具有一定的周期性,也就是说对于一个物体,它的旋转的量是0-360°范围内的一个值,并且因为很多的物体存在对称性的问题,所以往往很多物体旋转一定的角度之后,所呈现的画面就是一样的,这就对用神经网络去预测旋转量产生了很大的干扰。

2. Methodology

CDPN网络框架

给定输入图像,我们首先放大目标对象,然后用两个子网络分别对旋转和位移进行预测。 具体来说,旋转是通过 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实践策略

DZI的处理结果展示

CDPN网络需要的输入是size固定的检测bounding box区域。在训练网络是,原图都经过这DZI这一层预处理,将bounding box区域缩放到网络需要的大小(如上图第二行小图)。

具体细节

  1. 给定包含目标对象的图片,还有位置和,然后根据公式(1)定义的被截断的正态分布里采样位置和

  2. 采样的范围依赖于物体的高, 宽, 还有参数

  3. 用和来截取原图,获得一个bouding box区域,并且resize到一个固定的大小,resize的时候保持长宽比不变(有必要的话进行pad)

公式1
\left\{ \begin{array}{**lr**} \tilde{x} \sim f(x) = \ \frac{\phi ( \frac{\overline{x}-x}{\sigma_x})}{\sigma_x(\Phi (\frac{\alpha \cdot w}{\sigma_x}) - \Phi (\frac{-\alpha \cdot w}{\sigma_x}) )} \\ \tilde{y} \sim f(y) = \ \frac{\phi ( \frac{\overline{y}-y}{\sigma_y})}{\sigma_y(\Phi (\frac{\beta \cdot h}{\sigma_y}) - \Phi (\frac{-\beta \cdot h}{\sigma_y}) )} \\ \tilde{s} \sim f(s) = \ \frac{\rho \phi ( \frac{\overline{s}-s}{\sigma_s})}{\sigma_h(\Phi (\frac{\gamma \cdot s}{\sigma_s}) - \Phi (\frac{-\gamma \cdot s}{\sigma_s}) )} \\ \end{array} \right.

是目标的中心坐标位置
是对应的真实的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网络架构

image.png

先用一个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

Translastion Head网络结构图

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性能不仅仅更好,而且在各个物体上更加的均衡,提供了更高的准确性。


补充资料

对于旋转量的预测(间接法),有以下几种方法:

  1. 事先定义好我要找的物体的三维模型的关键点,然后去找这些事先定义好的点在图像上对应的像素位置。方法的缺陷:训练好的模型在不同种类上的泛化能力是很差的,比如说我现在训练的模型,是来预测猫的姿态的,那么在预测飞机,汽车上的话,就不适用,因为三维关键点的信息不一样。
  2. 不去找物体自身的关键点,去找物体公共的关键点,比如说我不去找物体的关键点,而是去找三维的bounding box的关键点,即8个角点。那么我只需要找这8个顶点在2维的图像上的对应的像素。也能够建立2D 到3D的对应关系。缺陷:它的关键点通常都不是落在物体的表面,那么在图像中去找对应点的时候,它的对应点往往也不是落在图像上,偏离物体一定的范围。
  3. 基于物体坐标的一种旋转估计,从二维图像出发,物体在图像上的每个像素点,去预测其在物体3维模型中的坐标。

Reference

  1. CDPN论文理解
  2. CDPN解读

你可能感兴趣的:(CDPN:Coordinates-Based Disentangled Pose Network for Real-Time RGB-Based 6-DoF Object Pose Estima...)