2018年ECCV一篇十分经典的6D位姿估计/追踪的文章,至今仍是SOTA
论文链接:DeepIM: Deep Iterative Matching for 6D Pose Estimation
以匹配局部特征的方式,从图像中和物体的三维模型中抽取local feature进行匹配,得到2D-3D点对应然后求解物体位姿(PnP问题)
缺点:无法处理无纹理物体,因为无法抽取特征
预测输入图片像素点或关键点对应的三维坐标值,可以解决无纹理的问题
把位姿估计问题转换为位姿分类问题或位姿回归问题,前者把pose space离散化
2和3两种方法能解决无纹理的问题,但是很难达到高精确度,在分类或回归阶段一个很小的误差都可能导致位姿错误
提高位姿精确度的方法:pose refinement
利用深度信息的两种方法:
上述这两个基于RGB的方法和基于RGB-D的方法相比差距很大,作者认为这是因为这样的差距是因为RGB方法缺少有效的pose refinement过程
常用ICP算法(Iterative Closest Point)来对初始化的位姿进行refine,但是ICP对初始位姿非常敏感,并且容易收敛到局部最小值
输入:observed image(当前需要进行位姿估计的图片),initial pose estimation(对当前图片位姿的初始估计,比较粗略)
过程:zooming → \to → pose matching → \to → untangled representation of the relative SE(3) transformation
输出:relative SE(3) transformation(用于对输入的粗略的位姿估计进行refine)
要解决的问题:如果输入图像中目标物体特别小的话,提取到有用的feature是特别难的
解决方式:在送入网络之前,将输入图片和渲染图片进行缩放
如图所示,在第 i i i 阶段,给定上一时刻估计的位姿 p i − 1 p^{i-1} pi−1,用其渲染一张synthetic image,同时为输入图片和渲染图片各生成一张前景的mask,一共得到四张图片
根据两张前景mask生成enlarged bounding box,然后用此对四张图片同时进行裁剪。enlarged bounding box必须要确保与输入图像有相同的纵横比(aspect ratio)并以三维模型的原点的2D投影为中心 不是很明白这句centered at the 2D projection of the origin of the 3D object model是什么意思
最后对裁剪的图片进行缩放,应用双线性插值,让裁剪图片和原图有相同的尺寸
在整个操作期间,物体的aspect ratio是保持不变的
输入:一张8通道图片,即 H × W × 8 H\times W\times 8 H×W×8,8通道中输入图片和渲染图片各3通道(RGB),输入图片和渲染图片的mask图各1通道(灰度图)
backbone:FlowNetSimple architecture,是一个用来估计两张图片之间光流的框架
作者提到尝试使用VGG16图像分类网络作为backbone,但是效果太差,这也说明与光流相关的表示对pose matching很有用
从图中看,网络有上下两个分支:
上面的分支是pose estimation branch,以FlowNetSimple产生的feature map作为输入,得到feature map主要通过11个卷积层
pose eatimation branch主要是由两个256维的全连接层构成,然后针对transhlation和rotation分别设置两个全连接层来输出所需参数
下面的分支是仅在训练过程中有的,用来对feature的表示做regularize,提高训练的稳定性
其中一个产生光流,一个产生mask
前一帧的位姿用 [ R s r c ∣ t s r c ] [R_{src}|t_{src}] [Rsrc∣tsrc] 表示,那么两帧之间位姿的相对变化有下面三种表示法:
naive coordinate,即两帧之间位姿的相对变换用 Δ p = [ R Δ ∣ t Δ ] \Delta p=[R_{\Delta}|t_{\Delta}] Δp=[RΔ∣tΔ] 表示,那么当前帧的位姿即为 R t g t = R Δ R s r c , t t g t = R Δ t s r c + t Δ R_{tgt}=R_{\Delta}R_{src},t_{tgt}=R_{\Delta}t_{src}+t_{\Delta} Rtgt=RΔRsrc,ttgt=RΔtsrc+tΔ
可以看出 R Δ R_{\Delta} RΔ 同时参与了旋转和平移的计算,即使 t Δ = 0 t_{\Delta}=0 tΔ=0, t t g t t_{tgt} ttgt 也要算一次,所以naive coordinate显然不是一种最佳的表示
model coordinate,将问题解耦,让旋转不参与平移的运算,基本思想是将旋转中心从相机原点移到物体的中心点,然后绕三维模型坐标系下指定的坐标轴进行旋转
使用三维模型坐标系则需要网络记住每个三维模型的坐标轴,这会让网络更难训练,而且如果出现了没见过的物体则无法确定其坐标轴,显然也不是一种合适的表示
camera coordinate,将旋转中心从相机原点移到物体的中心点,然后在相机坐标系下估计旋转变换,这样的话就需要训练网络估算在相机坐标系下物体的相对旋转
相对平移量用 t Δ = ( v x , v y , v z ) t_{\Delta}=(v_x,v_y,v_z) tΔ=(vx,vy,vz) 表示,其中 v x v_x vx 和 v y v_y vy 是两帧图像之间物体沿图像的x轴和y轴移动的像素个数, v z v_z vz 是物体的放缩比例, f x f_x fx 和 f y f_y fy 是相机焦距(focal lengths of the camera),log是用来规避0值的:
v x = f x ( x t g t z t g t − x s r c z s r c ) v_x=f_x(\frac{x_{tgt}}{z_{tgt}}-\frac{x_{src}}{z_{src}}) vx=fx(ztgtxtgt−zsrcxsrc), v y = f y ( y t g t z t g t − y s r c z s r c ) v_y=f_y(\frac{y_{tgt}}{z_{tgt}}-\frac{y_{src}}{z_{src}}) vy=fy(ztgtytgt−zsrcysrc), v z = log ( z s r c z t g t ) v_z=\log(\frac{z_{src}}{z_{tgt}}) vz=log(ztgtzsrc)
这样表示平移量,就将三维坐标系下的平移估计转变为了二维图像上的平移量再加放缩系数,不受物体真是尺寸和内在坐标系的影响
传统的平移表示是 t Δ = t t g t − t s r c = ( x t g t , y t g t , z t g t ) − ( x s r c , y s r c , z s r c ) t_{\Delta}=t_{tgt}-t_{src}=(x_{tgt},y_{tgt},z_{tgt})-(x_{src},y_{src},z_{src}) tΔ=ttgt−tsrc=(xtgt,ytgt,ztgt)−(xsrc,ysrc,zsrc),但是在缺乏深度信息的情况下用2D图像信息很难直接估计3D平移,除非网络记住每个物体的尺寸,然后根据物体尺寸将2D空间映射到3D空间,这样的话就会产生和2同样的问题
用旋转和平移的分离误差(loss=角度误差+平移的L2距离)来训练网络很难去平衡这两种loss,因此作者参考了 Geometric loss functions for camera pose regression with deep learning 这篇文章的做法,修改了几何重投影误差作为loss function,称为point matching loss,其形式如下:
L p o s s ( p , p ^ ) = 1 n ∑ i = 1 n ( ( R x i + t ) − ( R ^ x i + t ^ ) L_{poss}(p,\hat p)=\frac{1}{n}\sum_{i=1}^n\bigl((Rx_i+t)-(\hat R x_i+\hat t\bigr) Lposs(p,p^)=n1∑i=1n((Rxi+t)−(R^xi+t^)
其中 p = [ R ∣ t ] p=[R|t] p=[R∣t] 是 ground truth, p ^ = [ R ^ ∣ t ^ ] \hat p=[\hat R|\hat t] p^=[R^∣t^] 是estimated pose, x i x_i xi 是物体三维模型上的随机采样点, n n n 是采样点的个数(在实验中设置为3000)
在训练过程中:将groud truth的pose增加随机噪声来作为初始位姿,用初始位姿渲染得到rendered image
在测试过程中作者发现the iterative pose refinement can significantly improve the accuracy,不断迭代的进行pose refinement能够提高精确度
同时作者还发现,if we train the network to regress the relative pose in a single step, the estimates of the trained network do not improve over multiple iterations in testing,如果训练的时候训练网络一步到位,那么在测试时迭代就不起作用了,所以在训练过程中也进行多次迭代
作者的是要主要是在LM和LM-O两个数据集上做的,实验结果和一些参数设置可以直接去看论文和源码,我这里只列一下三个评价指标: