目录

jittorPCD

基于 Jittor 框架的点云去噪竞赛方案。

数据预处理

概述

预处理脚本 preprocess.py 将原始 OBJ 网格文件转换为模型训练所需的点云数据。整个流程分为 3 步,每步产出独立的缓存文件,支持断点续跑(已存在的文件自动跳过)。

运行方式

python preprocess.py --config preprocess.yaml --num_workers 16

参数说明:

参数 默认值 说明
--config preprocess.yaml 配置文件路径
--num_workers 16 并行进程数
--n_points 配置文件中的 dataset.n_points (65536) FPS 输出点数,决定训练点云密度
--n_surface 配置文件中的 dataset.n_surface (262144) 表面稠密采样点数,供 FPS 从中选取

配置文件

preprocess.yaml

dataset:
  DATA_PATH: "dataset_train"   # 训练数据根目录
  n_surface: 262144            # Step 2 表面采样点数(稠密,供 FPS 从中选取)
  n_points: 65536              # Step 3 FPS 输出点数(决定训练点云密度)

n_surfacen_points 的关系: n_surface 是表面采样的稠密点数,n_points 是 FPS 从中选出的均匀子集大小。n_surface 应显著大于 n_points(建议 4x-8x),否则 FPS 退化为无意义的重排序。

依赖

  • numpy
  • tqdm
  • pyyaml
  • numba(可选,加速 FPS 约 3-5x)

数据目录结构

输入数据目录由配置文件中的 dataset.DATA_PATH 指定,期望如下结构:

dataset_train/
  shapenet/
    <synset_id>/          # ShapeNet 类别 ID,如 02691156(飞机)
      <model_id>/
        models/
          model_normalized.obj

处理流程

Step 1: OBJ → 顶点缓存

解析 OBJ 文件中的顶点坐标,保存为 .obj.npy 加速后续加载。

model_normalized.obj  →  model_normalized.obj.npy
                        (V, 3) float32

仅提取 v 开头的行(顶点),忽略面、法线、纹理坐标等信息。

Step 2: 表面均匀采样

在三角网格表面进行面积加权均匀采样,生成稠密点云。

model_normalized.obj  →  model_normalized_surface{n_surface}.npy
                        (n_surface, 3) float32,默认 262144

算法细节:

  1. 解析 OBJ 中的三角面片(f 行,仅处理三角形,四边形及以上面片跳过)
  2. 计算每个三角形面积:area = 0.5 × ||cross(v2-v1, v3-v1)||
  3. 按面积比例采样三角形索引(np.random.choice,概率正比于面积)
  4. 在选中的三角形内生成均匀分布的采样点(反射法生成重心坐标)

为什么需要这一步: 直接使用 OBJ 顶点会导致点云稀疏(低多边形模型可能只有几十个顶点),且顶点分布受建模拓扑影响不均匀。表面采样生成稠密点云作为 FPS 的输入池。

Step 3: 最远点采样(FPS)

从稠密表面采样点中选出 n_points 个空间分布最均匀的点。

model_normalized_surface{n_surface}.npy  →  model_normalized_fps{n_points}.npy
                                            (n_points, 3) float32,默认 65536

算法细节(贪心 FPS):

  1. 随机选择一个初始点
  2. 维护每个点到已选集合的最小距离
  3. 每步选择距离已选集合最远的点加入
  4. 重复直到选够 n_points 个点

加速: 安装 Numba 后自动启用 JIT 编译加速(约 3-5x 提速),未安装则使用纯 NumPy 实现。

为什么需要这一步: 表面采样的点虽然稠密但分布受三角形面积影响,FPS 从稠密点集中选出空间分布最均匀的子集,保证点云均匀覆盖整个物体表面。

产出文件汇总

每个 OBJ 文件处理后产出以下缓存文件:

文件 内容 形状
model.obj.npy 顶点坐标缓存(Step 1) (V, 3) float32
model_surface{S}.npy 表面稠密采样点(Step 2) (S, 3) float32
model_fps{N}.npy FPS 均匀子集(Step 3) (N, 3) float32

其中 S = n_surface(默认 262144),N = n_points(默认 65536)。

Patch KNN 索引的预计算由各实验项目自行处理(不同项目的 patch 策略不同)。

训练时数据加载流程

DenoiseDatasetPointRWKV7/datasets/DenoiseDataset.py)在 __getitem__ 中加载 _fps{n}.npy,然后在线处理:

加载 FPS 点云 (n_points, 3)
  │
  ├─ 归一化到单位包围球(减中心,除以最大距离)
  │
  ├─ 数据增强(训练时)
  │   ├─ 50% 概率:均匀缩放 (0.8 ~ 1.2)
  │   └─ 50% 概率:随机 3 轴旋转 (ZYX Euler, ±π)
  │
  ├─ 添加拉普拉斯噪声
  │   └─ std ~ Uniform(0.005, 0.020)
  │
  ├─ 随机选 1 个种子,取其 K=1000 近邻 → patch (1000, 3)
  │
  ├─ DSM 插值
  │   └─ pat_mix = t × clean + (1-t) × noisy, t ~ U(1e-8, 1.0)
  │
  └─ 去中心化(减去种子点坐标)
      │
      └─ 返回: (pat_mix, pat_noisy, pat_clean)  各 (1000, 3)

模型输入: pat_mix (B, 1000, 3) — DSM 插值后的 patch

监督目标: pat_clean - pat_noisy (B, 1000, 3) — 从噪声到干净的位移场

点云去噪流程(推理)

输入:含噪点云 (N, 3)
  │
  ├─ 归一化到单位包围球
  │
  ├─ 提取 patch(种子 + KNN)
  │
  ├─ 模型预测位移场
  │
  ├─ 叠加到位移场到含噪点云
  │
  └─ 反归一化 → 输出去噪点云
关于
4.0 MB
邀请码
    Gitlink(确实开源)
  • 加入我们
  • 官网邮箱:gitlink@ccf.org.cn
  • QQ群
  • QQ群
  • 公众号
  • 公众号

版权所有:中国计算机学会技术支持:开源发展技术委员会
京ICP备13000930号-9 京公网安备 11010802047560号