ICCV2017《Octree Generating Networks: Efficient Convolutional Architectures for High-resolution 3D Outputs》
Maxim Tatarchenko, Alexey Dosovitskiy and Thomas Brox
论文链接:http://openaccess.thecvf.com/content_iccv_2017/html/Tatarchenko_Octree_Generating_Networks_ICCV_2017_paper.html
个人理解存在不足,如果日后重新阅读论文发现理解错误会及时改正笔记内容
简介
之前相关工作的一个基本的限制是输出的分辨率较低,同时占用内存和计算复杂度与输出的大小是三次方级的关系,所以要生成 6 4 3 64^3 643以上的输出就需要其他手段进行辅助。
本文提出了OGN——一种在八叉树上进行操作的convolutional decoder,之所以节省时间是因为在OGN当中,处理高分辨时只有包含细节的区域会被进一步处理(不断精细化体素来达到高分辨率)。
论文中提到的几点:
- OGN使用binary occupancy map表示形状(we focus on generating shapes represented as binary occupancy maps)
- OGN更加灵活:允许指定任意层数(the OGN is more flexible in that it allows for octrees with an arbitrary number of levels)
- OGN是端到端的,使用反向传播计算(The OGN decoder is end-to-end trainable using standard backpropagation)
流程
上图阐释了OGN的大体流程,其中的“dense”是指一般的3D卷积层,输出的是大小为
d
1
×
d
2
×
d
3
×
c
d_1×d_2×d_3×c
d1×d2×d3×c的特征图,其中
c
c
c指的是通道数。然后从下一层开始,dense block产生的特征图被转换为存储在哈希表中的键值对(其中值是feature vectors),之后每一个基于八叉树的模块(比如图中的Octree level 1、Octree level 2等)就会负责预测生成的八叉树中一层的结构和内容(特征向量)
这幅图介绍了之前提到的每一个“模块”的作用。输入到模块的是前一个模块输出的存储在hash table当中的卷积特征图,大小为
(
d
1
⋅
2
l
−
1
×
d
2
⋅
2
l
−
1
×
d
3
⋅
2
l
−
1
)
(d_1\cdot2^{l-1} ×d_2\cdot2^{l-1}×d_3\cdot2^{l-1})
(d1⋅2l−1×d2⋅2l−1×d3⋅2l−1),然后这个特征图经过一系列卷积层,得到新的特征图
F
‾
l
\overline F_l
Fl,大小为
(
d
1
⋅
2
l
×
d
2
⋅
2
l
×
d
3
⋅
2
l
)
(d_1\cdot2^{l} ×d_2\cdot2^{l}×d_3\cdot2^{l})
(d1⋅2l×d2⋅2l×d3⋅2l),然后基于这幅特征图,直接预测第
l
l
l层的内容:判断每个cell是empty(不是实体的cell)、filled(被占据是实体的cell)、mixed(需要细分的的cell,从图中红色可以看出,mixed由更小的filled cells和empty cells组成)中的哪一种,用
1
3
1^3
13卷积和softmax实现。然后预测结果与ground truth计算交叉熵损失函数。同时向下一层传播时,主要仅传播被判断为“mixed”的区域
Octree编码
将体素空间用Octree表示,从而使对Voxel grid 操作的函数转化为对Octree操作的函数。
论文先介绍了实现上述操作的常规方法,并指出该方法时间复杂度较高,然后提出了使用hash table的Octree编码。具体方法如下:
- 假设有坐标为 x = ( x , y , z ) \mathbf x=(x,y,z) x=(x,y,z)的Octree cell位于树的第 l l l层,值为 v v v.
- 那么可以将这个Octree cell转化为键值对 ( m , v ) (m,v) (m,v),其中 m = Z ( x , l ) m=Z(\mathbf x,l) m=Z(x,l),其中 Z ( ⋅ ) Z(\cdot) Z(⋅)是Z-order curves.
- 从而八叉树 O O O就可以表示为键值对的集合 O = { ( m , v ) } O=\{(m,v)\} O={(m,v)}.
使用这种方法可以实现常数时间的element access.
Z-order curves:
https://www.cnblogs.com/tgzhu/p/8286616.html.
得到了hash table之后,就可以定义查询Octree cell的函数如下:
f
(
m
,
O
)
=
{
v
i
f
∃
k
≤
l
:
(
Z
(
x
,
k
)
,
v
)
∈
O
∅
o
t
h
e
r
w
i
s
e
f(m,O)=\left\{ \begin{aligned} v && if \exist k\leq l:(Z(\boldsymbol x,k),v)\in O\\ \varnothing && otherwise\\ \end{aligned} \right.
f(m,O)={v∅if∃k≤l:(Z(x,k),v)∈Ootherwise
Octree Generating Networks
OGN-Conv
OGN-Conv支持步长卷积(strided convolutions)和上采样卷积(up-convolutions),
dense情况下feature tensor被转换为矩阵,然后与权重矩阵相乘,然后结果再转换为feature tensor.(类似于col2im和im2col函数)
OGN情况,将hash table转变为feature matrix,然后与权重矩阵相乘,再转换回hash table
OGNLoss
Loss使用了预测输出和ground truth的交叉熵式子中的
h
i
(
f
(
m
,
O
G
T
)
)
h^i(f(m,O_{GT}))
hi(f(m,OGT))是真实label值的one-hot编码
(
h
0
,
h
1
,
h
2
)
(h^0,h^1,h^2)
(h0,h1,h2),
p
m
i
=
(
p
m
0
,
p
m
1
,
p
m
2
)
p_m^i=(p_m^0,p_m^1,p_m^2)
pmi=(pm0,pm1,pm2)是代表cell是empty,filled,mixed的概率;
M
l
M_l
Ml是第
l
l
l层叶子集合
最终OGN总目标函数是所有层的Loss之和。
Feature Propagation
将预测结果为“mixed”的,另外可能还包括一些其他的邻居cells(以便用于接下来的卷积计算)传递给下一模块
根据测试阶段是否知道Octree的ground truth,分为两种可能的传播方式:Prop-Known方法(例如语义分割,结构不变,只需要与GT做对比即可)和Prop-Pred方法(例如三维重建,结构需要预测,需要训练分类模型来判断每个voxel是empty、filled、mixed中的哪种)