【点云识别】FPConv: Learning Local Flattening for Point Convolution (CVPR 2020)

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,应该在调参上下了一番功夫。

总结

感谢作者开源代码!

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值