Merge pull request ‘添加 Rectified Flow model’ (#1) from dev into master
基于 Jittor 深度学习框架的 Rectified Flow 点云降噪模型。
# 创建并激活 conda 环境 conda create -n jittor python=3.9 -y conda activate jittor # 安装 gcc/g++(版本不高于 10,Jittor 编译需要) conda install -c conda-forge gcc=10 gxx=10 -y # 安装 OpenMP runtime conda install -c conda-forge libgomp -y # 安装计图 python -m pip install jittor # 安装其他依赖 python -m pip install -r requirements.txt
注意:Jittor 是元算子框架,首次运行时会对算子进行即时编译(JIT compile),请确保 gcc/g++ 版本不高于 10,且有稳定的网络连接。
训练和评测使用 ShapeNet 数据集的标准三角网格(.obj 格式)。
.obj
其中 local_val_A_noisy 和 local_val_A_gt 需自行生成
Data/ ├── dataset_train/ # 训练网格 │ └── shapenet/ │ └── 02691156/ # 类别 │ └── <model_id>/ │ └── model_normalized.obj │ ├── local_val_A_noisy/ # 验证/测试含噪点云 │ └── shapenet/ │ └── <category>/ │ └── <model_id>/ │ └── noisy.npy │ └─── local_val_A_gt/ # 验证/测试干净点云 └── shapenet/ └── <category>/ └── <model_id>/ └── clean.npy
datalist/ 目录下提供三个文本文件,每行一个模型相对路径:
datalist/
文件中每行格式示例:shapenet/03642806/2134ad3fc25a6284193a4c984002ed32
shapenet/03642806/2134ad3fc25a6284193a4c984002ed32
所有路径通过命令行参数传入,无需配置文件:
--mesh_root
--cache_root
.npy
--in_root
--out_root
--gt_dir
--noisy_dir
--mesh_dir
python train_rf.py \ --list_file datalist/new_train.txt \ --mesh_root ./Data/dataset_train \ --cache_root cache/mesh_pts_50k \ --save_dir experiments/rf_v1 \ --save_every 1 \ --batch_size 16 \ --epochs 30 \ --lr 2e-4 \ --patch_size 1024 \ --num_workers 6
或直接运行脚本:
bash scripts/train.sh
--batch_size
--epochs
--lr
--patch_size
--sigma_min
--sigma_max
--feat_dims
--knn_k
--warmup_iters
--grad_clip
--save_every
--resume
Checkpoint 以 Jittor .pkl 格式保存
.pkl
python infer_rf.py \ --ckpt experiments/rf_v1/checkpoint_29.pkl \ --in_root ./Data/local_val_A_noisy \ --out_root ./results_submission \ --outer_iters 2 \ --n_steps 4 \ --patch_size 1024 \ --seed_k 6
bash scripts/infer.sh
--ckpt
--n_steps
--outer_iters
--seed_k
--schedule
uniform
front_dense
back_dense
cosine
power
--batch_patches
python evaluate.py \ --pred_dir ./results_submission \ --gt_dir ./Data/local_val_A_gt \ --noisy_dir ./Data/local_val_A_noisy \ --mesh_dir ./Data/dataset_train \ --workers 8
bash scripts/eval.sh \ --ckpt experiments/rf_v1/checkpoint_29.pkl \ --in_root ./Data/local_val_A_noisy \ --gt_dir ./Data/local_val_A_gt \ --noisy_dir ./Data/local_val_A_noisy \ --mesh_dir ./Data/dataset_train \ --gpu 0
eval.sh 会自动从 checkpoint 文件名中提取编号,生成 results_jt_rf_<编号> 格式的输出目录。
eval.sh
results_jt_rf_<编号>
CD(A,B)=1∣A∣∑a∈Ab∈B∥a−b∥2+1∣B∣∑b∈Ba∈A∥b−a∥2\text{CD}(A, B) = \frac{1}{|A|}\sum_{a \in A} \min_{b \in B} \|a - b\|^2 + \frac{1}{|B|}\sum_{b \in B} \min_{a \in A} \|b - a\|^2CD(A,B)=∣A∣1a∈A∑b∈Bmin∥a−b∥2+∣B∣1b∈B∑a∈Amin∥b−a∥2
cKDTree
P2S(P,M)=1∣P∣∑p∈Pq∈surface(M)∥p−q∥2\text{P2S}(P, M) = \frac{1}{|P|}\sum_{p \in P} \min_{q \in \text{surface}(M)} \|p - q\|^2P2S(P,M)=∣P∣1p∈P∑q∈surface(M)min∥p−q∥2
point-cloud-utils
对每个测试样本 iii:
cd_scorei=clamp(100×(1−CDpredCDnoisy), 0, 100)\text{cd\_score}_i = \text{clamp}\left(100 \times \left(1 - \frac{\text{CD}_\text{pred}}{\text{CD}_\text{noisy}}\right),\ 0,\ 100\right)cd_scorei=clamp(100×(1−CDnoisyCDpred), 0, 100)
p2s_scorei=clamp(100×(1−P2SpredP2Snoisy), 0, 100)\text{p2s\_score}_i = \text{clamp}\left(100 \times \left(1 - \frac{\text{P2S}_\text{pred}}{\text{P2S}_\text{noisy}}\right),\ 0,\ 100\right)p2s_scorei=clamp(100×(1−P2SnoisyP2Spred), 0, 100)
最终得分(所有样本全局平均,不分类别):
Final=0.5×cd_score‾+0.5×p2s_score‾\text{Final} = 0.5 \times \overline{\text{cd\_score}} + 0.5 \times \overline{\text{p2s\_score}}Final=0.5×cd_score+0.5×p2s_score
在本地采用从验证集生成的测试数据进行测试 结果如下:
================================================================= 点云降噪评测结果 ================================================================= 评测样本总数: 100 有效预测数: 100 缺失预测数: 0 并行进程数: 8 评测耗时: 6.6s ----------------------------------------------------------------- 平均 CD_pred: 0.00012856 平均 CD_noisy: 0.00035816 CD 得分: 60.54 / 100.00 平均 P2S_pred: 0.00044500 平均 P2S_noisy: 0.00066228 P2S 得分: 81.68 / 100.00 ----------------------------------------------------------------- 最终得分 (0.5×CD + 0.5×P2S): 71.11 / 100.00 =================================================================
推理输出的降噪点云可能残留少量平面离群点——即局部邻域呈强平面结构、但该点自身偏离平面较远的点。postprocess_planar_outliers.py 对此类点进行检测并投影修复。
postprocess_planar_outliers.py
normal_var ≤ plane_ratio
--cluster_mode
--anchor_blend
python postprocess_planar_outliers.py \ --input_dir ./results_submission \ --output_dir ./results_submission_planar_fix \ --filename denoised.npy \ --workers 8
常用可选参数:
--k
--plane_ratio
λ_min / Σλ
--dist_mult
--blend
--repair_rounds
jittor_mlghenshuai_PCD/ ├── train_rf.py # 训练入口 ├── infer_rf.py # 推理入口(生成降噪结果) ├── evaluate.py # 评测入口(CD + P2S 评分) ├── postprocess_planar_outliers.py # 后处理(平面离群点修复) ├── model/ │ ├── rf_model.py # VelocityNet 网络结构(DGCNN + FiLM) │ └── rf_flow.py # Rectified Flow loss / 采样 / 时间调度 ├── datalist/ │ ├── new_train.txt # 训练集路径列表 │ ├── new_validate.txt # 验证集路径列表 │ └── test.txt # 测试集路径列表 ├── scripts/ │ ├── train.sh # 训练启动脚本 │ ├── infer.sh # 推理启动脚本 │ └── eval.sh # 推理+评测一键脚本 ├── experiments/ # 训练输出(checkpoint + 日志) ├── cache/ # 网格采样点缓存 └── README.md
版权所有:中国计算机学会技术支持:开源发展技术委员会 京ICP备13000930号-9 京公网安备 11010802047560号
jittor_mlghenshuai_PCD
基于 Jittor 深度学习框架的 Rectified Flow 点云降噪模型。
1. 环境安装
Python 版本
安装步骤
2. 数据准备
数据来源
训练和评测使用 ShapeNet 数据集的标准三角网格(
.obj格式)。目录结构
其中 local_val_A_noisy 和 local_val_A_gt 需自行生成
数据列表文件
datalist/目录下提供三个文本文件,每行一个模型相对路径:文件中每行格式示例:
shapenet/03642806/2134ad3fc25a6284193a4c984002ed32数据根目录配置
所有路径通过命令行参数传入,无需配置文件:
--mesh_root.obj文件--cache_root.npy文件,加速后续 epoch)--in_root--out_root--gt_dir/--noisy_dir/--mesh_dir3. 训练
一键训练命令
或直接运行脚本:
关键参数说明
--batch_size--epochs--lr--patch_size--sigma_min/--sigma_max--feat_dims--knn_k--warmup_iters--grad_clip--save_every--resumeCheckpoint 格式
Checkpoint 以 Jittor
.pkl格式保存4. 评测 / 推理
推理(生成降噪结果)
或直接运行脚本:
推理参数说明
--ckpt--in_root.npy文件目录--out_root--n_steps--outer_iters--patch_size--seed_k--scheduleuniform/front_dense/back_dense/cosine/power--batch_patches评测(计算 CD 和 P2S 分数)
一键推理+评测
eval.sh会自动从 checkpoint 文件名中提取编号,生成results_jt_rf_<编号>格式的输出目录。5. 结果说明
指标定义
Chamfer Distance (CD)
CD(A,B)=∣A∣1a∈A∑b∈Bmin∥a−b∥2+∣B∣1b∈B∑a∈Amin∥b−a∥2
cKDTree进行 O(NlogM) 加速Point-to-Surface (P2S)
P2S(P,M)=∣P∣1p∈P∑q∈surface(M)min∥p−q∥2
point-cloud-utils(基于 BVH 加速的精确表面投影)point-cloud-utils未安装,自动回退到cKDTree顶点近似(精度略低)评分映射
对每个测试样本 i:
cd_scorei=clamp(100×(1−CDnoisyCDpred), 0, 100)
p2s_scorei=clamp(100×(1−P2SnoisyP2Spred), 0, 100)
最终得分(所有样本全局平均,不分类别):
Final=0.5×cd_score+0.5×p2s_score
本地测试得分
在本地采用从验证集生成的测试数据进行测试 结果如下:
与线上提交 / 最终成绩的差异
point-cloud-utils未安装,P2S 计算使用顶点近似而非精确表面投影,P2S 分数可能略高于真实值(顶点近似低估了表面距离),建议线上提交前安装point-cloud-utils确保一致性6. 后处理(平面离群点修复)
推理输出的降噪点云可能残留少量平面离群点——即局部邻域呈强平面结构、但该点自身偏离平面较远的点。
postprocess_planar_outliers.py对此类点进行检测并投影修复。原理
normal_var ≤ plane_ratio)且该点的 signed distance 超过阈值,则标记为离群点--cluster_mode)+ 锚点混合(--anchor_blend,向原始含噪点云回退)使用方式
常用可选参数:
--k--plane_ratioλ_min / Σλ阈值--dist_mult--blend--repair_rounds--cluster_mode--anchor_blend--gt_dir/--noisy_dir项目结构