O-CNN的学习理解

最近在看3d reconstruction 的东西,尝试用voxel去做,但是一直受困于分辨率的问题,刚好读到了Microsoft Research Asia 的O-CNN的文章,觉得写得非常的好,也可以用于后续的解决内存开销的问题,这里记录学习下:

文献题目:O-CNN:Octree-based Convolutional Neural Network for 3D Shape Analysis

文献的key idea: (1)以八叉树的数据结构存储平面的信息(后续的操作都是基于这种数据结构)

                           (2)将对平面的计算限定在平面的附近(节省计算开开销)

 

文章中使用的关键信息:

(1)首先是体素化一个三维空间中的模型(模型的cell中存储了信号值,可以使用0/1信号,也可以使用法向量的信号),对每一个存储信息的点进行求梯度,发现梯度不为0的地方只存在于surface上面,因此产生了将计算限制在模型表面的想法。

(2)对于体素化后的八叉树模型使用z-order curve这种方式进行存储,这种存储方式的优势在于,可以通过简单的计算快速求取索引的值,并且完美契合了卷积的运算方式和规则。

Overview

文章的作者要做的工作是借助于八叉树的优势,存储稀疏的离散化的体积数据,之后在这个数据结构之上进行基本的操作。在每一个八叉树的叶子结点上,作者选择存储的是法向量信息(作者后续在进行试验的时候,发现存储0/1信息和存储法向量信息差距不大)。卷积和池化之后,信息向上传递,每一次池化和卷积作为基础的unit。其中,一个关键的技术就是,在进行运算的时候,如何一次性送入多个八叉树结构保存的信息。

 

        

通过添加超结点来构建一个大型八叉树送入运算

 

这种方式理论上可以支持任意的网络设计,同时提升了物体的体素下的分辨率,并且节省了开销和计算的内存。

 

作者介绍了一些其他的方法用于3d的深度学习:

(1)基于体素

(2)基于流形

(3)多视角

(4)基于八叉树(本文)

 

接下来介绍了最重要的几个点,分别是怎样使用八叉树的数据结构去存储,以及最重要的两个运算操作,卷积和池化操作。

一. 八叉树的结构

(1)八叉树的构建。作者使用一个空间中的bounding cube保卫一个3d模型,重复递归的划分这个cube,直到达到设定的分辨率为止。(每次都把下一层划分为8个子空间)

(2)shuffle key。使用这种标志存储关键信息。在八叉树的每一层,作者根据这些值进行排序并将它们组成了一个一维的向量。

(3)Label。为了快速寻找八叉树中的父子结点之间的关系,作者设定了一个label存储和标志非空的信息。

这个图显示了一个二维上的四叉树的存储方式,用到了前文说的信息。数据结构。图 (a) 中红色部分表示一个二维形状, l=0,1,2 表示了不同深度下四叉树,每个节点的标号用排序过的散乱键标定并记在数组 里如 图 ( b),每一层非空节点的序号(从 1 开始计数, 0表示空节点)由数组存储 图 (c) 。图(d)展示了输入信息之后,最大池化的过程,对于父层的信息,不存在的直接补0。

二.3D Convolution.

卷积操作是重要的一环,由于模型是使用八叉树的结构来存储的,因此卷积的方式会有些不一样。

下面给出了卷积的公式:

其中Oijk为一个octant的领域,T代表了Oijk的feature map,n代表了channel,W为卷积的权重。若Oijk不存在,那么在T下的计算结果为0。

关于卷积还有一个很关键的点是,卷积操作通常作用于一个规则的数据域上面,意味着,如果卷积核的大小为K,那么需要计算K^3-1的领域数据,通常可以采用预结算来保存周围区域的信息,从而在计算时,方便快速寻取。作者这里建立了一个哈希表,来进行哈希表键值和octant对应的shuffle key value值的对应,从而可以减少I/O的开销,提升效率。

接下来的一个问题是,在对一个父结点下的子结点进行卷积的时候,会有非常多的重复的运算操作,因此,可以用一种新的组织方式进行组建,从而减小重复的操作,作者以二维的四叉树举例:

如图所示,将A,B,C,D组建为一个域,那么可以转化为一个stride为1的卷积操作,从而可以将36个neighbors减小为16,从而可以避免很多重复的计算开销。

三.池化操作

池化可以看做是一种特殊的卷积操作,作者采用了最大池化操作。

 

 

网络结构设计

作者将一个卷积+池化+归一化+激活函数作为一个unit,之后的网络的设计和常用于普通的image的网络结构相似。因此作者提到,理论上可以使用这种结构去设计任何一种的网络,并作用于三维模型中,去实现一些识别,分割和生成的任务。

 

附上链接:

文献地址:https://arxiv.org/abs/1712.01537

github地址:https://github.com/microsoft/O-CNN

作者讲解:http://v.qq.com/vplus/1ca1131c9101fffbee34a4e73a803f62/folders

  • 4
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值