fix: 修复 TmixMix6Fused.grad 在半精度下追加 param_grads 时遗漏了 jt.code 的 [0] 索引导致返回嵌套 tuple 的问题
基于 Jittor 框架的点云去噪竞赛方案。
预处理脚本 preprocess.py 将原始 OBJ 网格文件转换为模型训练所需的点云数据。整个流程分为 3 步,每步产出独立的缓存文件,支持断点续跑(已存在的文件自动跳过)。
preprocess.py
python preprocess.py --config preprocess.yaml --num_workers 16
参数说明:
--config
preprocess.yaml
--num_workers
--n_points
dataset.n_points
--n_surface
dataset.n_surface
preprocess.yaml:
dataset: DATA_PATH: "dataset_train" # 训练数据根目录 n_surface: 262144 # Step 2 表面采样点数(稠密,供 FPS 从中选取) n_points: 65536 # Step 3 FPS 输出点数(决定训练点云密度)
n_surface 与 n_points 的关系: n_surface 是表面采样的稠密点数,n_points 是 FPS 从中选出的均匀子集大小。n_surface 应显著大于 n_points(建议 4x-8x),否则 FPS 退化为无意义的重排序。
n_surface
n_points
输入数据目录由配置文件中的 dataset.DATA_PATH 指定,期望如下结构:
dataset.DATA_PATH
dataset_train/ shapenet/ <synset_id>/ # ShapeNet 类别 ID,如 02691156(飞机) <model_id>/ models/ model_normalized.obj
解析 OBJ 文件中的顶点坐标,保存为 .obj.npy 加速后续加载。
.obj.npy
model_normalized.obj → model_normalized.obj.npy (V, 3) float32
仅提取 v 开头的行(顶点),忽略面、法线、纹理坐标等信息。
v
在三角网格表面进行面积加权均匀采样,生成稠密点云。
model_normalized.obj → model_normalized_surface{n_surface}.npy (n_surface, 3) float32,默认 262144
算法细节:
f
area = 0.5 × ||cross(v2-v1, v3-v1)||
np.random.choice
为什么需要这一步: 直接使用 OBJ 顶点会导致点云稀疏(低多边形模型可能只有几十个顶点),且顶点分布受建模拓扑影响不均匀。表面采样生成稠密点云作为 FPS 的输入池。
从稠密表面采样点中选出 n_points 个空间分布最均匀的点。
model_normalized_surface{n_surface}.npy → model_normalized_fps{n_points}.npy (n_points, 3) float32,默认 65536
算法细节(贪心 FPS):
加速: 安装 Numba 后自动启用 JIT 编译加速(约 3-5x 提速),未安装则使用纯 NumPy 实现。
为什么需要这一步: 表面采样的点虽然稠密但分布受三角形面积影响,FPS 从稠密点集中选出空间分布最均匀的子集,保证点云均匀覆盖整个物体表面。
每个 OBJ 文件处理后产出以下缓存文件:
model.obj.npy
model_surface{S}.npy
model_fps{N}.npy
其中 S = n_surface(默认 262144),N = n_points(默认 65536)。
Patch KNN 索引的预计算由各实验项目自行处理(不同项目的 patch 策略不同)。
DenoiseDataset(PointRWKV7/datasets/DenoiseDataset.py)在 __getitem__ 中加载 _fps{n}.npy,然后在线处理:
DenoiseDataset
PointRWKV7/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_mix
监督目标: pat_clean - pat_noisy (B, 1000, 3) — 从噪声到干净的位移场
pat_clean - pat_noisy
输入:含噪点云 (N, 3) │ ├─ 归一化到单位包围球 │ ├─ 提取 patch(种子 + KNN) │ ├─ 模型预测位移场 │ ├─ 叠加到位移场到含噪点云 │ └─ 反归一化 → 输出去噪点云
版权所有:中国计算机学会技术支持:开源发展技术委员会 京ICP备13000930号-9 京公网安备 11010802047560号
jittorPCD
基于 Jittor 框架的点云去噪竞赛方案。
数据预处理
概述
预处理脚本
preprocess.py将原始 OBJ 网格文件转换为模型训练所需的点云数据。整个流程分为 3 步,每步产出独立的缓存文件,支持断点续跑(已存在的文件自动跳过)。运行方式
参数说明:
--configpreprocess.yaml--num_workers--n_pointsdataset.n_points(65536)--n_surfacedataset.n_surface(262144)配置文件
preprocess.yaml:n_surface与n_points的关系:n_surface是表面采样的稠密点数,n_points是 FPS 从中选出的均匀子集大小。n_surface应显著大于n_points(建议 4x-8x),否则 FPS 退化为无意义的重排序。依赖
数据目录结构
输入数据目录由配置文件中的
dataset.DATA_PATH指定,期望如下结构:处理流程
Step 1: OBJ → 顶点缓存
解析 OBJ 文件中的顶点坐标,保存为
.obj.npy加速后续加载。仅提取
v开头的行(顶点),忽略面、法线、纹理坐标等信息。Step 2: 表面均匀采样
在三角网格表面进行面积加权均匀采样,生成稠密点云。
算法细节:
f行,仅处理三角形,四边形及以上面片跳过)area = 0.5 × ||cross(v2-v1, v3-v1)||np.random.choice,概率正比于面积)为什么需要这一步: 直接使用 OBJ 顶点会导致点云稀疏(低多边形模型可能只有几十个顶点),且顶点分布受建模拓扑影响不均匀。表面采样生成稠密点云作为 FPS 的输入池。
Step 3: 最远点采样(FPS)
从稠密表面采样点中选出
n_points个空间分布最均匀的点。算法细节(贪心 FPS):
n_points个点加速: 安装 Numba 后自动启用 JIT 编译加速(约 3-5x 提速),未安装则使用纯 NumPy 实现。
为什么需要这一步: 表面采样的点虽然稠密但分布受三角形面积影响,FPS 从稠密点集中选出空间分布最均匀的子集,保证点云均匀覆盖整个物体表面。
产出文件汇总
每个 OBJ 文件处理后产出以下缓存文件:
model.obj.npymodel_surface{S}.npymodel_fps{N}.npy其中 S =
n_surface(默认 262144),N =n_points(默认 65536)。Patch KNN 索引的预计算由各实验项目自行处理(不同项目的 patch 策略不同)。
训练时数据加载流程
DenoiseDataset(PointRWKV7/datasets/DenoiseDataset.py)在__getitem__中加载_fps{n}.npy,然后在线处理:模型输入:
pat_mix(B, 1000, 3) — DSM 插值后的 patch监督目标:
pat_clean - pat_noisy(B, 1000, 3) — 从噪声到干净的位移场点云去噪流程(推理)