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都能兼容
  • 在有检查误差\varepsilon存在时,也能有稳定的performance

问: 就是说什么样的size都能检测到?
答:不是,是说即使检测效果不是那么好,通过DZI也能得到一个不错的效果

问:是因为有很多很多框,所以训练样本更多吗?训练是独立的,就是说检测和后面的处理并没有什么联系,所以只要检测器做的好就ok?
答:训练样本,看代码没多啥,或许是因为将很多预测出来的框合成一个,所以说训练样本更多吧;应该不是检测器的问题,DZI就是为了解决检测器效果不是特别好的问题

问:为什么用的是检测的方法,而不是进行实例分割?
答:实例分割可以将一张图片中的相同的物体抠出来,分割的mask用于pose estimation的话,精度肯定会有所提升,但是因为现在的分割网络的模型都比较大,所以在速度上肯定会比较低,尤其是针对pose estimation的话,因为很多的应用都是实时的,所以对于速度肯定是有一定的要求的。综合考虑实时性,选择了检测的方法。除此之外就是,作者在训练的时候提出的DZI对性能效果的提升十分的显著。在论文中有对这个进行实验的对比。

2.1.2 DZI实践策略

DZI的处理结果展示

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

具体细节

  1. 给定包含目标对象的图片,还有位置C_{x,y}S=max(h,w),然后根据公式(1)定义的被截断的正态分布里采样位置\tilde{C}_{x,y}\tilde{S}

  2. 采样的范围依赖于物体的高h, 宽w, 还有参数\alpha,\beta,\gamma,\rho

  3. \tilde{C}_{x,y}\tilde{S}来截取原图,获得一个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.

(x,y)是目标的中心坐标位置
(h,w)是对应的真实的bounding box的size
s = max(h,w)
\phi是标准正太分布
\Phi是累积分布函数
\alpha,\beta,\gamma,\rho是限制此案杨范围的参数
\sigma_x, \sigma_y, \sigma_s控制分布的形状

代码实践

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(H × W × 4),其中三个通道是坐标映射M_{coor}(每个通道的值对应一个坐标系),还有一个单通道的置信度映射M_{conf}

2.2.2 Masked Coordinates-Confidence Loss

为了解决背景的问题,背景的真实坐标咱并不知道,有些方法给背景指定了特殊值,这样起效是因为他们用的分类,而不是回归

是不是类似Multi Bin这样的方法?分类是指分成了很多个区间,然后分配到对应区间
答:应该就是,代码里也是用的bin

直接回归连续的坐标的方法,会使得网络在坐标map的物体边缘上预测出尖锐的边缘,这使得回归任务具有挑战性,容易生成错误的坐标

就是说,到了物体边缘,深度差很多,这样回归出来的值就差很大,就很尖锐,是这个意思吗?所以作者在后面只用了前景mask
答:做了实验,确实是效果很差,偏的蛮多的。作者说的分类,是指对应的3D坐标来分类,对于2D像素的预测,我不给你那么多的自由度,不让你做连续的值的会用,用bin分类来束缚,能将值约束到一个还可以接受的范围内

那么,CDPN的处理是这样的

  • 3D坐标回归:前景区域
  • 置信度预测:全图

L_{CCM} = \alpha \cdot l_1(\sum^{n_c}_{j=1} (M_{conf} \circ (M_{coor_j}- \tilde{M}_{coor_j}))) + \beta \cdot l_1(M_{conf} - \tilde{M}_{conf})

n_c=3是坐标map的通道数
\circ是Hadamard product(两个矩阵对应元素相乘)

2.2.3 Building 2D-3D Correspondences

解决的点
由于变焦,RGB图片上的尺寸通常和坐标图中的不同。
为了建立3D和2D的对应,将预测出来的坐标再映射到RGB图像中,这次的映射是不带预测的损失的。
指定RGB图像中物体的中心和尺寸是(c_u,c_v)(\tilde{S}_{x},\tilde{S}_{y}),在坐标map中是(c_i,c_j)({S}_{x},{S}_{y}),他们之间的映射关系如下:

\left\{ \begin{array}{**lr**} \hat{u} =\{{c}_{u} + {S}_{x} / \tilde{S}_x \cdot (i-c_i)\} & \\ \hat{v} =\{{c}_{v} + {S}_{y} / \tilde{S}_y \cdot (j-c_j)\} \end{array} \right.
对于(\hat{u},\hat{v})是映射到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提取出来的特征,推测出T_S = (\Delta_{x}, \Delta_{y}, t_z),这三个量的定义如下
\left\{ \begin{array}{**lr**} \Delta{x} = \frac{O_x - C_x}{w} \\ \Delta{y} = \frac{O_y - C_y}{h} \\ t_z = \frac{T_z}{r} \end{array} \right.

(O_x,O_y)物体中心原图像坐标
(C_x,C_y)相机成像中心(即principal point)
(h,w)是原始图像的被采样的物体大小size
r是DZI中resize的比例

预测出来的T_S = (\Delta_{x}, \Delta_{y}, t_z)与全局信息T_G(包含position位置信息C_{x,y}和size大小(h,w))相结合,就能推算出最终的相机外参中的T = (T_x,T_y,T_z)
\left\{ \begin{array}{**lr**} T_x = (\Delta_x \cdot w + C_x) \cdot \frac{T_z}{fx} \\ T_y = (\Delta_y \cdot h + C_y) \cdot \frac{T_z}{fy} \\ T_z = r \cdot t_z \end{array} \right.

代码实现

# 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)

损失函数
L_{SITE} = l_2(\gamma_1 \cdot (\Delta{x} - \tilde{\Delta} x) + \gamma_2 \cdot (\Delta{y} - \tilde{\Delta} y) + \gamma_3 \cdot (t_z - \tilde{t}_z) )

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)
三维对应点的平均距离
5cm \ 5^{\circ} 预测值与ground truth之间的差值小于这个范围就是认为是预测正确,从而转换成01分类问题的度量
2D Proj. 图像重投影误差

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解读
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342

推荐阅读更多精彩内容