FPConv: Learning Local Flattening for Point Convolution
本文介绍一篇cvpr2020里面关于点云识别的文章。
论文
代码
1. 问题
给出了一种平面化的卷积方式
2. 思想
摒弃了先映射再卷积的两步骤处理方式,将两个过程合成一个过程。定义了FPConv 的平面卷积操作。
整个网络的架构如下
3. 算法
FPConv
相当于将每个点及其邻域映射成了一个平面处理,贴下部分代码会更好理解。
# get distribution vector
grouped_xyz, grouped_feats = self.grouper(xyz, new_xyz, features) #grouped_xyz: B, 3, npoint, nsample
proj_wts = self.wts_layer(grouped_xyz) # B,ml,np,ns
if self.use_xyz:
grouped_feats = torch.cat([grouped_xyz, grouped_feats], dim=1)
# normalize weights
# normalize at dim 1 <ml>
proj_wts2_ = proj_wts ** 2 # B, ml, np, ns
proj_wts_sum = torch.sum(proj_wts2_, dim=1, keepdim=True) # B, 1, np, ns
proj_wts_sum = torch.max(proj_wts_sum, torch.tensor(1e-8).cuda())
proj_wts_sum = torch.sqrt(proj_wts_sum) # B, 1, np, ns
proj_wts = proj_wts / proj_wts_sum
# normalize at dim 3 <nsample>
# proj_wts2_ = proj_wts ** 2 # B, ml, np, ns
proj_wts_sum = torch.sum(proj_wts2_, dim=3, keepdim=True) # B,ml,np,1
proj_wts_sum = torch.max(proj_wts_sum, torch.tensor(1e-8).cuda())
proj_wts_sum = torch.sqrt(proj_wts_sum) # B, 1, np, ns
proj_wts_sum = torch.max(proj_wts_sum, torch.tensor(1.0).cuda())
proj_wts = proj_wts / proj_wts_sum # B,ml,np,ns
# projection
proj_wts = proj_wts.transpose(1,2) # B, np, ml, ns
grouped_feats = grouped_feats.permute(0, 2, 3, 1) # B, C, np, bs => B, np, ns, C
proj_feats = F.leaky_relu(proj_wts.matmul(grouped_feats) + self.bias, negative_slope=relu_alpha, inplace=True) # B, np, ml, C
# reshape projection features # B, np, ml, C => B, C, ms, ms, np
bs = proj_feats.size(0)
proj_feats = proj_feats.transpose(1, 3) # B, C, ml, np
proj_feats = proj_feats.view(bs, -1, self.map_size, self.map_size, self.npoint).contiguous() # B, C, ms, ms, np
# convolution
proj_feats = self.proj_conv(proj_feats) # B, C_new, 1, 1, np
proj_feats = proj_feats.squeeze(3).squeeze(2) # B, C_new, np
return new_xyz, proj_feats
个人拙见,就是局部点域的attention,然后将其抽象成平面卷积.
4 实验结果
分类的效果一般
ScanNet数据集上的效果一般,但是在S3DIS数据集上的分割效果还不错。
这篇文章使用了Switchable Normalization, SGD优化器momentum=0.98, 训练的batch_size为12,应该在调参上下了一番功夫。
总结
感谢作者开源代码!