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的大体流程,其中的“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表示,从而使对Voxel grid 操作的函数转化为对Octree操作的函数。
论文先介绍了实现上述操作的常规方法,并指出该方法时间复杂度较高,然后提出了使用hash table的Octree编码。具体方法如下:
使用这种方法可以实现常数时间的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
OGN-Conv支持步长卷积(strided convolutions)和上采样卷积(up-convolutions),
dense情况下feature tensor被转换为矩阵,然后与权重矩阵相乘,然后结果再转换为feature tensor.(类似于col2im和im2col函数)
OGN情况,将hash table转变为feature matrix,然后与权重矩阵相乘,再转换回hash table
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之和。
将预测结果为“mixed”的,另外可能还包括一些其他的邻居cells(以便用于接下来的卷积计算)传递给下一模块
根据测试阶段是否知道Octree的ground truth,分为两种可能的传播方式:Prop-Known方法(例如语义分割,结构不变,只需要与GT做对比即可)和Prop-Pred方法(例如三维重建,结构需要预测,需要训练分类模型来判断每个voxel是empty、filled、mixed中的哪种)