这是在NeurIPS2018上的一篇文章,提出了一种检测RGB图像中3D关键点的category-specific方法。
针对某一类别,所提出的网络可以学习得到一组最优的3D隐藏关键点,以及对应的检测器。通过学习得到隐藏关键点,可以克服手工标注关键点工作量大和难定义的问题(expensive and ill-defined)。
网络的输入是同一物体的在不同视角下仿真得到的一对图像,以及目标的二值掩膜 b ( u , v ) b(u, v) b(u,v),输入为两个部分,每个关键点的概率图 g i ( u , v ) g_i(u, v) gi(u,v)和深度图 d i ( u , v ) d_i(u, v) di(u,v)。第 i i i个关键点在图像中的位置和深度值分别为:
[ u i , v i ] T = ∑ u , v [ u ⋅ g i ( u , v ) , v ⋅ g i ( u , v ) ] T z i = ∑ u , v d i ( u , v ) g i ( u , v ) [u_i, v_i]^T =\sum_{u, v}[u\cdot g_i(u, v), v\cdot g_i(u, v)]^T \\ z_i = \sum_{u, v}d_i(u, v)g_i(u, v) [ui,vi]T=u,v∑[u⋅gi(u,v),v⋅gi(u,v)]Tzi=u,v∑di(u,v)gi(u,v)
网络的损失函数分为四个部分:网络的损失函数分为五个部分:
- multi-view consistency loss,描述了在相机位姿变换真值下,左右输入图像中关键点集合的位置差异,用于保证在不同视角下可以稳定地跟踪同一区域,但是该损失函数会导致所有关键点向同一位置聚集;
- relative pose estimation loss,是角度的惩罚项,即输入图像对之间相机相对位姿的角度真值与由所检测关键点估计得到的相对角度的差值。角度的估计需要用到每个关键点的深度估计值,由SVD分解得到,该项损失有助于生成有意义且自然的3D隐藏关键点集合;
- separation loss,描述了关键点与3D坐标的一一对应关系,即没有两个关键点对应相同的3D坐标;
- silhouette consistency, 使关键点位于目标的轮廓内部,计算该损失用到了目标的掩膜 b ( u , v ) b(u, v) b(u,v)。该损失只在training时起作用,在test时值为0,因此 b ( u , v ) b(u, v) b(u,v)只在training时用到
- variance loss,描述了概率图的方差,最小化该损失会使概率图多峰(peaky),在目标轮廓为非凸时使关键点的均值位于轮廓内。
L c o n = 1 2 N ∑ i = 1 N ∥ [ u i , v i , u i ′ , v i ′ ] T − [ u ^ i , v ^ i , u ^ i ′ , v ^ i ′ ] T ∥ 2 L_{con}=\frac{1}{2N}\sum_{i=1}^{N}\left\|[u_i, v_i, u_i',v_i']^T-[\hat{u}_i, \hat{v}_i, \hat{u}_i',\hat{v}_i']^T\right\| ^2 Lcon=2N1i=1∑N∥∥[ui,vi,ui′,vi′]T−[u^i,v^i,u^i′,v^i′]T∥∥2
其中 [ u ^ i , v ^ i ] T [\hat{u}_i, \hat{v}_i]^T [u^i,v^i]T是右图中关键点坐标向左图的投影, [ u ^ i ′ , v ^ i ′ ] T [\hat{u}_i', \hat{v}_i']^T [u^i′,v^i′]T是左图中关键点坐标向右图的投影。
L p o s e = 2 arcsin 1 2 2 ∥ R ^ − R ∥ F L_{pose}=2\arcsin{\frac{1}{2\sqrt{2}}{\left\|\hat{R}-R\right\| _F}} Lpose=2arcsin221∥∥∥R^−R∥∥∥F
其中 R R R为相对位姿角度量真值, R ^ \hat{R} R^为相对位姿角度量估值。
L s e p = 1 N 2 ∑ i = 1 N ∑ j ≠ i N max ( 0 , δ 2 − ∥ X i − X j ∥ 2 ) L_{sep}=\frac{1}{N^2}\sum_{i=1}^{N}\sum_{j\neq i}^N\max{\left(0, \delta^2 - \left\| X_i - X_j \right\| ^2\right)} Lsep=N21i=1∑Nj̸=i∑Nmax(0,δ2−∥Xi−Xj∥2)
其中 X i X_i Xi为第 i i i个关键点对应的3D坐标。
L o b j = − 1 N ∑ i = 1 N log ∑ u , v b ( u , v ) g i ( u , v ) L_{obj}=-\frac{1}{N}\sum_{i=1}^N{\log{\sum_{u, v}b(u, v)g_i(u, v)}} Lobj=−N1i=1∑Nlogu,v∑b(u,v)gi(u,v)
L v a r = 1 N ∑ i = 1 N ∑ u , v g ( u , v ) ∥ [ u , v ] T − [ u i , v i ] T ∥ 2 L_{var}=\frac{1}{N}\sum_{i=1}^{N}\sum_{u, v}g(u, v)\left\|[u, v]^T-[u_i, v_i]^T\right\|^2 Lvar=N1i=1∑Nu,v∑g(u,v)∥∥[u,v]T−[ui,vi]T∥∥2
网络的输入是一对128x128x4的图像,关键点的数量是一个超参数,demo中设置为10。论文中进行了多组实验,比较了手工标注关键点等方法,结论是自动寻找隐藏关键点比较好。论文的代码在github上公开了,作者是google,代码在tensorflow中research中,写的还是比较好的,可以学习学习。
论文和demo中提供了三种物体,飞机、椅子和汽车。但是训练图像与测试图像都是仿真得到的。github上还提供了一个对汽车种类预训练好的模型,以及8幅汽车方针图像。使用预训练好的模型以及提供了测试图像可以得到论文中的结果。
但是我从网上下载了几幅真实图像,得不到期望的结果,说明这个模型对真实图像的适应性是比较差的。其次,我在自己电脑上跑了训练模型,论文中是在8块GPU上跑的,batchsize是8x32,我自己只有一块1070,只能用32大小的batch,测试了三种模型,分别采用了默认学习率0.001以及0.0005,在测试集上没有一次达到论文中的效果。