详解Single-Image Piece-wise Planar 3D Reconstruction via Associative Embedding
作者:互联网
Markdown
Motivation
理解从图像上提取平面。这个是最新的图片的平面提取。
论文序列
3)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空间,在这个空间内部,它能够更好的分类分割。看下图的表示如下。
上图可以看到,**将像素映射到plane embedding 空间,并且训练强制相同的平面上的像素在plane embedding空间之间的距离更加近。这样就可以得到更好的区域进行分割。**同时论文中提出了一个算法,让embedding 空间中相同的平面的像素对应的plane embedding具有相近的值。
3)提供了embedding model的方式,得到了相同的平面的像素在空间上具有相近的值,论文中同时对这些值进行移动,用聚类的思想,相近的值聚在一起,同时不相近的值之间尽量分开。这样就可以得到不同的平面分割(打破了分割的K值)。
网络整体架构
这是整体的网络架构,下面将介绍网络的各个部分的作用。
Plane Seg Decoder
这是对图片中的像素进行的平面提取,但是图像上有很多非平面的像素,比如一些树木,或者圆柱的物体,对后续的平面提取中会出现问题。同时有一个问题就是因为平面和平面交叉的地方会有一个弧度,这个弧度会导致平面分割会出现一些问题,不能表示交叉的地方属于哪个平面所以需要一个mask操作让非平面区域去掉。所以添加了这个mask网络。
主要的网络操作如下:
论文里面提的是用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。这两个操作,使用了聚类。它的主要架构是:
其中生成的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=N1i=1∑N∣∣ni−ni∗∣∣(3)
其中
n
i
n_i
ni表示预测的平面的参数,
n
i
∗
n_i^*
ni∗表示第i个pixel真实的平面参数。
论文中找到了一个很好的平面参数,它可以很好表达平面,这个特征可以得到用于平面的提取。提取到合适的平面,需要将平面和之前的分割平面进行统一。论文提出的就是将像素级别的参数group到平面级别的参数,就是将相近的平面级别的参数进行group,这个非常重要,每一个像素级别的平面参数可以合并。具体的网络架构如下:
这是对平面上的
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=C1c=1∑CNc1i=1∑Ncmax(∣∣μ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)1cA=1∑CcB=1∑Cmax(−∣∣μ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π
1exp(−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=Zjt1i=1∑Npijt∗xi(6)
这是第t次迭代后。
可以看到最后计算
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=N1i=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=Zj1i=1∑NSij∗ni
这是一个全局的average pooling操作,但是有attention 操作,让不同的plane(
S
i
j
S_ij
Sij)对像素级别的平面参数进行筛选。可以看到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||
LIP=NC1j=1∑Ci=1∑NSij∗∣∣njTQi−1∣∣
可以看出来。希望生成的depth值和原始的depth值一致。
这些loss的设计是因为遇到的各个问题达到了,自己需要模仿,指导未来自己设计网络等等。
网络设计的细节(代码级别)
后续在补,最近在看planercnn代码,运行和测试代码。
感想
1)这篇论文的思路和之前那些论文不一样,之前的论文都是先回归平面的参数,或者计算点云的normal和depth,然后它计算各个平面,然后refine各个平面的segmetation,这样保证了平面部分。这篇论文直接回归平面参数,跳过了平面中的normal和depth计算像素级别的平面参数。提供了一个很好的平面表达。上篇论文也提到了,但是这篇论文直接表达了这个平面。
2)这篇论文同时加入了一个非常重要的概念,也是最新论文中提出的一个embedding model概念,它能够让分割边得更加容易。本篇论文使用了这个技巧,更好的分割了实例化分割了平面。自己看的神经网络的论文较少,不知道还有这个技巧可以应用,只是知道这些数据,但是不知道怎么用,或者用的比较浅显。以后需要积极看论文了解各种技术,用于后续的网络改进。
3)论文中还是没有添加角点的信息,同时平面表达可以用极坐标表示。
4)同时CRF表达其实可以将scene的信息加进来。需要看一下网络架构怎么使用这个信息。
标签:Planar,via,wise,sum,论文,像素,plane,embedding,平面 来源: https://blog.csdn.net/weixin_43851636/article/details/112912244