论文笔记:LayoutNet(CVPR 2018)
LayoutNet: Reconstructing the 3D Room Layout From a Single RGB Image(CVPR 2018)
pdf下载 项目地址(原) 项目地址(pytorch)
LayoutNet是直接在全景图上预测房间布局具有代表性的模型,模型结构和RoomNet类似,但是基于消失点对齐改进了准确度。将结构和Manhattan布局对齐。LayoutNet能够预测盒形布局和更普通的布局(比如L形)
Contributions
- 提出通用的从RGB图像恢复Manhattan布局算法
- 证明了使用预处理计算消失点和几何约束,以及后处理优化对于深层的NN仍然有效。直接回归3D布局参数能够提高准确度。
Related Work
- 早期传统方法:在透视中假设Manhattan world恢复布局,Manhattan world假设墙互相垂直,且垂直天花板/地板。
基于线段检测生成方向图恢复矩形布局。
求三个消失点,求和消失一样的布局,且要求边界和几何上下文Geometric Context一致。 - 近期方法:PanoContext(把全景图投影多个透视图,在透视图上计算特征再反投影回全景图)、RoomNet(基于NN,适用透视图)
本文和RoomNet类似,但是LayoutNet适用全景图。在输入NN之前进行了消失点对齐。
Approach
Panoramic image alignment
对全景图进行投影(应该是投影成多张重叠透视图),用LSD(Line Segment Detector)对每张透视图进行检测。再用Hough变换投票选出三个互相正交的消失方向(Manhattan线)。这个预处理步骤简化了NN训练。检测到的Manhattan线一起输入NN提供了额外的输入特性,以提高性能。
Network structure
encoder-decoder结构
Deep panorama encoder:
输入:
512
×
1024
×
3
512 \times 1024 \times 3
512×1024×3(或者透视图:
512
×
512
×
3
512 \times 512 \times 3
512×512×3) 加上Panoramic image alignment得到的Manhattan线特征图和全景图尺寸一样,输入到encoder中。
一共7层卷积,卷积size
3
×
3
3 \times 3
3×3,每层后接RelU和下采样因子为2的最大池化。初始特征32通道,所以推测每层特征尺寸:
input:
(
3
+
3
)
×
512
×
1024
(3+3) \times 512 \times 1024
(3+3)×512×1024
cov1:
32
×
256
×
512
32 \times 256 \times 512
32×256×512
cov2:
64
×
128
×
256
64 \times 128 \times 256
64×128×256
…
cov7:
2048
×
4
×
8
2048 \times 4 \times 8
2048×4×8
作者尝试使用在每层后面接Batch Normalization,但是观察到更低的准确度。为什么?
输入图像和Manhattan线特征图各自使用一个encoder,性能没有改进。
2D layoutdecoder:
由2个分支组成,上分支预测边界概率图(
m
E
\boldsymbol{m}_{\boldsymbol{E}}
mE),下分支预测墙角概率图
m
C
\boldsymbol{m}_{\boldsymbol{C}}
mC,2个分支结构上一样,一共7层卷积,卷积size
3
×
3
3 \times 3
3×3,先最近邻上采样再卷积,推测每层特征尺寸:
cov8:
1024
×
8
×
16
1024 \times 8 \times 16
1024×8×16
cov9:
512
×
16
×
32
512 \times 16 \times 32
512×16×32
…
cov14:
16
×
512
×
1024
16 \times 512 \times 1024
16×512×1024
输出
m
E
\boldsymbol{m}_{\boldsymbol{E}}
mE:Sigmoid->
3
×
512
×
1024
3 \times 512 \times 1024
3×512×1024
输出
m
C
\boldsymbol{m}_{\boldsymbol{C}}
mC:Sigmoid->
1
×
512
×
1024
1 \times 512 \times 1024
1×512×1024
m
E
\boldsymbol{m}_{\boldsymbol{E}}
mE是3通道,分别是wall-wall,ceiling- wall,wall-floor 边界的概率,看做(3+1)分类器。
m
C
\boldsymbol{m}_{\boldsymbol{C}}
mC是1通道,表示墙角概率,看做(1+1)分类器。
借鉴U-Net的跳跃结构,防止在上采样时发生偏移。使用了全卷积替代上采样+卷积结构,发现棋盘效应(checker- board artifacts)
棋盘效应主要原因是反卷积核大小(输出窗口的大小)不能被步长(顶层点之间的空间)整除时发生:
解决方法1:确保反卷积核的大小可以被步长整除,从而避免重叠问题。但是,尽管这种方法有效,但反卷积仍然容易产生棋盘效应。
解决方法2:先进行上采(最近邻插值或双线性插值)样再卷积。
3D layout regressor:
输出了
m
E
\boldsymbol{m}_{\boldsymbol{E}}
mE和
m
C
\boldsymbol{m}_{\boldsymbol{C}}
mC,但是要和真实的布局进行比较然后得出Loss,才能训练。使用提出3D布局参数:
d
=
{
s
w
,
s
l
,
s
h
,
t
x
,
t
z
,
r
θ
}
d=\left\{s_{w}, s_{l}, s_{h}, t_{x}, t_{z}, r_{\theta}\right\}
d={sw,sl,sh,tx,tz,rθ},分布表示布局的长宽高,位移和旋转。虽然直接使用
m
E
\boldsymbol{m}_{\boldsymbol{E}}
mE和
m
C
\boldsymbol{m}_{\boldsymbol{C}}
mC在几何数学上可以装换为3D布局参数,但是难以反向传播(学习)。
所以是再训练了一个3D layout regressor。将 m E \boldsymbol{m}_{\boldsymbol{E}} mE和 m C \boldsymbol{m}_{\boldsymbol{C}} mC作为输入,输出 d = { s w , s l , s h , t x , t z , r θ } d=\left\{s_{w}, s_{l}, s_{h}, t_{x}, t_{z}, r_{\theta}\right\} d={sw,sl,sh,tx,tz,rθ},细节为: 7 layers of convolution | kernel size 3 × 3 | ReLU |max pooling layer(factor of 2)|4 FC layer: 1024, 256, 64, 6。
作者也尝试直接使用3D regressor,但是效果不好。原因是在2D上微小的偏移会照成在3D形状发生巨大变化,使得网络难以训练。
这个回归只能对矩形房间使用,使用在预测更复杂的布局时,比如L形,是没有再使用3D layout regressor。
Loss function:
L ( m E , m C , d ) = − α 1 n ∑ p ∈ m E ( p ^ log p + ( 1 − p ^ ) log ( 1 − p ) ) − β 1 n ∑ q ∈ m C ( q ^ log q + ( 1 − q ^ ) log ( 1 − q ) ) + τ ∥ d − d ^ ∥ 2 \begin{aligned} L\left(\boldsymbol{m}_{\boldsymbol{E}}, \boldsymbol{m}_{\boldsymbol{C}}, \boldsymbol{d}\right) &=-\alpha \frac{1}{n} \sum_{p \in \boldsymbol{m}_{\boldsymbol{E}}}(\hat{p} \log p+(1-\hat{p}) \log (1-p)) \\ &-\beta \frac{1}{n} \sum_{q \in \boldsymbol{m}_{C}}(\hat{q} \log q+(1-\hat{q}) \log (1-q)) \\ &+\tau\|\boldsymbol{d}-\hat{\boldsymbol{d}}\|_{2} \end{aligned} L(mE,mC,d)=−αn1p∈mE∑(p^logp+(1−p^)log(1−p))−βn1q∈mC∑(q^logq+(1−q^)log(1−q))+τ∥d−d^∥2
其中
α
=
β
=
1
and
τ
=
0.01
\alpha=\beta=1 \text { and } \tau=0.01
α=β=1 and τ=0.01
作者描述为:
binary cross entropy error of the predicted pixel probability in m E \boldsymbol{m}_{\boldsymbol{E}} mE and m C \boldsymbol{m}_{\boldsymbol{C}} mC compared to ground truth.
对于 m C \boldsymbol{m}_{\boldsymbol{C}} mC可以理解为2分类交叉熵。但是 m E \boldsymbol{m}_{\boldsymbol{E}} mE前面不是说3通道吗,猜测是使用3个2分类交叉熵吧。
能不能使用softmax,做4分类?
再加上3D layout regressor得到的参数d与真实d欧拉距离之和。RoomNet使用L2Loss处理墙角,测试结果在后面。
Training details
随机初始化参数进行联合训练是难以收敛的,于是单独训练边界预测分支和墙角分支,3D layout regressor输入的是真实 m E \boldsymbol{m}_{\boldsymbol{E}} mE和 m C \boldsymbol{m}_{\boldsymbol{C}} mC。各种训练一定程度后再进行联合训练。
由于边界是一条线,墙角是一个点。所以微小的误差带来损失是比较大的。主要体现在 m E \boldsymbol{m}_{\boldsymbol{E}} mE和 m C \boldsymbol{m}_{\boldsymbol{C}} mC的损失是交叉熵,而不是regression。所以对真实的 m E \boldsymbol{m}_{\boldsymbol{E}} mE和 m C \boldsymbol{m}_{\boldsymbol{C}} mC进行了Gaussian滤波。
3D layout optimization
这个是后处理,不参与训练
对于输出的 m C \boldsymbol{m}_{\boldsymbol{C}} mC。先对每列求和,在间隔才必须超过20pixel情况下,选择最大的几列(类似求聚类中心)。在选择后的列中找2个峰值,作为天花板和地板的墙角点。直接这样做找出的墙角点可能不满足Manhattan约束。需要进行优化:
有几个假设:
- 靠近地板的墙角位于同一平面
- 靠近天花板的墙角直接位于地板的墙角上方
- 墙互相垂直
标记了墙与墙交界位置(墙角点所在列),采用Floor-Plan Reconstruction from Panoramic Images里的方法来求布局,布局用
L
v
=
{
v
1
=
(
0
,
0
)
,
v
2
=
(
x
1
,
y
1
)
,
…
,
v
N
=
(
x
N
,
y
N
)
}
\boldsymbol{L}_{\boldsymbol{v}}=\left\{\boldsymbol{v}_{\boldsymbol{1}}=(0,0), \boldsymbol{v}_{\boldsymbol{2}}=\left(x_{1}, y_{1}\right), \ldots, \boldsymbol{v}_{\boldsymbol{N}}=\left(x_{N}, y_{N}\right)\right\}
Lv={v1=(0,0),v2=(x1,y1),…,vN=(xN,yN)}向量描述,表示自顶向下地板俯视图坐标系的各个墙角点位置
拿矩形布局来说,需要确定4个墙角坐标和相机坐标,一共10个参数。在给定一下预定义条件:
- v 1 = ( 0 , 0 ) \boldsymbol{v}_{\mathbf{1}}=(0,0) v1=(0,0),消除位移不确定,边是连接在一起的,约束力起始点,剩余的点也添加了约束
- ∣ v 1 − v 2 ∣ = 1 \left|\boldsymbol{v}_{\mathbf{1}}-\boldsymbol{v}_{\boldsymbol{2}}\right|=1 ∣v1−v2∣=1,消除尺度不确定性,在不给的尺度情况下,各个坐标都是相对位置
- Manhattan约束,即边和边是互相垂直的
这些上面条件约束下,*参数从10变为3,也就是说求解这样一个问题只需要3个墙角值就可以恢复布局,具体做法是:
E
(
L
v
,
v
c
)
=
min
v
c
,
L
v
∑
(
i
,
j
)
∈
L
v
∣
β
(
v
i
,
v
j
)
−
α
(
v
i
,
v
j
)
∣
E\left(\boldsymbol{L}_{\boldsymbol{v}}, \boldsymbol{v}_{\boldsymbol{c}}\right)=\min _{\boldsymbol{v}_{\boldsymbol{c}}, \boldsymbol{L}_{\boldsymbol{v}}} \sum_{(i, j) \in \boldsymbol{L}_{v}}\left|\beta\left(\boldsymbol{v}_{\boldsymbol{i}}, \boldsymbol{v}_{\boldsymbol{j}}\right)-\alpha\left(\boldsymbol{v}_{\boldsymbol{i}}, \boldsymbol{v}_{\boldsymbol{j}}\right)\right|
E(Lv,vc)=vc,Lvmin(i,j)∈Lv∑∣β(vi,vj)−α(vi,vj)∣
β
i
j
=
arccos
v
i
−
v
c
⋅
v
j
−
v
c
∥
v
i
−
v
c
∥
∥
v
j
−
v
c
∥
\beta_{i j}= \arccos \frac{\boldsymbol{v}_{\boldsymbol{i}}-\boldsymbol{v}_{\boldsymbol{c}} \cdot \boldsymbol{v}_{\boldsymbol{j}}-\boldsymbol{v}_{\boldsymbol{c}}}{\left\|\boldsymbol{v}_{\boldsymbol{i}}-\boldsymbol{v}_{\boldsymbol{c}}\right\|\left\|\boldsymbol{v}_{\boldsymbol{j}}-\boldsymbol{v}_{\boldsymbol{c}}\right\|}
βij=arccos∥vi−vc∥∥vj−vc∥vi−vc⋅vj−vc
其中
v
c
=
{
x
c
,
y
c
}
\boldsymbol{v}_{\boldsymbol{c}}=\left\{x_{c}, y_{c}\right\}
vc={xc,yc}是相机位置,
α
(
v
i
,
v
j
)
\alpha\left(\boldsymbol{v}_{\boldsymbol{i}}, \boldsymbol{v}_{\boldsymbol{j}}\right)
α(vi,vj)是全景图上水平像素距离/全景图宽 * 360,表示的全景图上直接观察到的墙的FOV,而
β
(
v
i
,
v
j
)
\beta\left(\boldsymbol{v}_{i}, \boldsymbol{v}_{\boldsymbol{j}}\right)
β(vi,vj)表示在俯视平面布局上计算得到的FOV。使用L-BFGS求解该最优化问题,优化目标就是
L
v
\boldsymbol{L}_{\boldsymbol{v}}
Lv。
这样下来,从 m C \boldsymbol{m}_{\boldsymbol{C}} mC得到了符合Manhattan约束的布局。
其实 m C \boldsymbol{m}_{\boldsymbol{C}} mC可以得到具体的墙角点,能不能直接使用墙角点恢复布局,再使用Manhattan约束进行校正?
但是只考虑了墙角点,没考虑到边界输出
m
E
\boldsymbol{m}_{\boldsymbol{E}}
mE。需要通过迭代微调每个墙的位置来使得布局既符合
m
C
\boldsymbol{m}_{\boldsymbol{C}}
mC也符合
m
E
\boldsymbol{m}_{\boldsymbol{E}}
mE。所以有下面评分函数表示当前布局:
S
core
(
L
)
=
w
j
u
n
c
∑
l
c
∈
C
log
P
corner
(
l
c
)
+
w
ceil
∑
l
e
∈
L
e
max
log
P
ceil
(
l
e
)
+
w
floor
∑
l
f
∈
L
f
max
log
P
floor
(
l
f
)
\begin{aligned} S \operatorname{core}(L) &=w_{j u n c} \sum_{l_{c} \in C} \log P_{\text {corner }}\left(l_{c}\right) \\ &+w_{\text {ceil}} \sum_{l_{e} \in L_{e}} \max \log P_{\text {ceil }}\left(l_{e}\right) \\ &+w_{\text {floor}} \sum_{l_{f} \in L_{f}} \max \log P_{\text {floor }}\left(l_{f}\right) \end{aligned}
Score(L)=wjunclc∈C∑logPcorner (lc)+wceille∈Le∑maxlogPceil (le)+wfloorlf∈Lf∑maxlogPfloor (lf)
L是一个布局,C表示L的墙角的在
m
C
\boldsymbol{m}_{\boldsymbol{C}}
mC的位置,
L
e
L_{e}
Le表示通过L的墙角连接得到上边界(wall-ceiling boundaries),同理有下边界
L
f
L_{f}
Lf,相机高度固定,房间高度通过上墙角点可以得出平均高度。
P
corner
P_{\text {corner }}
Pcorner
P
ceil
P_{\text {ceil }}
Pceil
P
floor
P_{\text {floor }}
Pfloor 表示各个概率在
m
E
\boldsymbol{m}_{\boldsymbol{E}}
mE和
m
C
\boldsymbol{m}_{\boldsymbol{C}}
mC中。墙和墙的边界得分不需要,因为墙角点包含了改信息。
迭代调整墙的过程如下:
大致描述为移动墙i(其他墙也会一起移动)和天花板底部位置j,得到多个布局
L
i
j
L_{i j}
Lij,选择得分最高的,如果大于最好布局
L
b
e
s
t
L_{b e s t}
Lbest,则更新
L
b
e
s
t
L_{b e s t}
Lbest,并且更新
L
b
e
s
t
L_{b e s t}
Lbest里的墙位置。
Experiments
评估标准:
3D IoU:和真实布局的交集/并集
Corner Error:预测角与底真角之间的平均欧式距离(通过图像对角线长度标准化)
Pixel Error:预测的面类别和地面真实的面类别之间的像素误差
损失使用交叉熵相比L2具有更好的性能。3D regressor改进效果比较小。
在PanoContext上对比表现:
在Stanford 2D-3D(布局更复杂,更多遮挡)上对比表现:
Conclusion
LayoutNet不像以往工作对全景图切分成透视图预测,而是直接在全景图上进行布局预测,为后续工作提供了参考。在预处理部分使用消失点和Manhattan约束进行校正全景图,可以很大程度改进准确度。