3D mesh重建001- CVPR2021-Self -Supervised 3D Mesh Reconstruction from Single Images
作者提出一种数据友好的mesh重建方法,算法本身对数据要求较低,只需要原始图像与图像轮廓,并不需要额外的数据标注,在这一点上这个算法是很有利于迁移到其他场景下的。作者在摘要中强调如果没有3D监督,重建效果通常不够优秀。他们提出了一种 supervised Mesh Reconstruction (SMR) 的方法。一般在重建中, 循环一致性 是一个很重要也很基础的概念。作者的本论文的基础设定有两个: 1)插值一致性 即插值算法的到的3D属性应该和预测的保持一致; 2)landmark一致性 即任何特征点在物体上都具有唯一性。最后再次重申该算法取得了较好的效果,而且也可以用于生成新视角,形状变换和纹理变化。
Self-Supervised 3D Mesh Reconstruction from Single Images
百度网盘-论文
Github
这部分再次强调基于3D监督的一些论文方法取得了较好的效果,但是他们是需要扫描的3维数据和3D形式的标注作为数据集进行重建的。在现实场景中,3D形式的数据的确会比2D数据更难获取。因此有很多基于2D监督的一些方法就巧妙的切中这样一个痛点。在图1中给出了本研究的两个核心贡献点, 1)插值一致性 和 2)landmark一致性 。具体的做法在第3部分的方法中进行介绍分析。
该部分对现有方法使用的监督方式进行了一些点评。目前有 1)3D supervised reconstruction , 2)2D supervised reconstruction ,和 3)unsupervised reconstruction 。
Pixel2mesh和Mesh-R-CNN就是通过学习形状属性和一些特征对顶点进行重建,其中就会用到真实的GT。这些论文就属于3D监督,后续陆续分享文献学习心得。CMR是率先将2D监督运用到3D重建中,并使用可微渲染器将3D再次回到2维。此论文用到的2D监督和landmarks回归的思路整体上被SMR继承,并加以修改。无监督学习方式也被CSM,SSV和MUNIT等基于循环一致性进行利用。
作者训练了一组encoder分别去重建camera,light,shape和texture等属性。
在这部分对3D mesh结构进行了表示,并简单概括了一下作者自己使用什么的方式对三维结构进行表示的。
O ( S , T ) O(S,T) O(S,T)用以表示三维空间中的mesh结构,其中 S S S代表的是shape,在这边论文中具体是指顶点和面, S ∈ R V × 3 S\in R^{V\times3} S∈RV×3,在形状属性 S S S中V代表顶点数。其中 T T T 代表的纹理, T ∈ R H × W × 3 T\in R^{H\times W\times3} T∈RH×W×3,其中 H , W H,W H,W是UV图中的分辨率。UV mapping可以简单理解为,一个表示转换纹理更友好的坐标系。对于相机来说考虑的是它的内部蚕食 C = ( a , e , d ) C=(a,e,d) C=(a,e,d),分别代表方位,俯仰和距离参数。关于灯光属性用 L ∈ R l L\in R^l L∈Rl表示。
采用以上的四种属性来构成目标的3D属性 A = [ C , L , S , T ] A=[C,L,S,T] A=[C,L,S,T],根据视角参数 C C C和灯光参数 L L L,一个3d目标 O ( S , T ) O(S,T) O(S,T)能被渲染成 X r = [ I r , M r ] X^r=[I^r,M^r] Xr=[Ir,Mr],其中 I r I^r Ir代表的是2D图像, M r M^r Mr代表的是图像轮廓。以上内容可以整体表示为
R ( A ) = R ( [ C , L , S , T ] ) = X r (1) R(A)=R([C,L,S,T])=X^r \tag{1} R(A)=R([C,L,S,T])=Xr(1)对于这个式子从左到右是图像的渲染过程,从右到左就是图像获得3D属性的过程。
3D重建的过程就是训练这样一个编码器 E θ E_{\theta} Eθ能够将通过输入的 X i X_i Xi重建出物体的3D属性 A Q i = [ C i , L i , S i , T i ] = E θ ( X i ) ((2)) AQ_i=[C_i,L_i,S_i,T_i]=E_{\theta}(X_i)\tag{(2)} AQi=[Ci,Li,Si,Ti]=Eθ(Xi)((2))如3.1中提到的可以认为编码器 E θ E_{\theta} Eθ和渲染器 R R R是一个完全相反的处理过程。如下图fig2所示,作者把渲染器氛围4个单独的分支渲染器。在 E C = [ a x , a y , e , d ] E_C=[a_x,a_y,e,d] EC=[ax,ay,e,d]中 a x 和 a y a_x和a_y ax和ay可以通过公式计算出方位,公式为 a = a t a n 2 ( a x , a y ) a=atan2(a_x,a_y) a=atan2(ax,ay),作者说这么做主要为了避免回归过程中定义域的不连续问题。对于 E S E_S ES,主要计算形状的增量 S = Δ S + S 0 S=\Delta S+S_0 S=ΔS+S0. 对于 E t E_t Et并没有直接输出UV map ,而是先预测2D的flow map 在通过空间转换生成纹理UV map,他这一做法是参考CMR, E l E_l El直接编码把一个l-dim变量编码为空间谐波模型参数。如果使用3D监督进行训练的话 ,优化方式如下 θ = a r g m i n θ 1 N ∣ ∣ E θ ( X i ) − A i g t ∣ ∣ (3) \theta=arg \mathop{min}\limits_{\theta}\frac{1}{N}||E_{\theta}(X_i)-A^{gt}_{i}|| \tag{3} θ=argθminN1∣∣Eθ(Xi)−Aigt∣∣(3)
如下所示是论文中提到的监督方式以及循环一致性和插值一致性示意图简图。
对于2D监督来说就是控制 X i X_i Xi和 R ( E θ ( X i ) ) R(E_{\theta}(X_i)) R(Eθ(Xi))之间的距离,具体含义为把图像输入到 E θ E_{\theta} Eθ中预测出3D属性,再把预测的属性头方法R渲染管道中,再次生成一个个2维的图像。计算方法为 θ = a r g m i n θ 1 N ∑ i = 1 N D i s t ( R ( E θ ( X i ) ) , X i ) (4) \theta=arg \mathop{min}\limits_{\theta}\frac{1}{N}\mathop{\sum}\limits_{i=1}^{N}Dist(R(E_{\theta}(X_i)),X_i)\tag{4} θ=argθminN1i=1∑NDist(R(Eθ(Xi)),Xi)(4)由于输入图像为RGB加一个轮廓,具体的Distance计算方法如下 { L 2 D = λ i m g L i m g + λ s i l L s i l L i m g = 1 N ∑ i = 1 N ∣ ∣ I i ⊙ M i − I i r ⊙ M i r ∣ ∣ 1 L s i l = 1 N ∑ i = 1 N ( 1 − ∣ ∣ M i ⊙ M i r ∣ ∣ 1 M i + M i r − M i ⊙ M i r ) (5) \left\{ \begin{array}{c} L_{2D}=\lambda_{img}L_{img}+\lambda{sil}L_{sil} \\ L_{img}=\frac{1}{N}\mathop{\sum}\limits_{i=1}^{N}||I_i \odot M_i-I_i^r \odot M_i^r||_1\\ L_{sil}=\frac{1}{N}\mathop{\sum}\limits_{i=1}^{N}(1-\frac{||M_i\odot M_i^r||_1}{M_i+M_i^r-M_i\odot M_i^r}) \end{array} \right \tag{5}. ⎩⎪⎪⎪⎪⎨⎪⎪⎪⎪⎧L2D=λimgLimg+λsilLsilLimg=N1i=1∑N∣∣Ii⊙Mi−Iir⊙Mir∣∣1Lsil=N1i=1∑N(1−Mi+Mir−Mi⊙Mir∣∣Mi⊙Mir∣∣1)(5)
因为3D监督相较于2D监督会有很大的优势,作者就采用自监督的方式对 E θ E_{\theta} Eθ进行3D属性级别的监督。当输入一张图像进入编码器后,他会生成一组3D的属性,如何实现自监督呢,就是将这组3D属性经过R渲染器生成图片后再次放入编码器,生成新的一组3D属性,对比控制这两组属性的距离。计算方法如下 θ = a r g m i n θ ∑ i = 1 N ∣ ∣ E θ ( R ( E θ ( X i ) ) ) − E θ ( X i ) ∣ ∣ 1 (6) \theta=arg \mathop{min}\limits_{\theta}\mathop{\sum}\limits_{i=1}^{N}||E_{\theta}(R(E_{\theta}(X_i)))-E_{\theta}(X_i)||_1 \tag{6} θ=argθmini=1∑N∣∣Eθ(R(Eθ(Xi)))−Eθ(Xi)∣∣1(6)
为什么要用到插值一致性呢,因为在3D重建中,数据的丰富度一直是不够的,作者基于这样一个问题加入了插值算法来增加数据的多样性。
上图所示,作者在属性 A i A_i Ai和 A j A_j Aj之间进行插值。计算方法如下 A i j α = [ C i j α , L i j α , S i j α , T i j α ] = ( 1 − α ) ⋅ A i + α ⋅ A j (7) A_{ij}^{\alpha}=[C_{ij}^{\alpha},L_{ij}^{\alpha},S_{ij}^{\alpha},T_{ij}^{\alpha}]=(1-\alpha)\cdot A_i+\alpha \cdot A_j\tag{7} Aijα=[Cijα,Lijα,Sijα,Tijα]=(1−α)⋅Ai+α⋅Aj(7)
作者还在该部分介绍了这些属性插值对应的意义。关于插值属性自监督实现方法如下,先根据插值产生的属性喂入Render产生一组image, X i j α = R ( A i j α ) X_{ij}^{\alpha}=R(A_{ij}^{\alpha}) Xijα=R(Aijα),再将图像喂入编码器 E θ E_{\theta} Eθ产生新的3D属性,二者之间形成一个自监督,计算方法为 L I C = 1 N ∑ i = 1 N ∣ ∣ E θ ( X i j α − A i j α ) ∣ ∣ 1 (8) L_{IC}=\frac{1}{N}\mathop{\sum}\limits_{i=1}^{N}||E_{\theta}(X_{ij}^{\alpha}-A_{ij}^{\alpha})||_1\tag{8} LIC=N1i=1∑N∣∣Eθ(Xijα−Aijα)∣∣1(8)
因为插值可以在两组图像中间产生新的的属性,因此作者认为他们为重建出更加细度的模型提供了帮助。
另外一点值得商榷的是直接线性插值是否取得了足够好的效果,验证不够充分。因为里面涉及到了成像原理,虽然作者的做法已经取得了很好的成绩也许会存在一些更好的处理方式。
作者提出在所有的渲染对象中landmarks应该保持一致,这也和符合我们的视觉感受,即一个物体上的任何一部分都应该是独一无二的。
作者的操作方法是,先通过 E f E_f Ef生成一个feature map。featuremap经过转化调整产生的分类结果和landmark的分类结果应该保持一致,损失表示为 l L C = − 1 N ∑ i = 1 N ∑ k = 1 V v k y k l o g ( D ϕ ( f k ) ) (9) l_{LC}=-\frac{1}{N}\mathop{\sum}\limits_{i=1}^{N}\mathop{\sum}\limits_{k=1}^{V}v_ky_klog(D_{\phi}(f_k))\tag{9} lLC=−N1i=1∑Nk=1∑Vvkyklog(Dϕ(fk))(9)
其中 y k y_k ykshape为V1,在第 k t h 位 置 为 1 k_{th}位置为1 kth位置为1说明该元素可见。 v k v_k vk是shape为1V的独热编码,在 k t h 上 为 1 k_{th}上为1 kth上为1。
论文的全局损失是这样定义的,主要包括三部分image层次的 l 2 D l_{2D} l2D,3D 属性级别的的 L I C L_{IC} LIC和 L L C L_{LC} LLC,计算方法如下 L = λ 2 D L 2 D + λ I C L I C + λ L C L L C (10) L=\lambda_{2D}L_{2D}+\lambda_{IC}L_{IC}+\lambda_{LC}L_{LC}\tag{10} L=λ2DL2D+λICLIC+λLCLLC(10)
作者的实验设置部分还算比较严谨,4.2分别设置了IC+LC+2D监督和IC+LC+无监督的实验,4.3还和当前的SOTA进行对比,另外4.4还测试了其他物体的重建,4.5最后将算法用于物体的生成。
用到了三个数据集ShapeNet,BFM和CUB。在ShapeNet上用的3DIoU评价指标,在BFM上用的Scale-Invariant Depth Error(SIDE)和Mean Angle Devition(MAD),在CUB上没有3D标注,作者和SOTA进行的对比。在介绍数据之余,作者对网络的一些情况进行了说明,mesh的参数V=642,faces=1280,loss的权重通过网格搜索的方式确定,并且采用DIB-R作为渲染器(2019年论文提出的思想)。
监督方式和模块组合的效果如下图。整体来说,3D监督效果的确是更好,此外LC和IC模块也取得了较好的效果。在无监督的形式下也取得了较好的效果。
在这部分与SOTA的标注和效果进行对比,并对每个模块的作用做了测试。
作者为了进一步强调自己网络的性能,用其他物体进行重建和生成。
作者对整篇论文做了总结,我们的SMR效果优秀,IC和LC也产生了积极影响。并指出网络在变形能力较强的物体重建方面效果欠佳。按照我的理解就是,就是对一些经常有各种动作而导致对称性差的物体难以重建。但是有一点问题是,作者整体的表现是在鸟类身上进行的,而鸟类一般属于比较容易重建的对象,并没有在较为复杂的物体上和别的网络对比,也没有和每个网络在其性能最好的类别上比较,不知道能不能算是一种巧妙的田忌赛马。
我们直接找到 SMR github进行clone。按照说明进行安装,最基本的要求是CUDA>=10.0.130
$ conda create --name smr python=3.6.2
$ conda activate smr
我们在这里我们并没有按照作者提供的傻瓜式进行安装,因为其中涉及的kaolin安装在自动安装时会遇到各种形式错误,安装方法可以参考来一篇博客三维重建工具001-——正确安装kaolin库并在SMR上运行。
注意安装kaolin和SMR时pytorch版本要向上靠近。
conda install pytorch==1.6.0 torchvision==0.7.0 cudatoolkit=10.2 -c pytorch
其他库tqdm, trimesh, imageio, tensorboard.单独安装。或者在requirements.txt文件中把安装kaolin的代码注释掉。
我们设置的batchsize=64,经过500epoch后,如图所示为三组照片 X a , X b , X a b X_a,X_b,X_{ab} Xa,Xb,Xab。对于一组输入 X a X_a Xa随机排列产生 X b X_b Xb,通过 E θ E_{\theta} Eθ产生属性 A a , A b A_a,A_b Aa,Ab插值产生属性 A a b A_{ab} Aab将插值属性喂入diffirender中产生新的插值图像和属性。最终生成的效果如图,加上纹理贴图后视觉效果会好点。由于64组形成的gif超出上传图片的限制,采用源码中的8组进行展示。
网络整体分为四个部分: E θ , E l a n d m a r k , E d i s c r i m i n a t o r 和 D i f f i r e n d e r E_{\theta},E_{landmark},E_{discriminator}和Diffirender Eθ,Elandmark,Ediscriminator和Diffirender。四个部分的具体功能如下图所示。需要了解的可以到百度网盘进行下载SMR提取码:ruo1
代码整体结构都很简单,5个编码器中,4个子编码器的组成只包含5个卷积块+池化层+线性层,另外一个就是预训练VGG,这个和论文中说的U-Net并不一致。渲染器部分采用DIB-R,判别器也只有基层的网络,landmark网络只包含一些运算和一个线性层。需要了解的可以到百度网盘进行下载SMR提取码:ruo1
论文整体结构超级简单,效果在鸟的重建较为优秀。通过单张图像来恢复3D属性,在自监督和2D监督的基础上加入了一个插值一致性模块,该模块取得了一定效果,但是感觉尚有提升空间。在CMR在landmark上提出landmar一致性,极大成都的丰富了细节部分。
SMR提取码:ruo1
SMR github