Advertisement

【点云系列】Pointfilter: Point Cloud Filtering via Encoder-Decoder Modeling

阅读量:

文章目录

  • 1. 概要

  • 2. 动机

  • 3. 方法

    • 预处理:
    • 整体框架:
    • 编码器Encoder
    • Decoder 解码器
    • 损失函数
    • 分析
  • 4. 实验

1. 概要

发表在TVCG2021 期刊
代码:http://github.com/dongbo-BUAA-VR/Pointfilter
基本使用到了双边滤波的思考

2. 动机

学习位移矢量, 去噪后的点 = 噪声 + 位移矢量
所以本质的处理就是去计算出 这里的位移矢量。

3. 方法

预处理:

给定一组点云 真实块P和噪声块\hat{P}r是块半径,一般为包围盒对角线5%
在这里插入图片描述
P:干净的点云
N: 噪声
在这里插入图片描述
一旦生成了块,在点云滤波中需要考虑两个问题:

  1. 如何避免 观察域中不必要的自由度?
  2. 如何保障Pointfilter对某些几何变换敏感?

对于1, 可以将块变换到原点(以\hat{p_i}为中心),并且进行一下伸缩变换
在这里插入图片描述

为了保障刚体不变性,使用PAC对齐,先对其Z轴,然后X轴。
为了方便调参,默认输入快|\hat{P}_i|=500,块的点数小于500则进行填充,大于的话则进行下采样。

整体框架:

根据相邻结构 将每个噪声投影到基础表面上,因此设计编解码网络:
在这里插入图片描述

编码器Encoder

输入:PCA处理后的点云块
目的:或则特征表示信息
内容:

  1. 特征提取:用MLP实现,提取不同尺度的特征
  2. Collector:其实就是max-pooling操作,将特征转为一个1024维的特征。
    整体基本就是PointNet+Batch Norm,保障每一层特征都是标准分布。
    在这里插入图片描述
    代码描述
复制代码
    class pointfilter_decoder(nn.Module):
    def __init__(self):
        super(pointfilter_decoder, self).__init__()
    
        self.fc1 = nn.Linear(1024, 512)
        self.fc2 = nn.Linear(512, 256)
        self.fc3 = nn.Linear(256, 3)
    
        self.bn1 = nn.BatchNorm1d(512)
        self.bn2 = nn.BatchNorm1d(256)
    
        self.dropout_1 = nn.Dropout(0.3)
        self.dropout_2 = nn.Dropout(0.3)
    
    def forward(self, x):
        x = F.relu(self.bn1(self.fc1(x)))
        # x = self.dropout_1(x)
        x = F.relu(self.bn2(self.fc2(x)))
        # x = self.dropout_2(x)
        x = torch.tanh(self.fc3(x))
        return x
    
    
    
    bash
![](https://ad.itadn.com/c/weblog/blog-img/images/2025-07-12/IkHPBQNpTmRwiF5tSMVZnsoCyc8Y.png)

Decoder 解码器

解码器就直接是FCN,然后转换到坐标域。
这里需要注意,学习到的是去噪去掉的部分,那么其中公式7 r\mathbf{R}^{-1}f(.)这一项就是一个位移矢量。
在这里插入图片描述
如图所示,其实就是这里的n_i
在这里插入图片描述
代码描述

复制代码
    class pointfilter_decoder(nn.Module):
    def __init__(self):
        super(pointfilter_decoder, self).__init__()
    
        self.fc1 = nn.Linear(1024, 512)
        self.fc2 = nn.Linear(512, 256)
        self.fc3 = nn.Linear(256, 3)
    
        self.bn1 = nn.BatchNorm1d(512)
        self.bn2 = nn.BatchNorm1d(256)
    
        self.dropout_1 = nn.Dropout(0.3)
        self.dropout_2 = nn.Dropout(0.3)
    
    def forward(self, x):
        x = F.relu(self.bn1(self.fc1(x)))
        # x = self.dropout_1(x)
        x = F.relu(self.bn2(self.fc2(x)))
        # x = self.dropout_2(x)
        x = torch.tanh(self.fc3(x))
    
        return x
    
    
    
    bash
![](https://ad.itadn.com/c/weblog/blog-img/images/2025-07-12/um7JhURfisMn2aj6IFEGoDQXCWyV.png)

损失函数

包含两种: 投射损失L^a_{proj} + 相似性损失L_{rep}
利用排斥惩罚项的聚合,总体损失如下公式5所示。其中\eta=0.97
在这里插入图片描述
投射损失:公式3
在这里插入图片描述
高斯函数:公式4
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

diag大小为P_i的包围盒的对角线长度,m=|\hat{P}_i|, 支持角度默认15度。\mathbf{n}是法向量。

分析

结合传统去噪方法设计loss,紧凑表达;但对尖锐噪声保留不是很好。

4. 实验

在这里插入图片描述

全部评论 (0)

还没有任何评论哟~