PVNet: Pixel-wise Voting Network for 6DoF Pose Estimation 论文和代码理解

Why

解决什么问题

为了解决6DoF的遮挡和截断问题

许多现在的方法都是二阶段的,先预测关键点,然后用PnP来做位姿估计,但是这些方法只能通过回归他们的图像坐标或热图来定位一些稀疏点,对遮挡和截断很敏感

本文创新点

  1. 作者使用了一种逐像素投票网络(PVNet)来回归逐像素的指向关键点的向量,并且用这些向量给关键点位置投票,能更好地定位遮挡和截断关键点。
  2. 创造了关键点位置的不确定性机制,能更好的利用PnP

本文IDEA来源

作者这个idea的来源是一个刚体的性质:一旦我们看到了刚体的一部分,那我们就能够推断出其他部分的相对方向

流程一览

在这里插入图片描述
作者设计网络来预测逐像素的分割和向量场,以此来生成假设点。
在这里插入图片描述
向量场

所以作者为什么不直接预测关键点?

  1. 解决遮挡和截断需要更密集的预测,在遮挡或截断的情况下,关键点的特征已经检测不到了,所以直接预测cell中的关键点分数在这种情况是行不通的。
  2. 向量场这种表达方式,比起坐标或热图的表达,更强迫网络去关注目标的局部特征和物体的部位之间的空间关系,所以看不见的物体部分能由看的见的部分推测出来,并且减轻杂乱的背景的影响,能正确定位看不到的或在图像外面的关键点。
  3. 稠密的输出为PnP处理不精准的关键点预测提供了丰富的信息,能给PnP更多的自由度,使预测效果更好。

之后,用改进的RANSAC算法来根据投票结果选择inlier点(预测效果好的点),抛弃一些预测效果不好的点。
在这里插入图片描述
关键点投票

得到一些inlier预测的假设点后,根据假设点的均值和协方差,生成最终的预测的关键点。然后根据PnP算法得到 R , t R,t
在这里插入图片描述
这里,作者和之前其他的方法不一样,由上图可以看出,作者的关键点都在物体表面上,而不是直接预测的包围盒的角点,这是为什么?

  1. 包围盒上的点离物体的像素位置更远,信息不如物体上的像素准确。
  2. 通过实验得出,物体上的关键点的方法比起物体外角点的方法,方差更小,说明更准确,平衡性能和精度后选了8个物体上关键点。

How

准备工作

render、fuse

在这里插入图片描述
B l e n d e r   r e n d e r i n g Blender\ rendering

在这里插入图片描述
f u s i o n fusion

扫描二维码关注公众号,回复: 8843313 查看本文章

FPS算法

以点云第一个点,作为查询点,从剩余点中,取一个距离最远的点;
继续以取出来的点,作为查询点,从剩余点中,取距离最远的点。此时,由于已经取出来的点的个数大于1,需要考虑已经选出来的点集中的每个点。计算逻辑如下:

  1. 对于任意一个剩余点,计算该点到已经选中的点集中所有点的距离;
  2. 取最小值,作为该点到点集的距离;
  3. 计算出每个剩余点到点集的距离后,取距离最大的那个点。
  4. 重复第2步,一直采样到目标数量N为止。

代码

PnP算法

在这里插入图片描述

在这里插入图片描述

神经网络预测

backbone

用预训练的ResNet-18来作为backbone,然后做出了三个修改:

  1. 在size是 H / 8 × W / 8 H/8 \times W/8 的特征图的位置取消了池化
  2. 为了保证感受野不变,随后的卷积用适当的膨胀卷积代替
  3. 原来的ResNet-18中的全连接层都用卷积层代替

在这里插入图片描述
Dilated conv:
在这里插入图片描述
dilated的好处是不做pooling损失信息的情况下,加大了感受野,让每个卷积输出都包含较大范围的信息。

H i n + 2 × padding [ 0 ] dilation [ 0 ] × ( kernel_size [ 0 ] 1 ) kernel_size [ 0 ] stride [ 0 ] + 1 \left\lfloor\frac{H_{in} + 2 \times \text{padding}[0] - \text{dilation}[0]\times (\text{kernel\_size}[0] - 1) -\text{kernel\_size}[0]}{\text{stride}[0]} + 1\right\rfloor
膨胀卷积特征图尺度变化
28 + 2 × 2 2 × ( 3 1 ) 1 1 + 1 \left\lfloor\frac{28 + 2 \times 2 - 2\times (3 - 1) - 1}{1} + 1\right\rfloor
本结构中

训练

输入
RGB图片,分割、向量场、向量场权重的真实值。

真实的向量场和预测的向量场都是整个图片全部像素,对某一关键点方向的预测。
向量场权重就像mask label一样,决定使用哪些像素的向量。

输出
预测的分割和向量场。

seg loss
在这里插入图片描述
vertex_loss:
在这里插入图片描述
在这里插入图片描述
w w 代表PVNet的参数
v ~ k \tilde v_k 是真实的方向向量
Δ v k x \varDelta v_k |x Δ v k y \varDelta v_k |y 代表 Δ v k \varDelta v_k 的两元素
其中 x x 就是当前物体所占的像素中, Δ v k x \varDelta v_k |x Δ v k y \varDelta v_k |y

总loss:
l o s s = l o s s s e g + l o s s v e r t e x t r a i n _ c f g [ v e r t e x _ l o s s _ r a t i o ] loss = loss_{seg} + loss_{vertex} * train\_cfg['vertex\_loss\_ratio']

获取 R , t R,t

有非不确定机制和不确定机制。

投票机制

对像素点的数量进行处理:
如果小于规定的最小数量(5),就跳过这个物体;
如果大于规定的最大数量(30000),就随机采样到最大数量
while 最低比例没达到阈值 or 迭代次数没达到最大(20):
	#这个阈值是用1 - (1 - 当前最低比例**2) ** hyp_num和0.99比较
	i = 0
	while(i<512):
		随机挑选两个点,得到这两个点的向量的交点作为假设点(9)
		i = i + 1
		
	根据公式1,计算 每个像素点对于每个假设点 的分数,然后和阈值比较(应该就是找向量方向和假设点差不多的像素)
	大于阈值的设为inlier,否则设为oulier
	w_k_i = inlier数量 / 该物体像素点的数量
	
	每次都把w_k_i的最高分数、对应的假设点记录下来

在这里插入图片描述
1 公式1

在这里插入图片描述
( ) 生成的假设点位置(投票之前)
在这里插入图片描述
用椭圆来表示假设点分布

均值获取

最好的假设点进行投票,获取对应的inlier,利用这些inlier获取均值点。

下面是作者论文中的公式:
在这里插入图片描述

  \

但是和代码中的不一样,联系作者后,作者说代码是论文中方法的改进版本,改进后的方法是最小二乘法
在这里插入图片描述
最小二乘法计算:
通过最小化像素向量和假设点的差异,来找假设点的位置 t t ,也就是说假设 t T n i t^Tn_i p i T n i p^T_in_i 之间的差别最小:
t T n i = p i T n i t^Tn_i = p^T_in_i
转置:
n i T t = n i T p i n^T_it = n_i^Tp_i
b b 表示 n i T p i n_i^Tp_i :
n i n i T t = n i b n_in^T_it = n_ib
t = ( n i n i T ) 1 n i b t =(n_in_i^T)^{-1}n_ib
A A 表示 n i T n_i^T :
t = ( A T A ) 1 A T b t =(A^TA)^{-1}A^Tb

之后,把 t t 当做关键点的坐标,再加上已知的3D空间关键点坐标,用PnP算法求解 R t R,t ,至此,非不确定性方法结束

协方差获取

投票机制基本一样,对假设点处理方式和均值略有不同:

对假设点的处理 计算因子
均值 只留最优假设点 基于inlier计算
协方差 保留所有假设点 设置一个阈值(这类假设点的最高 w w - 0.1),小于这个阈值的 w w 置0,基于假设点计算

w w 是inliers的比例。
然后根据下面的公式计算协方差:
在这里插入图片描述
协方差用来衡量不同变量之间的相关性,数值越大说明二者越相关,我们的输入是二维的,算出来的协方差矩阵是 2 × 2 2\times 2 的:
[ c o v ( x , x ) c o v ( x , y ) c o v ( y , x ) c o v ( y , y ) ] \begin{bmatrix} cov(x,x) & cov(x,y) \\ cov(y,x) & cov(y,y) \end{bmatrix}

挑选协方差逆矩阵迹最小的四个关键点,用PnP算法算出初始的 R , t R,t 值,然后用 Levenberg Marquardt 算法求使马氏距离最小的 R , t R,t ,至此,不确定性机制结束

逆矩阵中数值越小说明越相关,用逆矩阵可以消除尺度对距离的影响,为什么选择trace,我觉得是因为这两个元素是最需要的,我们只需要比较两个点的xx之间,yy之间的相关性,不需要比较xy和yx之间的相关性。

在这里插入图片描述
最小化马氏距离
X k X_k 是一个关键点的3D坐标
x ~ k \tilde x_k X k X_k 的2D射影
π \pi 是透视射影函数
R , t R,t 用基于四个关键点的EPnP来初始化,这四个点的协方差矩阵的迹是最小的

马氏距离性质:
马氏距离(Mahalanobis distance)是由印度统计学家马哈拉诺比斯(P. C. Mahalanobis)提出的,表示点与一个分布之间的距离。它是一种有效的计算两个未知样本集的相似度的方法。与欧氏距离不同的是,它考虑到各种特性之间的联系(例如:一条关于身高的信息会带来一条关于体重的信息,因为两者是有关联的),并且是尺度无关的(scale-invariant),即独立于测量尺度。对于一个均值为μ,协方差矩阵为Σ的多变量向量,其马氏距离为 ( ( x μ ) T Σ 1 ( x μ ) ) \sqrt{( (x-μ)^TΣ^{-1}(x-μ) )}

协方差参考
马氏距离参考

可视化预测结果

已有model的3D包围盒角点数据,分别用真实的 R , t R,t 和预测出来的 R , t R,t 对3D包围盒的角点进行射影,可以观察两个盒子的重叠情况。
在这里插入图片描述
绿 绿色为真实框,蓝色为预测框

发布了30 篇原创文章 · 获赞 1 · 访问量 2419

猜你喜欢

转载自blog.csdn.net/McEason/article/details/103356153