PCL入门系列 —— StatisticalOutlierRemoval 点云统计滤波

PCL入门系列 —— StatisticalOutlierRemoval 点云统计滤波


前言

随着工业自动化、智能化的不断推进,机器视觉(2D/3D)在工业领域的应用和重要程度也同步激增(识别、定位、抓取、测量,缺陷检测等),而针对不同作业场景进行解决方案设计时,通常会借助PCL、OpenCV、Eigen等简单方便的开源算法库进行方案的快速验证和迭代以满足作业场景下的目标需求。

为了让对工业机器视觉方向感兴趣的同学能够少走一些弯路,故推出了此一系列简易入门教程示例,让初次使用者能够最简单直观地感受到当前所用算法模块的执行效果。

后续会逐步扩增与工业机器视觉相关的一些其它内容,如:

项目案例剖析场景数据分析基础算法模块相机评测 等;

如有兴趣可加入群聊(若入群二维码被屏蔽,则可以通过Q群(1032861997)或评论、私信博主“群聊”,邀请入群),与同道同学及圈内同行一起交流讨论。

在这里插入图片描述


程序说明

展示 StatisticalOutlierRemoval 统计滤波效果;

输出结果

在这里插入图片描述

代码示例

/*
 * @File: statistical_outlier_removal.cpp
 * @Brief: pcl course
 * @Description: 展示StatisticalOutlierRemoval统计滤波效果
 * @Version: 0.0.1
 * @Author: MuYv
 */
#include <iostream>
#include <string>
#include <pcl/point_types.h>
#include <pcl/point_cloud.h>
#include <pcl/io/pcd_io.h>
#include <pcl/filters/statistical_outlier_removal.h>
#include <pcl/visualization/pcl_visualizer.h>



int main(int argc, char** argv){
    if(argc != 2){
        std::cout<<"Usage: exec cloud_file_path"<<std::endl;
        return -1;
    }
    const std::string kCloudFilePath = argv[1]; // ../clouds/table_scene.pcd

    // 定义变量
    pcl::PointCloud<pcl::PointXYZ>::Ptr \
                    cloud_src(new pcl::PointCloud<pcl::PointXYZ>());
    pcl::PointCloud<pcl::PointXYZ>::Ptr \
                    cloud_filtered(new pcl::PointCloud<pcl::PointXYZ>());

    // 成功返回0,失败返回-1
    if(-1 == pcl::io::loadPCDFile(kCloudFilePath,*cloud_src)){
        std::cout<<"load pcd file failed. please check it."<<std::endl;
        return -2;
    }

    // 创建统计滤波模板类对象
    pcl::StatisticalOutlierRemoval<pcl::PointXYZ> sor;
    // 设置输入点云
    sor.setInputCloud(cloud_src);
    // 设置统计分析时的邻域点数
	sor.setMeanK(50); //K近邻搜索点个数
    // 设置标准差系数
	sor.setStddevMulThresh(1.0); //标准差倍数
    // 默认是剔除不满足统计分析的点(噪声点),如需反向操作,则设为true
	sor.setNegative(false); //此处保留未滤波点(内点)
    // 执行滤波,并带出结果数据
	sor.filter(*cloud_filtered);  //保存滤波结果到cloud_filtered

    // 创建可视化对象
    pcl::visualization::PCLVisualizer viewer("viewer");

    // 将当前窗口,拆分成横向的2个可视化窗口,以viewport区分(v1/v2)
    int v1; 
    int v2;
    //窗口参数分别对应 x_min, y_min, x_max, y_max, viewport
    viewer.createViewPort(0.0, 0.0, 0.5, 1.0, v1);  
    viewer.createViewPort(0.5, 0.0, 1.0, 1.0, v2);

    // 添加2d文字标签
    viewer.addText("v1", 10,10, 20, 1,0,0, "viewport_v1", v1);
    viewer.addText("v2", 10,10, 20, 0,1,0, "viewport_v2", v2);

    // 添加坐标系
    viewer.addCoordinateSystem(0.5);    // 单位:m

    // 设置可视化窗口背景色
    viewer.setBackgroundColor(0.2,0.2,0.2);     // r,g,b  0~1之间

    // 向v1窗口中添加点云
    viewer.addPointCloud(cloud_src,"cloud_src",v1);
    // // 根据点云id,设置点云可视化属性,此处将可视化窗口中的点大小调整为2级
    // viewer.setPointCloudRenderingProperties \
    //         (pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 2, "cloud_src");

    // 向v2窗口中添加点云
    viewer.addPointCloud(cloud_filtered,"cloud_filtered",v2);
    // // 根据点云id,设置点云可视化属性,此处将可视化窗口中的点大小调整为2级
    // viewer.setPointCloudRenderingProperties \ 
    //         (pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 2, "cloud_filtered");

    // 关闭窗口则退出
    while(!viewer.wasStopped()){
        viewer.spinOnce(100);
        boost::this_thread::sleep(boost::posix_time::microseconds(100000));
    }

    return 0;
}

总结

基于当前点与邻域点数据的距离统计信息进行离群点判定并进行剔除,当噪声数据的空间点密度与有效区域的点密度差距较为明显时会有不错的滤波效果;


注:部分测试所用点云数据来源于网络,如有侵权,请联系博主删除,谢谢。

<think>嗯,用户问的是“通道注意力是怎么实现的”。首先,我需要回忆一下通道注意力的基本概念。通道注意力是注意力机制的一种,主要用于计算机视觉中的卷积神经网络,用来增强重要通道的特征响应。常见的实现方式有SENet中的Squeeze-and-Excitation模块,还有后来的CBAM中的通道注意力模块。 用户可能是在学习注意力机制的相关知识,或者在准备考试、面试时需要了解通道注意力的实现细节。考虑到用户之前询问过DAE-Former的结构,可能对注意力机制在Transformer和CNN中的应用都有兴趣。这时候需要区分通道注意力和空间注意力,但用户现在只问了通道注意力,所以需要集中在这个点上。 接下来,我需要详细解释通道注意力的实现步骤。首先,SENet的基本结构分为Squeeze和Excitation两个阶段。Squeeze阶段通常使用全局平均池化来压缩空间信息,得到每个通道的全局特征。然后,Excitation阶段通过全连接层学习通道间的依赖关系,生成权重向量,最后将权重与原特征相乘,进行特征重标定。 可能还需要提到其他变种,比如CBAM中的通道注意力模块,可能会结合最大池化和平均池化的结果,或者使用不同的激活函数。此外,可以提到轻量化的改进,比如ECA-Net通过一维卷积减少参数量,而无需降维。 用户可能有更深层的需求,比如理解通道注意力的作用、为什么有效,或者如何在代码中实现。因此,在解释实现步骤时,可以结合数学公式和结构图,帮助理解。例如,使用全局平均池化的公式,以及全连接层如何生成权重。 需要注意术语的准确性,比如“压缩激励”、“通道权重”等,同时避免过于技术化的描述,保持解释的易懂性。可能还需要举例子,比如在ResNet中加入SE模块后的效果提升,说明其实际应用价值。 最后,总结通道注意力的核心思想,并指出其在不同网络中的应用和改进,这样用户能够有一个全面的理解。同时,提醒用户如果有具体应用场景或代码实现的问题,可以进一步探讨,以提供更有针对性的帮助。</think>通道注意力是计算机视觉中提升特征表达的重要机制,其核心思想是**让网络自动学习不同通道特征的重要性权重**。以下是其实现原理的通俗化解析: --- ### **一、基础实现流程(以经典SENet为例)** 1. **特征压缩(Squeeze)** - 输入特征图尺寸:$C×H×W$(通道×高×宽) - 通过全局平均池化(GAP)压缩空间维度: $$ z_c = \frac{1}{H×W}\sum_{i=1}^H\sum_{j=1}^W x_c(i,j) $$ → 输出$1×1×C$的通道描述向量 2. **权重生成(Excitation)** - 使用全连接层学习通道关系: $$ s = \sigma(W_2δ(W_1z)) $$ - $W_1$:降维矩阵($C×\frac{C}{r}$),r为压缩比 - $W_2$:升维矩阵($\frac{C}{r}×C$) - $\delta$:ReLU激活,$\sigma$:Sigmoid激活 3. **特征重标定(Reweight)** - 将学习到的通道权重与原始特征相乘: $$ \tilde{x}_c = s_c \cdot x_c $$ → 增强重要通道,抑制无关通道 --- ### **二、关键改进方案** | 改进版本 | 创新点 | 数学表达 | 优势 | |---------------|---------------------------|-----------------------------|---------------------| | **CBAM** | 并行最大池化 | $z_{max}=MaxPool(x)$ | 捕获更显著特征 | | **ECANet** | 一维卷积代替全连接 | $s=\sigma(Conv1D(z))$ | 减少参数,避免降维 | | **GSoP-Net** | 二阶统计量建模 | $z=H×W$协方差矩阵 | 捕获高阶通道关系 | | **SRM** | 频域分析与空间注意力结合 | 离散余弦变换(DCT) | 增强频域特征选择 | --- ### **三、可视化理解** ``` 原始特征图 通道权重向量 加权后特征图 [ C×H×W ] ⊗ [ s₁ s₂ ... sₙ ] → [ s₁x₁, s₂x₂,... sₙxₙ ] ▲ ▲ │ │ 全局池化 权重学习网络 ``` --- ### **四、典型应用场景** 1. **医学影像分割**:增强病变组织通道响应(如肿瘤区域) 2. **目标检测**:提升关键物体所在通道的激活强度 3. **图像去噪**:抑制噪声特征通道的传播 4. **跨模态融合**:调节不同模态特征的融合权重 --- ### **五、代码实现片段(PyTorch)** ```python class ChannelAttention(nn.Module): def __init__(self, channel, reduction=16): super().__init__() self.avg_pool = nn.AdaptiveAvgPool2d(1) self.fc = nn.Sequential( nn.Linear(channel, channel // reduction), nn.ReLU(inplace=True), nn.Linear(channel // reduction, channel), nn.Sigmoid() ) def forward(self, x): b, c, _, _ = x.size() y = self.avg_pool(x).view(b, c) # Squeeze y = self.fc(y).view(b, c, 1, 1) # Excitation return x * y.expand_as(x) # Reweight ``` --- ### **六、实验对比数据** 在ImageNet数据集上的性能提升: | 模型 | 参数量增加 | Top-1 Acc提升 | 推理速度变化 | |------------|------------|---------------|--------------| | ResNet50 | +2.5M | +1.8% | -7% | | MobileNetV2| +0.03M | +1.2% | -3% | | ViT-Tiny | +0.4M | +2.1% | -12% | --- **核心价值**:通道注意力通过**动态特征选择机制**,使网络能够自适应地关注关键信息通道,这种仿生设计思想(类似人类视觉的注意力聚焦)显著提升了模型的特征表达能力。在实际部署时需权衡计算开销,工业级应用常采用轻量化改进方案(如ECANet)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值