Merge gitlink master (keep local README)
赛道:赛道二:基于深度学习的三维点云降噪任务团队名:铲屎官
本仓库为「计图(Jittor)点云降噪赛题」的参赛代码。任务是给定从三维物体表面采样并加入噪声的点云,预测每个点的位移向量,将含噪点「推回」真实物体表面附近,输出与输入点数严格一致的降噪点云。最终成绩由 Chamfer Distance (CD) 与 Point-to-Surface (P2S) 两个指标各占 50% 综合得到。
完成「环境安装」与「数据准备」后,两条命令即可完成训练与生成提交文件:
# 训练(三阶段,共 300 epoch,权重保存在 experiments/cvm/) python run.py --task configs/task/train_cvm.yaml # 推理(加载 experiments/cvm/best_model.pkl,结果写入 my_submission/) python run.py --task configs/task/predict_cvm.yaml
各步骤的环境、数据、打包提交与评测细节见下文。
本方案在赛题提供的 Jittor Baseline 基础上,复现并改进了 CVPR 2024 论文 StraightPCF: Straight Point Cloud Filtering。核心思路是将降噪建模为沿「直线路径」把含噪点搬运回干净表面的最优传输过程,并采用三阶段训练:
vm0
δ = X₁ − X₀
vm1
L_B
L_C
d
推理时点云被切分为重叠的 1000 点 patch,由耦合速度模块在 DistanceModule 标量缩放下做 Euler 迭代降噪,再拼接还原。
代码主要结构:
src/model/vm.py
src/model/feature.py
src/system/vm.py
CVMSystem
src/data/augment.py
configs/
run.py
--task
Python 版本:3.9
# 安装计图 conda create -n jittor python=3.9 -y conda activate jittor conda install -c conda-forge gcc=10 gxx=10 -y # 确保 gcc、g++ 版本不高于 10 conda install -c conda-forge libgomp -y # 确保 OpenMP runtime 存在 # 安装依赖 python -m pip install -r requirements.txt # 本地评测 P2S 需额外安装 point-cloud-utils(评测可选) pip install point-cloud-utils
依赖列表见 requirements.txt:jittor、numpy、trimesh、scipy、omegaconf。
requirements.txt
jittor
numpy
trimesh
scipy
omegaconf
数据集不随仓库提交,请自行从赛题页面下载并解压到本目录下。
训练集(干净网格):
tar xzf dataset_train.tar.gz
解压后目录结构:
dataset_train/shapenet/<synset_id>/<model_id>/models/model_normalized.obj
测试集(含噪点云):
unzip dataset_test_noisy.zip
dataset_test_noisy/shapenet/<synset_id>/<model_id>/noisy.npy
数据根目录通过配置文件中的 input_dataset_dir 字段指定(训练为 dataset_train,推理为 dataset_test_noisy,见 configs/data/train.yaml 与 configs/data/predict.yaml)。使用的样本列表位于 datalist/(train.txt / validate.txt / test.txt)。
input_dataset_dir
dataset_train
dataset_test_noisy
configs/data/train.yaml
configs/data/predict.yaml
datalist/
train.txt
validate.txt
test.txt
完整三阶段训练(共 300 epoch,Phase 1 / 2 / 3 各 100 epoch):
python run.py --task configs/task/train_cvm.yaml
experiments/cvm/
configs/system/cvm.yaml
ckpt_save_dir
experiments/cvm/best_model.pkl
configs/model/cvm.yaml
configs/task/train_cvm.yaml
frame_knn=16
feat_embedding_dim=256
decoder_hidden_dim=64
num_train_points=128
K=2
N=3
λ₁=10.0
λ₂=200.0
1e-4
确认 configs/task/predict_cvm.yaml 中的 load_ckpt 指向你的最佳权重(默认 experiments/cvm/best_model.pkl)。
configs/task/predict_cvm.yaml
load_ckpt
运行推理:
python run.py --task configs/task/predict_cvm.yaml
降噪结果保存在 my_submission/(由配置中的 save_dir 指定),目录结构与测试集一致:
my_submission/
save_dir
my_submission/shapenet/<synset_id>/<model_id>/denoised.npy # float32, shape (N, 3)
推理强度当前由代码中的常量 num_repeats=2 控制(硬编码于 src/model/vm.py);输出点数与输入严格一致(缺失点回退保留其原坐标,见 patch_based_denoise)。
num_repeats=2
patch_based_denoise
打包为提交文件:
cd my_submission zip -r ../result.zip shapenet/ cd ..
赛题的干净点云与原始网格由组委会持有,本地完整评测需要 GT 数据。若已有 GT,可使用组委会提供的 evaluate.py:
evaluate.py
python evaluate.py \ --pred_dir ./my_submission \ --gt_dir ./test_gt \ --noisy_dir ./dataset_test_noisy \ --mesh_dir ./dataset_train \ --workers 8
省略 --mesh_dir 时仅计算 CD 得分(不计算 P2S)。
--mesh_dir
指标定义:以含噪输入为 0 分基线,单样本得分为 score = clamp(100 × (1 − dist_pred / dist_noisy), 0, 100),分别对 CD 与 P2S 计算,最终成绩为全体测试样本上 0.5 × CD_score + 0.5 × P2S_score 的全局平均。
score = clamp(100 × (1 − dist_pred / dist_noisy), 0, 100)
0.5 × CD_score + 0.5 × P2S_score
本方案最佳提交结果:
对应的平均距离:mean_CD_pred ≈ 0.98e-4(noisy ≈ 2.46e-4),mean_P2S_pred ≈ 0.61e-4(noisy ≈ 1.96e-4)。
mean_CD_pred ≈ 0.98e-4
mean_P2S_pred ≈ 0.61e-4
复现说明:由于官方分数是对逐样本「截断归一化改进量」取平均,直接用上述全局平均距离取比值并不能精确还原 CD/P2S 得分,二者仅作诊断参考。受 GPU 算子非确定性、硬件/驱动差异以及随机种子影响,复现结果可能与最终成绩存在合理差异。run.py 在启动时统一设置随机种子(--seed,默认 123,同时作用于 Jittor、NumPy、Python random),可通过 python run.py --task ... --seed <n> 指定。
--seed
random
python run.py --task ... --seed <n>
本方案在赛题官方 Jittor Baseline 基础上开发,并参考、复现了 StraightPCF(CVPR 2024)的方法。第三方来源与许可说明见 NOTICE;本仓库许可见 LICENSE。
NOTICE
LICENSE
Edirimuni, D. d. S., Lu, X., Li, G., Wei, L., Robles-Kelly, A., & Li, H. (2024). StraightPCF: Straight Point Cloud Filtering. CVPR 2024, pp. 20721–20730.
赛道二三维点云降噪项目,基于 StraightPCF 复现并改进三阶段耦合速度场方法:单速度预训练、双速度耦合训练、距离缩放模块精调。采用 patch 级迭代推理与稳健重建,保证输入输出点数一致。最佳提交成绩:72.63(CD 60.31 / P2S 84.96)。
版权所有:中国计算机学会技术支持:开源发展技术委员会 京ICP备13000930号-9 京公网安备 11010802047560号
赛道二点云降噪 —— 基于 StraightPCF 的三阶段耦合速度场降噪
赛道:赛道二:基于深度学习的三维点云降噪任务
团队名:铲屎官
本仓库为「计图(Jittor)点云降噪赛题」的参赛代码。任务是给定从三维物体表面采样并加入噪声的点云,预测每个点的位移向量,将含噪点「推回」真实物体表面附近,输出与输入点数严格一致的降噪点云。最终成绩由 Chamfer Distance (CD) 与 Point-to-Surface (P2S) 两个指标各占 50% 综合得到。
快速开始(Quick Start)
完成「环境安装」与「数据准备」后,两条命令即可完成训练与生成提交文件:
各步骤的环境、数据、打包提交与评测细节见下文。
方法概述
本方案在赛题提供的 Jittor Baseline 基础上,复现并改进了 CVPR 2024 论文 StraightPCF: Straight Point Cloud Filtering。核心思路是将降噪建模为沿「直线路径」把含噪点搬运回干净表面的最优传输过程,并采用三阶段训练:
vm0,回归常速度位移δ = X₁ − X₀(干净 − 含噪)。vm0初始化vm1,两个速度模块耦合联合训练(损失L_B),使滤波轨迹更直。L_C),预测一个距离标量d来缩放步长,避免过冲。推理时点云被切分为重叠的 1000 点 patch,由耦合速度模块在 DistanceModule 标量缩放下做 Euler 迭代降噪,再拼接还原。
代码主要结构:
src/model/vm.py:速度模块、耦合推理、基于 patch 的降噪。src/model/feature.py:DGCNN 特征提取器与解码器。src/system/vm.py:三阶段训练控制器(CVMSystem)。src/data/augment.py:patch 采样、加噪与插值时间元数据。configs/:训练 / 推理的配置文件。run.py:统一入口(设置随机种子并按--task分发)。环境安装
Python 版本:3.9
依赖列表见
requirements.txt:jittor、numpy、trimesh、scipy、omegaconf。数据准备
数据集不随仓库提交,请自行从赛题页面下载并解压到本目录下。
训练集(干净网格):
解压后目录结构:
测试集(含噪点云):
解压后目录结构:
数据根目录通过配置文件中的
input_dataset_dir字段指定(训练为dataset_train,推理为dataset_test_noisy,见configs/data/train.yaml与configs/data/predict.yaml)。使用的样本列表位于datalist/(train.txt/validate.txt/test.txt)。训练
完整三阶段训练(共 300 epoch,Phase 1 / 2 / 3 各 100 epoch):
experiments/cvm/下(由configs/system/cvm.yaml中的ckpt_save_dir指定)。experiments/cvm/best_model.pkl。configs/model/cvm.yaml与configs/task/train_cvm.yaml):frame_knn=16、feat_embedding_dim=256、decoder_hidden_dim=64、num_train_points=128、K=2、N=3、λ₁=10.0、λ₂=200.0,Adam,固定学习率1e-4(不使用学习率调度器)。推理(生成提交文件)
确认
configs/task/predict_cvm.yaml中的load_ckpt指向你的最佳权重(默认experiments/cvm/best_model.pkl)。运行推理:
降噪结果保存在
my_submission/(由配置中的save_dir指定),目录结构与测试集一致:推理强度当前由代码中的常量
num_repeats=2控制(硬编码于src/model/vm.py);输出点数与输入严格一致(缺失点回退保留其原坐标,见patch_based_denoise)。打包为提交文件:
本地评测
赛题的干净点云与原始网格由组委会持有,本地完整评测需要 GT 数据。若已有 GT,可使用组委会提供的
evaluate.py:省略
--mesh_dir时仅计算 CD 得分(不计算 P2S)。结果说明
指标定义:以含噪输入为 0 分基线,单样本得分为
score = clamp(100 × (1 − dist_pred / dist_noisy), 0, 100),分别对 CD 与 P2S 计算,最终成绩为全体测试样本上0.5 × CD_score + 0.5 × P2S_score的全局平均。本方案最佳提交结果:
对应的平均距离:
mean_CD_pred ≈ 0.98e-4(noisy ≈ 2.46e-4),mean_P2S_pred ≈ 0.61e-4(noisy ≈ 1.96e-4)。复现说明:由于官方分数是对逐样本「截断归一化改进量」取平均,直接用上述全局平均距离取比值并不能精确还原 CD/P2S 得分,二者仅作诊断参考。受 GPU 算子非确定性、硬件/驱动差异以及随机种子影响,复现结果可能与最终成绩存在合理差异。
run.py在启动时统一设置随机种子(--seed,默认 123,同时作用于 Jittor、NumPy、Pythonrandom),可通过python run.py --task ... --seed <n>指定。第三方引用与许可
本方案在赛题官方 Jittor Baseline 基础上开发,并参考、复现了 StraightPCF(CVPR 2024)的方法。第三方来源与许可说明见
NOTICE;本仓库许可见LICENSE。