【论文笔记】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

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

简介

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

本文提出了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的大体流程,其中的“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}) (d12l1×d22l1×d32l1),然后这个特征图经过一系列卷积层,得到新的特征图 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}) (d12l×d22l×d32l),然后基于这幅特征图,直接预测第 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编码。具体方法如下:

  1. 假设有坐标为 x = ( x , y , z ) \mathbf x=(x,y,z) x=(x,y,z)的Octree cell位于树的第 l l l层,值为 v v v.
  2. 那么可以将这个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.
  3. 从而八叉树 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)={ vifkl:(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中的哪种)

猜你喜欢

转载自blog.csdn.net/i0o0iW/article/details/108240406