PointCNN: Convolution On $\mathcal{X}$-Transformed Points

Yangyan Li, NeurIPs 2018

1. Intuition

解决点的排列不变性(permutation invariance)的常见方式是采用对称函数来转换特征,本文采用的是将点云按照一个固定的顺序排列的方式。PointNet的paper中论述过将点云按照顺序排列是很难完成的,但本文采取mlp来学习这种映射,即使作者表示确实没有学习到很好的排列映射,但最终仍取得了不错的效果。

本文采用mlp学习\(\mathcal{X}\)-transform,将这个transform作用于点云上从而达到两个效果:

  1. 将点云映射到一个固定顺序的排列上;
  2. 对各点的特征进行加权。

然后对transformed points进行卷积操作,因为已经解决了permutation invariance的问题,所以直接进行卷积即可。这个过程称为\(\mathcal{X}\)-conv。类似于经典的conv,可以堆叠使用。总体上看也是一个local-to-global的结构,并采取knn来提取邻域。

2. Implement

对于classification,采用随机取样的方式提取中心点;对于segmentation,采取FPS(Farthest Points Sampling)的方式提取中心点。都通过knn的方式获取邻域中的点。为了增大卷积的感受野,作者设置了扩大因子(balition rate)。通过knn取得\(K\cdot D\)个点,再从中随机取出K个点。

对于一个邻域\(\{p, P, F\}\),分别表示中心点、邻域点、点特征。那么\(\mathcal{X}\)-conv可以表示为:

\[F_p=\mathcal{X}-Conv(K, p, P, F)=Conv(K, MLP(P-p)\times [MLP_{\delta}(P-p), F]) \]

也就是先将邻域点转移到中心点为原点的相对坐标系下,分别过两个mlp,一个将学习相对位置的高维特征,一个学习\(\mathcal{X}\)-transform。将mlp映射出的特征与原本的特征拼接,并进行\(\mathcal{X}\)-transform,之后通过卷积核为K的卷积操作。通过堆叠这种操作提升特征维数,最后通过fc进行分类。

3. Experiment

实验:3D&2D classification,segmentation

4. Code

https://github.com/hxdengBerkeley/PointCNN.Pytorch

classifier: 
	5 * RandPointCNN ==> 3 * FullConnection
RandPointCNN:
	sample centroid point ==> PointCNN
PointCNN:
	group neighborhood points ==> XConv
XConv:
	input: rep_pt(N, P, 3), pts(N, P, K, 3), fts(N, P, K, dim)
		#    中心点               分组后的点云    对应的特征
    forward:
    	p_centor = rep_pt.unsqueeze(rep_pt, dim=2)  # (N, P, 1, 3)
    	pts_local = pts - p_center  # (N, P, K, 3)
    	fts_lifted = fc(pts_local)  # (N, P, K, high_dim)
    	fts_cat = cat(fts_lifted, fts)  # (N, P, K, high_dim + dim)
    	
    	X = MLP(pts_local),view(N, P, K, K)
    	fts_X = X.matmul(fts_cat)  # (N, P, K, high_dim + dim)
    	fts_X = fts_X.view(N, high_dim + dim, P, K)
    	y = conv2d(in_channel=high_dim+dim, 
    			   out_channel=output_dim, 
    			   kernel_size=(1, K))
    	return y
    	

posted on 2019-07-02 13:34  蔚_VI  阅读(201)  评论(0)    收藏  举报

导航