Brief
这是一篇CVPR18上的文章,虽然表示是说的实例分割;但是听同组的同学的推荐,也可以做定位方面的事情,因此加入到了paperlist。
Abstruct
Instead of treating object proposal as a direct bounding box regression problem, we take an analysis-by-synthesis strategy and generate proposals by reconstructing shapes from noisy observations in a scene。
- 通过综合分析的方式获得proposals。是不是可以取代anchor_based的方法。
1 introduction
In contrast, we take a different perspective for object proposal which emphasizes more on the geometric understanding.**
- 文章的亮点就在于从场景中分析出candidate objects。好处是双重的:
1.提出的proposals是具有higher objectness的,GSPN生成网络是预先会去学习目标长什么样子再去提出候选框的。
2.GSPN对自然物体场景下分布的噪声进行观察编码,可以看做是一个实例感知提取的过程。(有点迷,后续解释)
- 结合GSPN提出的proposals,作者提出了一个R-Pointnet网络。作者类比为Mask-RCNN.
2 related work
2.1 Object Detection and Instance Segmentation
- 2D检测发展
- 3D的CNN
- 特别提了一下CVPR18上的第一篇实例分割的文章,SGPN学习相似度矩阵的方法。作者表示这种自下而上的聚合策略不能很好的保证proposals具有较高的objectness
2.3D Generative Models
对于做3D检测的我来说。我觉得在3D中改掉anchor_based的方法才是重点,因此这一部分细看。
- VAE,变分自动编码器是经常用于在图像生成和形状生成上经常使用的,它通过学习采样的数据 x x x来学习一个分布,这样不仅仅可以将采样数据解码为原始数据形式。VAE通过学习数据分布并最大拟合其相似分布。然而,VAE不能像采样的数据中add controls(不太懂,先放一下);因此一个后续的工作CAVE就此诞生了。
- 因为CAVE和VAE可以学习数据分布的相似性,但是GAN不能,因此作者选择了VAE。(怎么用CVAE生成proposals呢?)
2.3 Deep Learning on Point Cloud
- pointnet
- graph
3 Method
两个大部分:
- GSPN(proposals)
- R-PointNet(instance segmentation)
GSPN
GSPN的voerview:
GSPN采用生成object的方法去生成proposal。通过一个采样点生成一个和采样点编码点原始数据类似的proposals。作者称这个GSPN为CVAE方法。
上图由几个子网络组成:
-
prior network和recognition network用于参数化 为一个高斯分布。
-
generation network学习生成表达式
-
center-prediction network用于中心化上下文数据以及提出Location information
中心点 s s s采用球体结构选择三个尺度的scale进行输入。也就是 c 1 , c 2 , c 3 c_1,c_2,c_3 c1,c2,c3
整个过程都是很明显的,就像上图所表示的那样:
1.首先center_network把三个尺度的信息进行编码融合成 t t t(作者这里说的是中心点 t t t的回归)
2.将 t t t进行translate后得到 c ^ \widehat{c} c 送入预先训练好的prior nework.再映射为一个高斯先验分布。
3.Recognition network和prior network共享输入数据
代码
这里是 代码
前面环境搭建和编译pointnet++的操作我就不说了,我的环境是py3.5+tf1.14因此有些地方是需要改进的,下面记录一下需要改进的地方:
在执行第一步时,即:
python data_prep.py ./data/scannet ./data/scannet_preprocessed
在文件data_pre.py
的第86行会出现问题如下:
out_sem = sem_label[idx]
IndexError: too many indices for array
也就是数组越界的问题,我也不知道为什么会出现这个问题。如下修改:
第41和42行源码:
semLabel = np.array(map(int, semLabel))
outGroups = np.array(map(int, outGroups))```
改为:
semLabel = np.array( semLabel)
outGroups = np.array( outGroups)