实验记录 | PointMLP | Grouping layer + Geometric Affine

news2024/12/24 8:44:30

引言

自 PointNet++ 腾空出世,点云分析的深度框架便成为了该领域的热点,点云学习网络的发展便一发不可收拾。和大部分深度网络一样,点云网络遵循着 “降采样,聚合特征” 的基本思路,逐步提取点云的深度特征。

大部分点云网络的降采样通过 “Grouping layer” 实现,正巧本菜最近在复现 PointMLP 模型的代码,其中 LocalGrouper 就是所谓的降采样模块。许多的点云网络都有它的影子,属于网络的核心组件了,因而顺便在此记录一下。

我们都知道,图像卷积的经典思想:将周围的像素信息加权到中心像素点上,以实现降采样和特征的聚合。点云亦是如此:先通过采样选取中心点,然后找到中心点周围的邻域点,最后将邻域点的信息聚合到中心点上。这样便实现了 “降采样,聚合特征” 的效果。上代码!


代码

class LocalGrouper(nn.Module):
    def __init__(self, channel, groups, kneighbors=24, use_xyz=True, normalize="center", **kwargs):
        """
        Give xyz[b,p,3] and fea[b,p,d], return new_xyz[b,g,3] and new_fea[b,g,k,d]
        :param groups: groups number
        :param kneighbors: k-nerighbors
        :param kwargs: others
        """
        super(LocalGrouper, self).__init__()
        self.groups = groups
        self.kneighbors = kneighbors
        self.use_xyz = use_xyz
        if normalize is not None:
            self.normalize = normalize.lower()
        else:
            self.normalize = None
        if self.normalize not in ["center", "anchor"]:
            print(f"Unrecognized normalize parameter (self.normalize), set to None. Should be one of [center, anchor].")
            self.normalize = None
        if self.normalize is not None:
            add_channel=3 if self.use_xyz else
            self.affine_alpha = nn.Parameter(torch.ones([1,1,1,channel + add_channel]))
            self.affine_beta = nn.Parameter(torch.zeros([1, 1, 1, channel + add_channel]))

    # xyz:[B,1024,3], points:[B,1024,64]
    def forward(self, xyz, points):
        B, N, C = xyz.shape
        S = self.groups
        xyz = xyz.contiguous()

        """1. 最远点采样得到中心点 → xyz[B,groups,3] & fea[B,groups,64] """
        fps_idx = farthest_point_sample(xyz, self.groups).long() # [B, groups]
        new_xyz = index_points(xyz, fps_idx)        # [B, groups, 3]
        new_points = index_points(points, fps_idx)  # [B, groups, 64]
    
        """2. K-NN算法得到中心周围的k个邻域点"""
        idx = knn_point(self.kneighbors, xyz, new_xyz)
        grouped_xyz = index_points(xyz, idx)        # [B, groups, k, 3]
        grouped_points = index_points(points, idx)  # [B, groups, k, d]
        if self.use_xyz:
            grouped_points = torch.cat([grouped_points, grouped_xyz],dim=-1)  # [B, npoint, k, d+3]

        """3. 归一化处理"""
        if self.normalize is not None:
            if self.normalize =="center":
                mean = torch.mean(grouped_points, dim=2, keepdim=True)
            if self.normalize =="anchor":
                mean = torch.cat([new_points, new_xyz],dim=-1) if self.use_xyz else new_points
                mean = mean.unsqueeze(dim=-2)  # [B, groups, 1, 64]
            
            std = torch.std((grouped_points-mean).reshape(B,-1), dim=-1, keepdim=True).unsqueeze(dim=-1).unsqueeze(dim=-1)
            grouped_points = (grouped_points-mean)/(std + 1e-5)

            """4. 几何仿射变换"""
            grouped_points = self.affine_alpha*grouped_points + self.affine_beta

        new_points = torch.cat([grouped_points, new_points.view(B, S, 1, -1).repeat(1, 1, self.kneighbors, 1)], dim=-1)
        return new_xyz, new_points

Ⅰ,选取中心点:最远点采样

fps_idx = farthest_point_sample(xyz, self.groups).long()

使用最远点采样算法从 xyz 坐标中选出 groups 个点的索引,fps_idx 保存这些点的索引。[B, groups] 表示批次大小为 B,采样得到的点数为 groups

new_xyz = index_points(xyz, fps_idx)

根据 fps_idx 从原始 xyz 坐标中提取出采样得到的新坐标 new_xyz

new_points = index_points(points, fps_idx)

根据 fps_idx 从原始 points 特征中提取出与新坐标对应的特征 new_points


Ⅱ,选取邻域点:KNN算法

idx = knn_point(self.kneighbors, xyz, new_xyz)

通过K近邻(KNN)算法,从原始坐标 xyz 中找到每个 new_xyz 点的 kneighbors 个最近邻点,并返回这些邻居点的索引 idxidx 的维度通常是 [B, groups, kneighbors],表示对于每个新采样的点(new_xyz),在原始点云中找到 kneighbors 个最近的点的索引。


Ⅲ,标准化(归一化)处理

如何理解呢?其实就是把特征向量减去均值(中心化),然后除以标准差。直观上就是把特征空间中的所有点先平移到原点附近,然后除以标准差使特征的标准差为1。

(1)中心化

此处举一个非常清晰的例子:假设 new_points 是通过FPS采样得到的2个中心点,grouped_points 是根据K近邻得到的4个最近邻点,此时的 feature dimension 为 4。那么中心化就是将每个 group 中的所有点减去中心点的值。

这里用到了 torch 的广播机制啦:new_points:[3,2,1,4] → [3,2,4,4]

import torch
# [B, G, K, D] = [3, 2, 4, 4]
new_points = torch.randint(0, 10, (3, 2, 1, 4))    # [3,2,1,4]
grouped_points = torch.randint(0, 10, (3, 2, 4, 4))# [3,2,4,4]
Centralization = grouped_points - new_points
图注:点云中心化的理解
图注:点云中心化的过程示意

(2)标准差

标准化就是在中心化的基础上,除以一个标准差。标准差的计算:

std = torch.std((grouped_points-mean).reshape(B,-1), dim=-1, keepdim=True).unsqueeze(dim=-1).unsqueeze(dim=-1)

其实我觉得这里的标准差的计算挺迷惑的。现在一个点云样本有 G*K 个点,每个点有 D 个特征通道。这里直接将 G*K*D 这么多个值,全部拿来计算一个标准差,正常来说应该要在不同的特征维度分别计算标准差。这里着实把我整得挺蒙蔽的。

(3)标准化

每个点减去均值 mean (中心点)后,除以标准差 std。加上 1e-5 以避免除零错误。

grouped_points = (grouped_points-mean)/(std + 1e-5)

Ⅳ,几何仿射模块:线性变换

这里的操作是 PointMLP 模型的一个独特设计,我的理解是:不同局部区域的几何结构可能差异很大,这就意味着可能需要不同的特征提取器来捕捉这些差异。但共享的残差MLP(residual MLPs)在处理这种多样性时会遇到困难,因为它们是为通用性而设计的,而不是针对特定几何结构的差异。因此引入可学习参数,能够一定程度缓解这种情况。

最后是对归一化后的 grouped_points 进行仿射变换。self.affine_alpha 是一个缩放因子,self.affine_beta 是一个偏移量,这两个参数是可学习的,在训练过程中更新。如果你稍微品读一下代码,不难发现几何仿射实际就是一个逐元素的线性变换。

grouped_points = self.affine_alpha*grouped_points + self.affine_beta
图注:仿射变换就是逐元素的线性变换

总结

写到这里,不难发现 LocalGrouper 是非常容易理解的。作为点云网络的核心部件,LocalGrouper 模块很好地充当了“卷积”的角色,故而也有着不可撼动的地位。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2098591.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【九芯电子】星空灯语音识别芯片方案选型——NRK3301

在快节奏的现代生活中,人们对于居家环境的舒适性与便捷性追求日益增强,而星空灯语音控制的技术诞生,正是这一追求下的智慧结晶,极大地提升了居住的愉悦感与科技感。 九芯NRK3301语音识别芯片‌被广泛应用于智能照明产品中&#xf…

【python因果推断库2】使用 PyMC 模型进行差分-in-差分(Difference in Differences, DID)分析

目录 使用 PyMC 模型进行差分-in-差分(Difference in Differences, DID)分析 导入数据 分析 使用 PyMC 模型建模银行业数据集 导入数据 分析 1 - 经典 22 差分-in-差分 (DiD) 分析 2 - 具有多个干预前后观测值的差分-in-差分 (DiD) 分析 使用 PyMC…

VSCode + Git的常规操作(一)【描述详细直白,小白一学就会】

目录 一、文章简介 二、具体操作流程 1、操作前提 2、设置用户名、用户邮箱 (1)打开命令框 (2)配置用户名 (3)配置用户名邮箱 (4)查看配置 3、SSH密钥对的介绍、生成及配置…

008、架构_MDS

​架构 什么是元数据 什么是元数据 元数据又称中介数据、中继数据,为描述数据的数据,主要是描述数据属性的信息,用来支持如指示存储位置、历史数据、资源查找、文件记录等功能;GoldenDB 数据库元数据大致分为两类: 数据字典:库、表、字段属性信息、视图、函数、存储过程属…

【代码随想录训练营第42期 Day48打卡 - 单调栈 - LeetCode 739. 每日温度 496.下一个更大元素 I 503.下一个更大元素II

目录 一、做题心得 二、题目与题解 题目一:739. 每日温度 题目链接 题解1:暴力--超时 题解2:单调栈 题目二:496.下一个更大元素 I 题目链接 题解:单调栈哈希 题目三:503.下一个更大元素II 题目链…

神经网络训练不起来怎么办(五)| Batch Normalization

Ⅰ,领域背景 训练困境:当 input feature 在不同 dimension 上差距很大的时候,会产生一个非常崎岖的 error surface(误差平面)。这种崎岖多变的误差平面容易导致训练陷入以下的几个困境。 收敛困难:在崎岖…

注释1111

3。3 Batch Normalization (BN) 的工作原理 Batch Normalization 是在处理一个 "批次" 数据时,计算这个批次内所有样本的平均值和方差,然后使用这些统计量对每个样本进行归一化。这就是说: 批次(batch)&a…

局部整体(五)利用python绘制旭日图

局部整体(五)利用python绘制旭日图 旭日图( Sunburst Charts)简介 由于其形状像太阳光由内向外辐射出来,所以叫SunBurst(太阳爆发),中文也叫日出图。是多个层级的环图/饼图的拓展,可以显示多个…

GNU的编译工具链

文章目录 GNU的编译工具链 GNU的编译工具链 预编译器cpp 编译器 cc1 汇编器 as 链接器 ld 其中cpp和cc1属于gcc的一部分,as和ld属于binutils的一部分。

MySQL-如何定位慢查询

慢查询:页面加载过慢,接口压测响应时间过长(超过1s)

STM32基础篇:PWR

PWR简介 PWR(Power Control),为电源控制模块,负责管理STM32内部的电源供电部分,可以实现可编程电压监测器和低功耗模式的功能。 1、可编程电压监测器 简称PVD,可以监控VDD电源电压。当VDD下降到PVD阀值以…

yum安装nexus3详细教程分享

创建nexus用户,类似于这种中间件,尽量做到专户管理,当然如果你喜欢直接用root权限安装,更改配置文件也是可以支持的。但是实际上大多情况下,在生产环境是拿不到root权限的。 useradd -m nexus为nexus用户设置密码 pass…

AS-V1000视频监控平台客户端播放实时视频时,一些视频画面显示的时间不准确的解决方法

目录 一、背景说明 二、解决过程 1、查看设备时间 2、查看服务器时间 3、ntp介绍 1) ntp的概念 2) ntp的同步方式 3) ntp的优势 4、自动校准服务器和设备时间 1) 下载ntp 2) 修改ntp.conf 3) 重启ntp服务,自动校准时间 4) 国标重新接入设备自动同步时间 三、问题解…

zStorage在海光CPU架构上的性能调优

前言 随着"信创"的东风吹遍大江南北,各家公司都开始了国产化的适配道路。zStorage团队当然也没有缺席,去年我们适配了华为的鲲鹏架构,整体性能水平达到了Intel架构的70%以上。今年我们开始着力于海光CPU架构的适配。与鲲鹏架构相比…

【linux学习指南】权限管理与文件访问设置方法

文章目录 📝前言🌠 bc指令🌉uname –r指令 🌠重要的几个热键[Tab],[ctrl]-c, [ctrl]-d🌉关机 🌠命令扩展🌉shell命令以及运行原理 🌠Linux权限的概念🌠 Linux权限管理&am…

善用工具:开发与效率

文章目录 常用工具Visual Studio Code(VS Code)GitDockerPostman 效率对比VS Code 与 Sublime TextGit 与 SVNDocker 与虚拟机Postman 与 cURL 近来趋势人工智能与编程工具的结合低代码与无代码平台版本控制的演进准备自适应的开发环境与新兴技术的整合 …

Linux驱动(三):字符设备驱动之杂项

目录 一、Linux设备分类二、设备号与字符设备的编码方式1.设备号2.字符设备的编码方式 三、杂项字符设备驱动的初级编写 一、Linux设备分类 Linux下一切皆文件,所有的硬件设备在Linux应用层中都会被抽象成文件,所有对硬件设备的操作到应用层中&#xff0…

电脑垃圾箱删除的东西怎么找回来?介绍四个有效方法

在日常使用电脑的过程中,‌我们可能会不小心删除一些重要文件,‌而这些文件往往会被放入垃圾箱(‌回收站)‌。‌但有时候,‌我们可能会清空垃圾箱,‌导致这些文件看似永久丢失。‌其实,‌即使垃…

RFID光触发标签在汽车制造行业的深度应用

汽车制造行业作为现代工业的重要支柱,面临着日益激烈的市场竞争和不断提高的客户需求。传统的汽车制造管理方式在生产过程监控、零部件管理、质量追溯等方面存在诸多不足,而 RFID 光触发标签技术的出现为汽车制造行业的转型升级提供了有力的解决方案。 …

用友大易:以AI创新驱动招聘未来,引领2024 AIGC商业新趋势

更多内容前往个人网站:孔乙己大叔 在科技日新月异的今天,人工智能(AI)正以前所未有的速度渗透并重塑各行各业,其中,企业招聘领域也不例外。8月22日,由创业邦及2024 AGI商业趋势大会组委会主办的…