详解Single-Image Piece-wise Planar 3D Reconstruction via Associative Embedding

Markdown

Motivation

理解从图像上提取平面。这个是最新的图片的平面提取。

论文序列

3)Single-Image Piece-wise Planar 3D Reconstruction via Associative Embedding

论文目标

详解Single-Image Piece-wise Planar 3D Reconstruction via Associative Embedding

为什么能够提取平面

它包括三个部分,一个语义提取平面和非平面的mask的encoder(典型的语音分割);一个plane embed encoder(这是?还没有完全看懂);一个平面参数的encoder,之前提到过它能够直接回归3D平面的参数,可以见到文章PLANNET。

创新贡献

1)这篇论文是19年的论文,但是它和之前的网络对比,能够提取任意数量的平面,类似于之前的论文PlaneRCNN: 3D Plane Detection and Reconstruction from a Single Image。但是它提取平面的方式不同。因为之前PlaneRCNN方法使用的是MASK-RCNN的proposal区域实例分割的变种方法,而这篇论文使用的是其它方式是proposal-free的实例分割方法。它使用语义的方式进行实例分割方式分割平面,详细见:Semantic instance segmentation with a discriminative loss function。
2)除了上面的变化,采用了一个embedding model方式,其中什么是embedding model方式?它指的是将像素放入到高维空间,指的是某个embedding空间,在这个空间内部,它能够更好的分类分割。看下图的表示如下。
详解Single-Image Piece-wise Planar 3D Reconstruction via Associative Embedding
上图可以看到,**将像素映射到plane embedding 空间,并且训练强制相同的平面上的像素在plane embedding空间之间的距离更加近。这样就可以得到更好的区域进行分割。**同时论文中提出了一个算法,让embedding 空间中相同的平面的像素对应的plane embedding具有相近的值。
3)提供了embedding model的方式,得到了相同的平面的像素在空间上具有相近的值,论文中同时对这些值进行移动,用聚类的思想,相近的值聚在一起,同时不相近的值之间尽量分开。这样就可以得到不同的平面分割(打破了分割的K值)。

网络整体架构

详解Single-Image Piece-wise Planar 3D Reconstruction via Associative Embedding
这是整体的网络架构,下面将介绍网络的各个部分的作用。

Plane Seg Decoder

这是对图片中的像素进行的平面提取,但是图像上有很多非平面的像素,比如一些树木,或者圆柱的物体,对后续的平面提取中会出现问题。同时有一个问题就是因为平面和平面交叉的地方会有一个弧度,这个弧度会导致平面分割会出现一些问题,不能表示交叉的地方属于哪个平面所以需要一个mask操作让非平面区域去掉。所以添加了这个mask网络。
主要的网络操作如下:
详解Single-Image Piece-wise Planar 3D Reconstruction via Associative Embedding
论文里面提的是用ResNet-101-FPN的拓展版本。它主要是Enconder各类信息。它用于区分平面和非平面的区域分割。
它的loss函数如下:
L S = − ( 1 − w ) ∑ i ∈ F l o g p i − w ∑ i ∈ B l o g ( 1 − p i ) (1) L_S = -(1-w)\sum_{i \in F}logp_i - w\sum_{i \in B}log(1-p_i) \tag{1} LS​=−(1−w)i∈F∑​logpi​−wi∈B∑​log(1−pi​)(1)
用于生存平面mask和非平面mask等等。具体的loss函数,后面再说。

Plane embed Decoder

这个网络模块是将像素映射到更高维的空间。称为embedding 空间。因为它能生成平面的空间所以称为plane embeddings。它的作用是在这个空间中,平面之间能够区分开,之前的图片也能够解释了。同时它和上面的Plane Seg的输出进行合并。通过一个Mean shit网络,让分割的效果更加好。主要的做法是对plane embedding空间的数据进行操作,让在同一个平面的像素在plane embbeding空间中它们的距离相近,强制相近,论文称为pull。不同平面的像素在plane embbeding 空间上它们距离拉远。论文称为push。这两个操作,使用了聚类。它的主要架构是:
详解Single-Image Piece-wise Planar 3D Reconstruction via Associative Embedding
其中生成的plane embedding 先和第一步的mask进行mask,去掉非平面的部分,然后用上面的Mean shift网络对plane embedding进行操作。让同一个平面上的像素在plane embedding空间中尽量挤在一起,同时将不同平面的像素在plane embedding空间中尽量拆开,导致如下的loss函数。
L E = L p u l l + L p u s h (2) L_E = L_{pull}+L_{push} \tag{2} LE​=Lpull​+Lpush​(2)
其中 L E L_E LE​表示同样的像素平面在一起和不同平面的像素在embedding空间不在一起。具体的Loss函数后面设计再说。

Plane Param Decoder

这一步其实说是计算每一个像素的平面坐标,其实在我看来是计算每个像素的normal,这个之前论文中也提到过用神经网络计算图片上每个像素的nomal。然后直接回归每个像素的normal。但是这个稍微有些区别,它回归的是包含深度。对于平面的表示可以用三个参数,就可以了。我们假设一个平面上的点为 Q Q Q,它的normal是为 n 0 n^0 n0表示原始的法向量。通过计算,得到平面的表示为: n T Q = 1 n^TQ=1 nTQ=1。推导这个公式如下:
计算平面点 Q ( x 0 , y 0 , z 0 ) Q(x_0, y_0, z_0) Q(x0​,y0​,z0​)和上面的点向量 Q ( x 0 , x 1 , x 2 ) Q(x_0, x_1, x_2) Q(x0​,x1​,x2​)(它表示原点到平面最近的点的距离,和平面垂直且在平面上)。它所在的平面如下:
Q ∗ ( P T − Q T ) = 0 = > Q ∗ P T = Q ∗ Q T Q*(P^T-Q^T)=0=>Q*P^T=Q*Q^T Q∗(PT−QT)=0=>Q∗PT=Q∗QT
其中 Q ∗ Q T Q*Q^T Q∗QT表示顶点到原点的距离,表示为 d 2 d^2 d2。所以得到如下公式:
Q ∗ P T / d 2 = 1 Q*P^T/d^2=1 Q∗PT/d2=1
其中 Q / d Q/d Q/d为平面的normal值。如果我们再将它表示一下,当表示为normal值除以 Q Q Q点到原点的距离。则可以表示为: N P = 1 N^P=1 NP=1。我们可以通过 N N N唯一表示一个平面。这个N表示 n o r m a l / d normal/d normal/d,平面上法向量和原点到平面上最近的顶点距离。 N N N的三个参数就可以了。
论文中回归平面的三个参数,它的loss函数为距离差,就是上面表示平面的距离。因为计算每个像素的平面,所以得到如下loss
L p p = 1 N ∑ i = 1 N ∣ ∣ n i − n i ∗ ∣ ∣ (3) L_{pp}=\frac{1}{N}\sum_{i=1}^N||n_i-n_i^*|| \tag{3} Lpp​=N1​i=1∑N​∣∣ni​−ni∗​∣∣(3)
其中 n i n_i ni​表示预测的平面的参数, n i ∗ n_i^* ni∗​表示第i个pixel真实的平面参数。
论文中找到了一个很好的平面参数,它可以很好表达平面,这个特征可以得到用于平面的提取。提取到合适的平面,需要将平面和之前的分割平面进行统一。论文提出的就是将像素级别的参数group到平面级别的参数,就是将相近的平面级别的参数进行group,这个非常重要,每一个像素级别的平面参数可以合并。具体的网络架构如下:
详解Single-Image Piece-wise Planar 3D Reconstruction via Associative Embedding
这是对平面上的

Loss函数设计

(为什么能够这样设计)?
Plane embed Decoder这个直接就是一个分割网络,直接区别哪些是平面哪些是非平面。
L S = − ( 1 − w ) ∑ i ∈ F l o g p i − w ∑ i ∈ B l o g ( 1 − p i ) (1) L_S = -(1-w)\sum_{i \in F}logp_i - w\sum_{i \in B}log(1-p_i) \tag{1} LS​=−(1−w)i∈F∑​logpi​−wi∈B∑​log(1−pi​)(1)
这是一个简单的像素贴上二维标签的问题。也是一个balanced model。其中 p i p_i pi​脑婆睡觉哦像素i属于前景的问题,其中 F , B F,B F,B表示前景和背景, w w w表示前景和背景的像素比等等,具体的可以看论文。

Plane embed Decoder
这个部分也是论文的创新点,可以查看这个创新点。如下:
它的网络设计的loss函数主要是让同一个平面的像素在plane embedding空间尽量接近。如下操作。
L p u l l = 1 C ∑ c = 1 C 1 N c ∑ i = 1 N c m a x ( ∣ ∣ μ c − x i ∣ ∣ − δ v , 0 ) (3) L_{pull} =\frac{1}{C}\sum_{c=1}^{C}\frac{1}{N_c}\sum_{i=1}^{N_c}max(||\mu_c-x_i||-\delta_v,0) \tag{3} Lpull​=C1​c=1∑C​Nc​1​i=1∑Nc​​max(∣∣μc​−xi​∣∣−δv​,0)(3)

L p u s h = 1 C ( C − 1 ) ∑ c A = 1 C ∑ c B = 1 C m a x ( − ∣ ∣ μ c A − μ c B ∣ ∣ + δ d , 0 ) (4) L_{push} =\frac{1}{C(C-1)}\sum_{c_A=1}^{C}\sum_{c_B=1}^{C}max(-||\mu_{c_A}-\mu_{c_B}||+\delta_d,0) \tag{4} Lpush​=C(C−1)1​cA​=1∑C​cB​=1∑C​max(−∣∣μcA​​−μcB​​∣∣+δd​,0)(4) 其中 c A ! = c B c_A != c_B cA​!=cB​
其中这个公式可以看到如下: C C C表示groundtruth的平面的数量, N c N_c Nc​表示在簇集合 c c c的元素的数量。 μ c A , μ c b \mu_{c_A},\mu_{c_b} μcA​​,μcb​​表示各簇 c A , c B c_A,c_B cA​,cB​的均值。同时
δ v , δ d \delta_v,\delta_d δv​,δd​表示pull和push的loss margin.这个是聚类的思想,可以看到它的表示让像素中的pixel embedding( x i x_i xi​),在聚类,同一个平面(表示它们的差值是小于 δ v \delta_v δv​),loss没有惩罚项,要是大于这个阈值,表示不在一个平面上,就开始惩罚。这样就可以让相近的pixel embedding聚集在一起。同时当两个cluster越近,则惩罚项越大。同时当他们大于 δ d \delta_d δd​则不具有惩罚项。这样是聚类的思想。这样就可以让相近的在一起。因为需要将他们聚类称为一个个平面,用mean shift cluster算法。它需要计算每两个像素pixel embeding之间的距离。这个算法的时间复杂度过高,因此需要用anchor的思想。设置一个个anchors,然后将每个像素对应到最近的anchor。其中用k,d表示每一维的anchor的数量,和embedding的维度。这样只要生成 k d k^d kd个anchors就可以了。这样计算embedding向量 x i x_i xi​和anchor a j a_j aj​对应的potential即可,表示为:
p i , j = 1 2 π e x p ( − m i j 2 2 b 2 ) (5) p_{i,j}=\frac{1}{\sqrt{2\pi}}exp{(-\frac{m_{ij}^2}{2b^2})} \tag{5} pi,j​=2π ​1​exp(−2b2mij2​​)(5)
其中 b b b表示在cluster上的bandwith。 m i , j = ∣ ∣ a j − x i ∣ ∣ m_{i,j}=||a_j-x_i|| mi,j​=∣∣aj​−xi​∣∣表示 a j a_j aj​和 x i x_i xi​的距离。
a j t = 1 Z j t ∑ i = 1 N p i j t ∗ x i (6) a_j^t=\frac{1}{Z_j^t}\sum_{i=1}^Np_{ij}^t*x_i \tag{6} ajt​=Zjt​1​i=1∑N​pijt​∗xi​(6)
这是第t次迭代后。
详解Single-Image Piece-wise Planar 3D Reconstruction via Associative Embedding
可以看到最后计算 C   C^~ C 个簇。最后merge为S分割的mask map。

Plane Param Decoder
这是计算每个像素的平面参数模块设计的loss函数,论文中,需要给出平面的表达,同时给出loss函数如下:
L p p = 1 N ∑ i = 1 N ∣ ∣ n i − n i ∗ ∣ ∣ (3) L_{pp}=\frac{1}{N}\sum_{i=1}^N||n_i-n_i^*|| \tag{3} Lpp​=N1​i=1∑N​∣∣ni​−ni∗​∣∣(3)
有一个pool操作,它让像素级别的平面参数和之前生成的seg mask合在一起。表达如下:
n j = 1 Z j ∑ i = 1 N S i j ∗ n i n_j=\frac{1}{Z_j}\sum_{i=1}^NS_{ij}*n_i nj​=Zj​1​i=1∑N​Sij​∗ni​
这是一个全局的average pooling操作,但是有attention 操作,让不同的plane( S i j S_ij Si​j)对像素级别的平面参数进行筛选。可以看到mask操作。因为论文中还考虑了一下全局的几何信息,意思就是和原始的depthmap要一致。表示如下:
L I P = 1 N C ∑ j = 1 C ∑ i = 1 N S i j ∗ ∣ ∣ n j T Q i − 1 ∣ ∣ L_IP=\frac{1}{NC}\sum_{j=1}^{C}\sum_{i=1}^NS_{ij}*||n_j^TQ_i-1|| LI​P=NC1​j=1∑C​i=1∑N​Sij​∗∣∣njT​Qi​−1∣∣
可以看出来。希望生成的depth值和原始的depth值一致。
这些loss的设计是因为遇到的各个问题达到了,自己需要模仿,指导未来自己设计网络等等。

网络设计的细节(代码级别)

后续在补,最近在看planercnn代码,运行和测试代码。

感想

1)这篇论文的思路和之前那些论文不一样,之前的论文都是先回归平面的参数,或者计算点云的normal和depth,然后它计算各个平面,然后refine各个平面的segmetation,这样保证了平面部分。这篇论文直接回归平面参数,跳过了平面中的normal和depth计算像素级别的平面参数。提供了一个很好的平面表达。上篇论文也提到了,但是这篇论文直接表达了这个平面。

2)这篇论文同时加入了一个非常重要的概念,也是最新论文中提出的一个embedding model概念,它能够让分割边得更加容易。本篇论文使用了这个技巧,更好的分割了实例化分割了平面。自己看的神经网络的论文较少,不知道还有这个技巧可以应用,只是知道这些数据,但是不知道怎么用,或者用的比较浅显。以后需要积极看论文了解各种技术,用于后续的网络改进。

3)论文中还是没有添加角点的信息,同时平面表达可以用极坐标表示。

4)同时CRF表达其实可以将scene的信息加进来。需要看一下网络架构怎么使用这个信息。

上一篇:《机器学习Python实现_10_14_集成学习_xgboost_优化介绍》


下一篇:Codeforces 1326F2 - Wise Men (Hard Version)(FWT+整除划分)