【论文笔记】OGN(Octree Generating Networks)论文笔记

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

个人理解存在不足,如果日后重新阅读论文发现理解错误会及时改正笔记内容

简介

之前相关工作的一个基本的限制是输出的分辨率较低,同时占用内存和计算复杂度与输出的大小是三次方级的关系,所以要生成64364^3以上的输出就需要其他手段进行辅助。

本文提出了OGN——一种在八叉树上进行操作的convolutional decoder,之所以节省时间是因为在OGN当中,处理高分辨时只有包含细节的区域会被进一步处理(不断精细化体素来达到高分辨率)。

论文中提到的几点:

  1. OGN使用binary occupancy map表示形状(we focus on generating shapes represented as binary occupancy maps)
  2. OGN更加灵活:允许指定任意层数(the OGN is more flexible in that it allows for octrees with an arbitrary number of levels)
  3. OGN是端到端的,使用反向传播计算(The OGN decoder is end-to-end trainable using standard backpropagation)

流程

【论文笔记】OGN(Octree Generating Networks)论文笔记
上图阐释了OGN的大体流程,其中的“dense”是指一般的3D卷积层,输出的是大小为d1×d2×d3×cd_1×d_2×d_3×c的特征图,其中cc指的是通道数。然后从下一层开始,dense block产生的特征图被转换为存储在哈希表中的键值对(其中值是feature vectors),之后每一个基于八叉树的模块(比如图中的Octree level 1、Octree level 2等)就会负责预测生成的八叉树中一层的结构和内容(特征向量)
【论文笔记】OGN(Octree Generating Networks)论文笔记
这幅图介绍了之前提到的每一个“模块”的作用。输入到模块的是前一个模块输出的存储在hash table当中的卷积特征图,大小为(d12l1×d22l1×d32l1)(d_1\cdot2^{l-1} ×d_2\cdot2^{l-1}×d_3\cdot2^{l-1}),然后这个特征图经过一系列卷积层,得到新的特征图Fl\overline F_l,大小为(d12l×d22l×d32l)(d_1\cdot2^{l} ×d_2\cdot2^{l}×d_3\cdot2^{l}),然后基于这幅特征图,直接预测第ll层的内容:判断每个cell是empty(不是实体的cell)、filled(被占据是实体的cell)、mixed(需要细分的的cell,从图中红色可以看出,mixed由更小的filled cells和empty cells组成)中的哪一种,用131^3卷积和softmax实现。然后预测结果与ground truth计算交叉熵损失函数。同时向下一层传播时,主要仅传播被判断为“mixed”的区域

Octree编码

将体素空间用Octree表示,从而使对Voxel grid 操作的函数转化为对Octree操作的函数。
论文先介绍了实现上述操作的常规方法,并指出该方法时间复杂度较高,然后提出了使用hash table的Octree编码。具体方法如下:

  1. 假设有坐标为x=(x,y,z)\mathbf x=(x,y,z)的Octree cell位于树的第ll层,值为vv.
  2. 那么可以将这个Octree cell转化为键值对(m,v)(m,v),其中m=Z(x,l)m=Z(\mathbf x,l),其中Z()Z(\cdot)是Z-order curves.
  3. 从而八叉树OO就可以表示为键值对的集合 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)={vifkl:(Z(x,k),v)Ootherwise f(m,O)=\left\{ \begin{aligned} v && if \exist k\leq l:(Z(\boldsymbol x,k),v)\in O\\ \varnothing && otherwise\\ \end{aligned} \right.

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的交叉熵式子中的hi(f(m,OGT))h^i(f(m,O_{GT}))是真实label值的one-hot编码(h0,h1,h2)(h^0,h^1,h^2),pmi=(pm0,pm1,pm2)p_m^i=(p_m^0,p_m^1,p_m^2)是代表cell是empty,filled,mixed的概率;MlM_l是第ll层叶子集合
【论文笔记】OGN(Octree Generating Networks)论文笔记
最终OGN总目标函数是所有层的Loss之和。

Feature Propagation

将预测结果为“mixed”的,另外可能还包括一些其他的邻居cells(以便用于接下来的卷积计算)传递给下一模块

根据测试阶段是否知道Octree的ground truth,分为两种可能的传播方式:Prop-Known方法(例如语义分割,结构不变,只需要与GT做对比即可)和Prop-Pred方法(例如三维重建,结构需要预测,需要训练分类模型来判断每个voxel是empty、filled、mixed中的哪种)