HorizonNet: Learning Room Layout with 1D Representation and Pano Stretch Data Augmentation(CVPR 2019)
pdf下载 项目地址
把房间布局编码成为3个1维向量:在全景图的每一列,地板和墙的边界、天花板和墙的边界,墙和墙的边界。提出恢复结构的后处理方法速度很快,还提出Pano Stretch数据增强。
Contributions
- 引入了一个1维 O ( W ) \mathcal{O}(W) O(W)表示法,用于编码整个房间布局。使用这样的表示法进行训练,使我们的方法比以前的最先进的结果更好,同时需要更少的参数和更少的计算时间。
- Pano Stretch数据增强,可以在训练时快速生成全景图。
- 利用RNN有助于提高精度。RNN能够捕捉房间布局的长程(记忆性)几何图形。
- 由于模型的1维表示和高效的后处理过程,使得模型的计算成本非常低,并且可以很容易地处理非长方体或l形布局的复杂场景。
Related Work
和Room layout estimation from a single-view RGB image相关工作。
许多方法利用曼哈顿世界假设来约束房间布局。这个假设也可以用来垂直矫正。
- 早期:
dynamic Bayesian network、Orientation Map (OM)、Geometric Context (GC)。
联合3D对象,如利用床进行推理。 - 中期:
提出使用全景,约束图、甚至多张全景图(类似SFM?),估计房间布局。 - 近期:
使用NN进行房间布局估计,大多数使用密集预测方法,类似做语义分割。
直接从全景图估计墙角和边界的概率图。
在透视图中训练,应用在全景图中。
DuLa-Net在上面提到,CFL 提出在全景图上适用的卷积核。
本文的主要思想是对布局的表示方法,不像已有的方法密集的去表示房间布局,而是使用3个1维向量表示,对于每列只需3个值表示。所以输出尺寸也从 O ( H W ) \mathcal{O}(H W) O(HW)变为 O ( W ) \mathcal{O}(W) O(W)。此外,利用RNN的记忆性,可以更好表示布局的连续性。
Approach
对输入图片进行垂直校正预处理。
HorizonNet
输入:
3
×
512
×
1024
3 \times 512 \times 1024
3×512×1024 全景图
网络结构:ResNet-50特征提取器 + 双向LSTM
1D Layout Representation:
输出:
3
×
1
×
1024
3 \times 1 \times 1024
3×1×1024
y
c
y_{c}
yc:天花板-墙边界位置,值归一化到
[
−
π
/
2
,
π
/
2
]
[-\pi / 2, \pi / 2]
[−π/2,π/2]
y
f
y_{f}
yf:地板-墙边界位置, 值归一化到
[
−
π
/
2
,
π
/
2
]
[-\pi / 2, \pi / 2]
[−π/2,π/2]
y
w
y_{w}
yw:墙角存在的可能性,注意:
y
w
(
i
)
=
c
d
x
y_{w}(i)=c^{d x}
yw(i)=cdx,其中
c
=
0.96
c = 0.96
c=0.96,
d
x
dx
dx表示到最近墙角的距离。
在以往密集预测中,不是边界和墙角的背景值达到95%。使用这种表示法将不存在背景值, y f y_{f} yf和 y c y_{c} yc简化为位置回归值。对于墙角的预测,墙角比值从 2 N 512 ⋅ 1024 \frac{2 N}{512 \cdot 1024} 512⋅10242N 变为 N 1024 \frac{N}{1024} 1024N,比值的提高意味着非墙角影响更小。
Feature Extractor:
为了捕获浅层和深层的特征,在ResNet-50的每个block中包含3个卷积层,输出特征金字塔。具体过程:卷积核高度分别为4,2,2,宽度都为1,通道数每次是原来的一半(factor of 2)。3个卷积核size和stride都为:
4
×
1
×
,
2
×
1
,
2
×
1
4 \times 1 \times ,2 \times 1,2 \times 1
4×1×,2×1,2×1。所以最终经过这3个卷积,通达数
/
8
(
=
2
×
2
×
2
)
/8(=2 \times 2 \times 2)
/8(=2×2×2),高度
/
16
(
=
4
×
2
×
2
)
/16(=4 \times 2 \times 2)
/16(=4×2×2)。经过upsampled使其宽度为256,reshaped使其高度为256,通道数都为1。最后连接4个feature map使其size为
1024
×
1
×
256
1024 \times 1 \times 256
1024×1×256。作者尝试了 ResNet-101,没有改进。
Recurrent Neural Network for Capturing Global Information:
从几何学上讲,一个房间的任何一个角落都可以从其他角落的位置大致推断出来,所以使用RNN去捕获全局信息和长期依赖关系。存储其他区域的信息在LSTM的细胞状态中。RNN一列一列地预测
y
c
′
,
y
f
′
,
y
w
′
y_{c}^{\prime}, y_{f}^{\prime}, y_{w}^{\prime}
yc′,yf′,yw′,即RNN的序列长度与图像宽度成正比。本文方法,RNN预测的是4列,而不是每个时间步长1列,不影响精度情况下更少的计算时间。因为全景图左右两边是连续的,所以使用双向LSTM。
Post-processing
几个假设:
- 墙互相垂直(曼哈顿世界假设)
- 房间布局都是天花板-墙-地板,并且天花板和地板平行
- 相机高度1.6m
- 预处理进行了垂直校正
Recovering the Floor and Ceiling Planes:
把floor-wall边界,即
y
f
′
y_{f}^{\prime}
yf′投影到球面坐标,每个点具有相同的
y
y
y。注:在假设相机高度为1.6m情况下,可以取得以相机为中心的实际预测值。
将ceiling-wall边界,即
y
c
′
y_{c}^{\prime}
yc′也投影到球面坐标,由于不知道房间高度,得到是一个相对值,但是同一列的
x
,
z
x,z
x,z,
y
f
′
y_{f}^{\prime}
yf′和
y
c
′
y_{c}^{\prime}
yc′应该一样。通过调节
x
,
z
x,z
x,z,可以得到对应
y
c
′
y_{c}^{\prime}
yc′的实际
y
y
y值。由此得到天花板和底部的距离,取平均即得到房间高度。
Recovering Wall Planes:
墙角(prominent peak)条件:
- 在5度的FOV范围内, y w ′ y_{w}^{\prime} yw′最大
- y w ′ y_{w}^{\prime} yw′ > 0.05
上图
y
c
′
y_{c}^{\prime}
yc′是红线,prominent peak将其分为多个部分。对每个部分进行PCA得到该部分的主要方向向量。每个部分的方向角度取平均,对整个平面图进行旋转。总之,墙要和XZ轴对齐,相邻墙是垂直的, 最后是选择墙。
这两种情况添加一个墙角而不是选择墙。
Pano Stretch Data Augmentation
图片的
(
u
,
v
)
(u, v)
(u,v)坐标,
u
∈
[
−
π
,
π
]
,
v
∈
[
−
π
/
2
,
π
/
2
]
u \in[-\pi, \pi], v \in[-\pi / 2, \pi / 2]
u∈[−π,π],v∈[−π/2,π/2],也就是经纬度坐标。
3维空间坐标
x
,
y
,
z
x, y, z
x,y,z,分别乘
k
x
,
k
y
,
k
z
k_{x}, k_{y}, k_{z}
kx,ky,kz得到
x
′
,
y
′
,
z
′
x^{\prime}, y^{\prime}, z^{\prime}
x′,y′,z′。
{
x
′
=
k
x
⋅
x
=
k
x
⋅
d
⋅
cos
(
v
)
⋅
cos
(
u
)
y
′
=
k
y
⋅
y
=
k
y
⋅
d
⋅
sin
(
v
)
z
′
=
k
z
⋅
z
=
k
z
⋅
d
⋅
cos
(
v
)
⋅
sin
(
u
)
\left\{\begin{array}{l} x^{\prime}=k_{x} \cdot x=k_{x} \cdot d \cdot \cos (v) \cdot \cos (u) \\ y^{\prime}=k_{y} \cdot y=k_{y} \cdot d \cdot \sin (v) \\ z^{\prime}=k_{z} \cdot z=k_{z} \cdot d \cdot \cos (v) \cdot \sin (u) \end{array}\right.
⎩⎨⎧x′=kx⋅x=kx⋅d⋅cos(v)⋅cos(u)y′=ky⋅y=ky⋅d⋅sin(v)z′=kz⋅z=kz⋅d⋅cos(v)⋅sin(u)
其中,
d
d
d表示球的半径,后面
atan
2
\operatorname{atan} 2
atan2运算可以消去。
在对x和z拉伸后,反推到uv坐标。
{
u
′
=
atan
2
(
k
z
⋅
sin
(
u
)
,
k
x
⋅
cos
(
u
)
)
v
′
=
atan
2
(
k
y
⋅
sin
(
v
)
,
k
x
2
cos
2
(
u
)
+
k
z
2
sin
2
(
u
)
⋅
cos
(
v
)
)
\left\{\begin{array}{l} u^{\prime}=\operatorname{atan} 2\left(k_{z} \cdot \sin (u), \quad k_{x} \cdot \cos (u)\right) \\ v^{\prime}=\operatorname{atan} 2\left(k_{y} \cdot \sin (v)\right., \sqrt{k_{x}^{2} \cos ^{2}(u)+k_{z}^{2} \sin ^{2}(u)} \cdot \cos (v)) \end{array}\right.
{u′=atan2(kz⋅sin(u),kx⋅cos(u))v′=atan2(ky⋅sin(v),kx2cos2(u)+kz2sin2(u)
⋅cos(v))
论文中令
k
y
=
1
k_{y}=1
ky=1,因为
k
y
=
s
k_{y}=s
ky=s等同于
k
x
=
s
,
k
z
=
s
k_{x}=s, k_{z}=s
kx=s,kz=s。
防止前向映射需要遍历全部才能进行插值缺点,本文实现使用反向映射,并且反向映射变换可以容易得到:
{
u
=
atan
2
(
k
x
⋅
sin
(
u
′
)
,
k
z
⋅
cos
(
u
′
)
)
v
=
arctan
(
k
z
⋅
tan
(
v
′
)
⋅
csc
(
u
′
)
⋅
sin
(
u
)
)
\left\{\begin{array}{l} u=\operatorname{atan} 2\left(k_{x} \cdot \sin \left(u^{\prime}\right), \quad k_{z} \cdot \cos \left(u^{\prime}\right)\right) \\ v=\arctan \left(k_{z} \cdot \tan \left(v^{\prime}\right) \cdot \csc \left(u^{\prime}\right) \cdot \sin (u)\right) \end{array}\right.
{u=atan2(kx⋅sin(u′),kz⋅cos(u′))v=arctan(kz⋅tan(v′)⋅csc(u′)⋅sin(u))
当然,这种数据增强方法也适用其他全景图任务
Experiments
训练细节:
y
f
y_{f}
yf和
y
c
y_{c}
yc使用L1损失,
y
w
y_{w}
yw使用二分类交叉熵损失。标准数据增强(左右翻转,全局水平旋转,亮度改变) + Pano Stretch数据增强。Pano Stretch数据增强
k
x
,
k
z
k_{x}, k_{z}
kx,kz取
U
[
1
,
2
]
U[1,2]
U[1,2],0.5的概率取倒数,时间花费教室130ms,可以在训练时进行增强。
评估标准:
3D IoU:和真实布局的交集/并集
Corner Error:预测角与底真角之间的平均欧式距离(通过图像对角线长度标准化)
Pixel Error:预测的面类别和地面真实的面类别之间的像素误差
测试结果:
Ablation Study:
其中LayoutNet作为dense
O
(
H
W
)
\mathcal{O}(H W)
O(HW)测试,替换U-Net成本文骨架网络。可以发现Pano Stretch和RNN都能提升准确度。不使用RNN在网络结构上使用全连接。
这两个预测都是原始的网络输出——没有后处理。在图像中,采用RNN的模型比不采用RNN的模型更好地包含了天花板、FOV较小造成的黑色缺失极坐标区域和遮挡区域。
多墙角的测试结果:
重新标注数据然后微调训练。
Conclusion
本文提出的1维表示法很好适用于全景图恢复房结构任务,减少了参数好计算量,这种表示法更好的使任务专注于墙线和墙角识别。加上使用RNN和Pano Stretch数据增强,取得不错的结果。
个人测试结果:
使用作者提供resnet50_rnn__st3d.pth权重测试:
HorizonNet在全景图中墙线拟合比DuLa-Net要好,但是恢复布局进行垂直时效果不是太好,论文中提到使用PCA提取方向向量然后整体旋转平均角度。在第1、2例测试中发现整体发生误旋转。对于墙角的估计有待提高。