Yangyan Li, NeurIPs 2018
解决点的排列不变性(permutation invariance)的常见方式是采用对称函数来转换特征,本文采用的是将点云按照一个固定的顺序排列的方式。PointNet的paper中论述过将点云按照顺序排列是很难完成的,但本文采取mlp来学习这种映射,即使作者表示确实没有学习到很好的排列映射,但最终仍取得了不错的效果。
本文采用mlp学习\(\mathcal{X}\)-transform,将这个transform作用于点云上从而达到两个效果:
然后对transformed points进行卷积操作,因为已经解决了permutation invariance的问题,所以直接进行卷积即可。这个过程称为\(\mathcal{X}\)-conv。类似于经典的conv,可以堆叠使用。总体上看也是一个local-to-global的结构,并采取knn来提取邻域。
对于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进行分类。
实验:3D&2D classification,segmentation
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
PointCNN: Convolution On $\mathcal{X}$-Transformed Points
原文:https://www.cnblogs.com/VI3160846668/p/11120108.html