ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

ECCV2018 oral MVSNet 错误公式纠正及正确源代码推导解释

2021-11-06 20:34:43  阅读:165  来源: 互联网

标签:R1 ECCV2018 t2 times3 R2 t1 bmatrix 源代码 oral


ECCV2018 的一篇 oral 论文 MVSNet: Depth Inference for Unstructured Multi-view Stereo 开启了用 深度学习做 MVS 的先河,但是在该篇论文的 3.2 Cost Volume 部分,却有一个关于 homography 的错误公式,令人匪夷所思的是,在它的Github 开源代码 的相关部分,代码却是按照正确的公式来写的。该论文的错误公式影响了后面的许多论文,比如 CVPR 2020的一篇 oral 论文Cascade Cost Volume for High-Resolution Multi-View Stereo and Stereo Matching本文会推导正确公式,并且解释 MVSNet 论文 Github 开源代码中相关代码为什么表示了正确了公式
在这里插入图片描述

图1. ECCV2018 MVSNet: Depth Inference for Unstructured Multi-view Stereo 论文中 3.2 Cost Volume 错误公式

在这里插入图片描述

图2. CVPR2020 Cascade Cost Volume for High-Resolution Multi-View Stereo and Stereo Matching 论文中 3.1. Cost volume Formulation 错误公式

首先,在 图1 公式中有个明显的错误,就是等式最右边的项 K 1 T K_{1}^{T} K1T​, 内参矩阵的转置毫无意义,论文中想要表达的是内参矩阵的逆,应该是 K 1 − 1 K_{1}^{-1} K1−1​。
为了推导出正确的公式,本文需要做两个准备

准备1 推导出关于两个视图的R, t

首先,对于数据集中的所有视图(image),共用一个公共的世界(大地)坐标系。在准备数据集的时候,每个视图都会做 calibration,都会得到从世界坐标系到每个视图的相机坐标系下需要做的旋转( 3 × 3 3\times3 3×3旋转矩阵)和平移( 3 × 1 3\times1 3×1平移向量)。论文中是多视图,且有对于每个 3d scene,指定第一张 image 为 reference image。在本文中,只需推导两个视图的情况针对多视图的公式,只需要固定 reference image的视图,另外一个视图更换成其他的视图即可

在这里插入图片描述

图3. 世界坐标系 W 到相机坐标系 C 旋转 R 1 R_{1} R1​, 平移 t 1 t_{1} t1​,世界坐标系 W 到相机坐标系 C ′ C^{'} C′ 需要旋转 R 2 R_{2} R2​, 平移 t 2 t_{2} t2​, 相机坐标系 C C C 到相机坐标系 C ′ C^{'} C′ 之间需要旋转 R R R, 平移 t t t。

设世界坐标系 W W W 任意一点 P P P,则 P P P 首先经过 R 1 , t 1 R_{1},t_{1} R1​,t1​ 到 相机坐标系 C C C 下,然后经过 R , t R,t R,t 到相机坐标系 C ′ C^{'} C′ 下,最后经过 R 2 , t 2 R_{2},t_{2} R2​,t2​的逆作用又重新回到世界坐标系 W W W 下的点 P P P,
[ R 2 t 2 0 1 × 3 1 ] − 1 [ R t 0 1 × 3 1 ] [ R 1 t 1 0 1 × 3 1 ] P = P (1) \begin{bmatrix} R_{2}&t_{2}\\ \bold{0}_{1\times3}&1\\ \end{bmatrix}^{-1} \begin{bmatrix} R&t\\ \bold{0}_{1\times3}&1\\ \end{bmatrix} \begin{bmatrix} R_{1}&t_{1}\\ \bold{0}_{1\times3}&1\\ \end{bmatrix}P=P\tag{1} [R2​01×3​​t2​1​]−1[R01×3​​t1​][R1​01×3​​t1​1​]P=P(1)
其中 P P P 为 4 × 1 4\times1 4×1 的齐次坐标。由于式(1)对世界坐标系 W W W 下任意的 点都成立,
[ R 2 t 2 0 1 × 3 1 ] − 1 [ R t 0 1 × 3 1 ] [ R 1 t 1 0 1 × 3 1 ] = I (2) \begin{bmatrix} R_{2}&t_{2}\\ \bold{0}_{1\times3}&1\\ \end{bmatrix}^{-1} \begin{bmatrix} R&t\\ \bold{0}_{1\times3}&1\\ \end{bmatrix} \begin{bmatrix} R_{1}&t_{1}\\ \bold{0}_{1\times3}&1\\ \end{bmatrix} = I\tag{2} [R2​01×3​​t2​1​]−1[R01×3​​t1​][R1​01×3​​t1​1​]=I(2)
其中, I I I 为 4 4 4 阶单位阵。由式(2)得
[ R t 0 1 × 3 1 ] = [ R 2 t 2 0 1 × 3 1 ] [ R 1 t 1 0 1 × 3 1 ] − 1 (3) \begin{bmatrix} R&t\\ \bold{0}_{1\times3}&1\\ \end{bmatrix} = \begin{bmatrix} R_{2}&t_{2}\\ \bold{0}_{1\times3}&1\\ \end{bmatrix} \begin{bmatrix} R_{1}&t_{1}\\ \bold{0}_{1\times3}&1\\ \end{bmatrix}^{-1} \tag{3} [R01×3​​t1​]=[R2​01×3​​t2​1​][R1​01×3​​t1​1​]−1(3)又
[ R 1 t 1 0 1 × 3 1 ] − 1 = [ R 1 − 1 − R 1 − 1 t 1 0 1 × 3 1 ] (4) \begin{bmatrix} R_{1}&t_{1}\\ \bold{0}_{1\times3}&1\\ \end{bmatrix}^{-1}= \begin{bmatrix} R_{1}^{-1}&-R_{1}^{-1}t_{1}\\ \bold{0}_{1\times3}&1\\ \end{bmatrix}\tag{4} [R1​01×3​​t1​1​]−1=[R1−1​01×3​​−R1−1​t1​1​](4)将式(4)带入式(3)得
[ R t 0 1 × 3 1 ] = [ R 2 R 1 − 1 − R 2 R 1 − 1 t 1 + t 2 0 1 × 3 1 ] (5) \begin{bmatrix} R&t\\ \bold{0}_{1\times3}&1\\ \end{bmatrix}= \begin{bmatrix} R_{2}R_{1}^{-1}&-R_{2}R_{1}^{-1}t_{1}+t_{2}\\ \bold{0}_{1\times3}&1\\ \end{bmatrix}\tag{5} [R01×3​​t1​]=[R2​R1−1​01×3​​−R2​R1−1​t1​+t2​1​](5)

R = R 2 R 1 − 1 (6) R = R_{2}R_{1}^{-1}\tag{6} R=R2​R1−1​(6) t = − R 2 R 1 − 1 t 1 + t 2 (7) t=-R_{2}R_{1}^{-1}t_{1}+t_{2}\tag{7} t=−R2​R1−1​t1​+t2​(7)

准备2 Homography 矩阵

在这里插入图片描述

图4. 两个相机视角 C C C, C ′ C^{'} C′ 同时看 3d 空间中 共面 3d点。

如果对 与法向量相关的 homography 矩阵不熟悉也没关系,请移步博文 Planar Homography(与平面法向量相关)
右视图像素平面的像素点 q ′ q^{'} q′ 和 左视图像素点平面的像素点 q q q 有如下关系:
q ′ = s K 2 ( R − t n T d ) K 1 − 1 q (8) q^{'}= sK_{2}(R-t\frac{n^{T}}{d})K_{1}^{-1}q \tag{8} q′=sK2​(R−tdnT​)K1−1​q(8) 从一个像素平面到另一个像素平面的 homography 矩阵
H = K 2 ( R − t n T d ) K 1 − 1 (9) H = K_{2}(R-t\frac{n^{T}}{d})K_{1}^{-1} \tag{9} H=K2​(R−tdnT​)K1−1​(9)

综合推导

将式(6)(7)带入式(9)得
H = K 2 ( R 2 R 1 − 1 − ( − R 2 R 1 − 1 t 1 + t 2 ) n T d ) K 1 − 1 (9) H = K_{2}(R_{2}R_{1}^{-1}-(-R_{2}R_{1}^{-1}t_{1}+t_{2})\frac{n^{T}}{d})K_{1}^{-1} \tag{9} H=K2​(R2​R1−1​−(−R2​R1−1​t1​+t2​)dnT​)K1−1​(9)本文想将式(9)往 图1 的形式变故向左提一个 R 2 R_2 R2​,得
H = K 2 R 2 ( R 1 − 1 − 1 d ( − R 1 − 1 t 1 + R 2 − 1 t 2 ) n T ) K 1 − 1 H = K_{2}R_{2}(R_{1}^{-1}-\frac{1}{d}(-R_{1}^{-1}t_{1}+R_{2}^{-1}t_{2}){n^{T}})K_{1}^{-1} H=K2​R2​(R1−1​−d1​(−R1−1​t1​+R2−1​t2​)nT)K1−1​进而向右边提一个 R 1 − 1 R_{1}^{-1} R1−1​,注意 R 1 − 1 = R 1 T R_{1}^{-1}=R_{1}^{T} R1−1​=R1T​, 得
H = K 2 R 2 ( I − 1 d ( − R 1 − 1 t 1 + R 2 − 1 t 2 ) n T R 1 ) R 1 T K 1 − 1 (10) H = K_{2}R_{2}(I-\frac{1}{d}(-R_{1}^{-1}t_{1}+R_{2}^{-1}t_{2}){n^{T}}R_{1})R_{1}^{T}K_{1}^{-1}\tag{10} H=K2​R2​(I−d1​(−R1−1​t1​+R2−1​t2​)nTR1​)R1T​K1−1​(10)
对比 图1 公式和 式(10),要想两者相等,则需要式11恒成立
( − R 1 − 1 t 1 + R 2 − 1 t 2 ) n T R 1 = ( t 1 − t 2 ) n T (11) (-R_{1}^{-1}t_{1}+R_{2}^{-1}t_{2})n^{T}R_{1} = (t_{1}-t_{2})n^{T} \tag{11} (−R1−1​t1​+R2−1​t2​)nTR1​=(t1​−t2​)nT(11) 但是式(11)显然不一定恒成立。
故图1,图2所示公式错误,正确公式为(10),且错误公式与正确公式相差的就在式(11)的等号左右。等号左边为正确,等号右边为错误。

源代码解释

相关代码在Github 开源代码mvsnethomography_warping.py中。令人匪夷所思的是,源代码是按照正确的公式(10)写的。错误公式与正确公式相差的就在式(11)的等号左右两边的式子。等号左边为正确,等号右边为错误。

首先 图5 源代码截图中的变量 t l e f t t_{left} tleft​ 对应本文公式中的 t 1 t_{1} t1​,变量 R l e f t R_{left} Rleft​ 对应 R 1 R_1 R1​, 变量 R l e f t _ t r a n s R_{left\_trans} Rleft_trans​ 对应 R 1 T R_{1}^{T} R1T​,又 R 1 T = R 1 − 1 R_1^{T}=R_{1}^{-1} R1T​=R1−1​,故变量 c l e f t = − R 1 − 1 t 1 c_{left}=-R_{1}^{-1}t_{1} cleft​=−R1−1​t1​ c r i g h t = − R 2 − 1 t 2 c_{right}=-R_{2}^{-1}t_{2} cright​=−R2−1​t2​ c r e l a t i v e = R 1 − 1 t 1 − R 2 − 1 t 2 (12) c_{relative}=R_{1}^{-1}t_{1}-R_{2}^{-1}t_{2}\tag{12} crelative​=R1−1​t1​−R2−1​t2​(12) 式(12)与式(10)是匹配的。
在这里插入图片描述

图5. homography_warping.py 79-81行

下面再来看一下令人感觉莫名奇妙的一行代码(homography_warping.py 第77行代码)

fronto_direction = tf.slice(tf.squeeze(R_left, axis=1), [0, 2, 0], [-1, 1, 3])          # (B, D, 1, 3)

首先这个代码是 tensorflow 框架,所以需要对 tensorflow有点了解。代码的意思呢是取出 R l e f t R_{left} Rleft​ 的第三行赋值给 fronto_direction 。由于 R l e f t R_{left} Rleft​ 也就是 R 1 R_{1} R1​ 是一个 3 × 3 3\times3 3×3的矩阵,[0, 2, 0], [-1, 1, 3] 的含义是从 第2+1行第0+1列竖直方向取1行,水平方向取3列,也就是取 矩阵 R 1 R_1 R1​ 的第 3 3 3 行。那么为什么要写这么一行莫名其妙的代码?fronto_direction 是不是 − n T R 1 -n^{T}R_{1} −nTR1​?如果是那么
c r e l a t i v e × f r o n t o _ d i r e c t i o n : = ( − R 1 − 1 t 1 + R 2 − 1 t 2 ) n T R 1 c_{relative}\times{fronto\_direction } := (-R_{1}^{-1}t_{1}+R_{2}^{-1}t_{2})n^{T}R_{1} crelative​×fronto_direction:=(−R1−1​t1​+R2−1​t2​)nTR1​

[0, 2, 0], [-1, 1, 3])          # (B, D, 1, 3)

确实如此。
在这里插入图片描述

图6. Plane Sweeping

图6是俯视图,论文MVSNet: Depth Inference for Unstructured Multi-view Stereo 是在相机平面前面每隔一段距离“插”一个与相机平面平行(fronto-parallel)的平面,平面的法向量 n n n 指向相机 COP,故
n = ( 0 , 0 , − 1 ) T n= (0,0,-1)^{T} n=(0,0,−1)T 则 从矩阵 R 1 R_{1} R1​ 抽出第三行构成一个向量的结果等于 − n T R 1 -n^{T}R_{1} −nTR1​ 。

说明

本文全文的内容来自YOTUBE视频 ☆賀1000人訂閱★ Mutli-view stereo多視角立體重建技術介紹 ※又發現論文裡的錯誤了!,该大佬的Github

标签:R1,ECCV2018,t2,times3,R2,t1,bmatrix,源代码,oral
来源: https://blog.csdn.net/OrdinaryMatthew/article/details/121179641

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有