chensong1995 / HybridPose

HybridPose: 6D Object Pose Estimation under Hybrid Representation (CVPR 2020)
MIT License
412 stars 64 forks source link

关于PoseRegression::InitializePose #61

Open qifengluo opened 3 years ago

qifengluo commented 3 years ago

你好,请教一下PoseRegression::InitializePose方面的问题。在pose_regression_init.cpp的GenerateDataMatrix函数中把kp.point2D_pred的反对称矩阵分别与x_3d, y_3d, z_3d相乘,这样做的意义是什么?我看论文里面也没找到相关的推到公式,希望能解答,感谢分享。

chensong1995 commented 3 years ago

qifengluo 你好,

感谢你的提问!

这里的代码是在计算文章中公式 (1) 的雅可比矩阵。我们可以认为公式 (1) 定义了一个函数 f(x) = Ax,这里 A 的尺寸是 (3n, 12), x 的尺寸是 (12, 1),0 的尺寸是 (3n, 1) 。x 里包含了未知数,x = [r11, r21, r31, r12, r22, r32, r13, r23, r33, t1, t2, t3]^T,A 里包含了(x_hc, y_hc, z_hc, x_3d, y_3d, z_3d) 之间的一系列运算。我们对 f(x) 求一阶导数。由于 f(x) 的因变量尺寸是 (3n, 1),自变量尺寸是 (12, 1),我们会得到一个雅可比矩阵 J,J 的尺寸是 (12, 3n) 。

希望这对你有所帮助!

Grem-Lin commented 3 years ago

Hello qifengluo

这里主要 将文中公式(1)转换成Ax=0的形式,是element-wise的实现。首先,kp.point2D_pred我们没有使用反对称矩阵,公式中x 代表向量的叉乘。你可以把kp.point2D_pred的叉乘展开,同时将R 写成[r11,r12,r13,r21,r22,r23,r31,r32,r33] 将t写成[t1,t2,t3],根据公式(1)把向量里每个元素互相乘在一起,稍作整理,即可得到keypoint对矩阵A的贡献,即代码中J_kpts。同理你可以计算得到symmetry, edge 对于矩阵A的贡献J_sym, J_edge,最后带上相应权重加合在一起即可。

希望这对你有所帮助!

chensong1995 commented 3 years ago

谢谢 @Grem-Lin 的回答,她的解释更加清晰一些。我们这里并不是刻意想要求一阶导数用来做梯度优化。

我仔细看了一下代码,x的顺序应该是 [r11, r21, r31, r12, r22, r32, r13, r23, r33, t1, t2, t3],而不是 [r11,r12,r13,r21,r22,r23,r31,r32,r33]。这个J其实就是Ax里面那个A,由于它是Ax对x的一阶导数,所以我们用了J这个字母来表示。

tonglily commented 2 years ago

@chensong1995 @qifengluo @Grem-Lin 你好,我对文中公式2有疑问,不太明白这个公式的意义是什么。主要是不明白:得到edge的向量,通过这个向量如何去得到pose。 希望能得到回答,感谢!

chensong1995 commented 2 years ago

tonglily 你好,

感谢你对这篇文章的关注!

我们首先看公式1:乘号前面的是图像上的二维关键点在齐次坐标系下的表示,乘号后面的是物体坐标系的三维关键点经过旋转、平移之后得到的相机坐标系下的坐标。我们希望优化后的(R, t)可以解释每个关键点在三维、二维之间的对应关系。也就是说,我们希望乘号前后的两个向量是平行的。两个平行向量的叉乘应该是零。

我们再看公式2:基于公式1,我们知道 $\hat{p}_{et} \cross (R \cdot \overline{p}_{et} +t)$ 和 $\hat{p}_{es} \cross (R \cdot \overline{p}_{es} +t)$ 都应该是零。但是,这是建立在我们$\hat{p}_{et}$和$\hat{p}_{es}$这两个二维关键点预测非常准确的假设之上的。我们希望通过二维边向量的预测来弥补二维关键点预测的不准确。于是,我们把$\hat{p}_{et} \cross (R \cdot \overline{p}_{et} +t)$ 和 $\hat{p}_{es} \cross (R \cdot \overline{p}_{es} +t)$这两个式子相减,经过一些运算上的变形、合并同类项,我们就得到了公式2。

公式1、2、3都是关于$x=[r11, r21, r31, r12, r22, r32, r13, r23, r33, t1, t2, t3]$的线性方程组。这个线性系统里方程的个数比变量的个数多,所以没有办法找到一个解来满足所有的条件。我们通过文中描述的方法来求一个最优解,使得所有的线性方程尽可能得到满足。这个最优解就是我们对(R, t)的初始预测。

希望这对你有帮助!

tonglily commented 2 years ago

感谢你的回答,但我仍有一些疑问: 主要是对关键点模块和边模块在训练过程中是完全独立的有疑问。基于您的回答,公式2是基于公式1得到,公式2进行变换的时候会用上条件$\hat{p}{et}$=$\hat{p}{es}$+$\hat{ve}$进行合并同类项才能得到文章中的公式2,但是这样得到的$\hat{p}_{et}$其实并不是您关键点模块预测出来的点,跟您说的用了公式1的条件感觉有点出入。 希望能得到回答,感谢! @chensong1995

chensong1995 commented 2 years ago

tonglily 你好,

公式1只包含一种预测形式:关键点,而公式2里包含了两种预测:关键点和边向量。这两个公式确实有一些差别。但是,我们之所以预测几种不同的表示,正是希望它们之间能够互相制约、互相修正。从这个角度来看,即便公式2没有能够把边向量和关键点独立开,我们认为也是可以接受的。

希望这对你有所帮助!