PROFusion(ICRA 2026)是面向机器人实时相机跟踪与稠密重建的系统:在剧烈视角变化、快速运动或抖动等不稳定相机运动下仍保持鲁棒。其核心是"学习初始化 + 优化精化"——先用相机位姿回归网络从连续 RGB-D 帧预测度量尺度的相对位姿,作为随机优化算法对齐深度图与场景几何的可靠初值。
本仓库将 siyan824/profusion_pr 的位姿回归模块权重适配到 华为昇腾 Ascend 910 NPU,并提供与 CPU 的精度/性能对比验证。
| 项目 | 内容 |
|---|---|
| 上游模型 | siyan824/profusion_pr(CC BY-NC-SA 4.0,代码) |
| 论文 | PROFusion: Robust and Accurate Dense Reconstruction via Camera Pose Regression and Optimization(arXiv 2509.24236) |
| 任务 | RGB-D 相对相机位姿回归(robotics / RGB-D SLAM) |
| 架构 | DUSt3R 风格 Multiview3D 骨干:ViT 编码器(24 层,d=1024,patch 16)+ 双流多视图解码器(各 12 层,d=768,RoPE100,max-pooling 跨视图交互)+ 点图 Conv 嵌入 + Reloc3r 式 PoseHead(9D 旋转 + SVD 正交化 → 4×4 位姿) |
| 参数量 | 540.6M |
| 输入 | 视图列表:ref 视图 img (B,3,224,224)(归一化 [-1,1])+ pts3d_ref (B,H,W,3);src 视图 img + pts3d_cam |
| 输出 | 每 src 视图一个度量尺度相对位姿 pose (B,4,4)(cam-to-ref 变换) |
| 组件 | 版本 |
|---|---|
| NPU | Ascend 910 ×2(64GB HBM) |
| CANN | 8.5.1 |
| torch | 2.9.0 |
| torch_npu | 2.9.0.post1 |
| transformers / Python | 4.57.6 / 3.11 |
pose_regression/utils/device.py 中 MyNvtxRange 硬编码 torch.cuda.synchronize() 与 torch.cuda.nvtx,在 CPU-only torch + NPU 环境下会直接崩溃;适配为 no-op 上下文管理器(inference.py: patch_cuda_only_bits)。cuRoPE2D 为 CUDA 编译扩展,NPU 上不可用;源码自带纯 PyTorch fallback(数值等价),无需改动。F.scaled_dot_product_attention,由 torch_npu SDPA 算子承接,无 xformers 依赖。PoseHead.svd_orthogonalize 中的 torch.svd / torch.det 在 Ascend 910 上正常执行(已验证)。PROFusionPoseRegression.from_pretrained(models/)(hub mixin),默认构造参数与权重 897 键完全匹配,load_state_dict 走 slam3r 直载分支。# 1. 准备目录与权重(权重 ~2.1GB,已放入 models/,不随仓库分发)
mkdir -p /data/profusion_pr && cd /data/profusion_pr
HF_ENDPOINT=https://hf-mirror.com HF_HUB_DOWNLOAD_TIMEOUT=120 python -c \
"from huggingface_hub import snapshot_download; snapshot_download('siyan824/profusion_pr', local_dir='/data/profusion_pr/models')"
# 2. 克隆上游源码(提供 pose_regression 包)
git clone https://github.com/siyandong/PROFusion.git profusion_repo
# 3. 安装依赖
pip install -r requirements.txt
# 4. 运行推理(合成 RGB-D 帧对,逐对回归相对位姿)
python inference.py --device npu # NPU 推理 + 自动精度对比
python inference.py --device cpu # CPU 推理 + 自动精度对比import sys, torch
sys.path.insert(0, "profusion_repo")
from inference import patch_cuda_only_bits
from pose_regression.model import PROFusionPoseRegression
patch_cuda_only_bits() # 绕开 torch.cuda 硬编码
device = "npu" if torch.npu.is_available() else "cpu"
model = PROFusionPoseRegression.from_pretrained("models").to(device).eval()
ref = dict(img=torch.rand(1, 3, 224, 224, device=device) * 2 - 1, # [-1,1]
true_shape=torch.tensor([[224., 224.]], device=device),
pts3d_ref=torch.rand(1, 224, 224, 3, device=device) * 2) # 度量点图
src = dict(img=torch.rand(1, 3, 224, 224, device=device) * 2 - 1,
true_shape=torch.tensor([[224., 224.]], device=device),
pts3d_cam=torch.rand(1, 224, 224, 3, device=device) * 2)
with torch.no_grad():
out = model([ref, src], ref_ids=[0])
pose = out[1]["pose"] # (1, 4, 4) src→ref 相对位姿测试条件:PIL/NumPy 合成的几何一致 RGB-D 序列(224×224,正弦深度场 + 随轨迹运动重投影生成后续帧,GT 相对位姿已知),3 个连续帧对,fp32,逐对回归。
| 输出 | cos_sim | max_abs_err | mean_abs_err |
|---|---|---|---|
| poses(全部 3 对,4×4 展平) | 0.999619 | 0.062789 | 0.004418 |
| pose pair 0 | 0.998855 | 0.062789 | 0.012895 |
| pose pair 1 | 1.000000 | 0.000839 | 0.000176 |
| pose pair 2 | 1.000000 | 0.000719 | 0.000182 |
| 指标 | CPU (fp32) | NPU (fp32) | 说明 |
|---|---|---|---|
| 单帧对稳态耗时 | 0.920 s | 0.145 s | 稳态加速 6.3× |
| 3 对总耗时(含首次) | 2.775 s | 4.654 s | NPU 首对含算子编译预热(4.23s),第 2/3 对降至 0.275s/0.145s |
所有输出 cos_sim ≥ 0.9998,mean_abs_err 处于 fp32 舍入与 SVD/算子实现差异的正常范围,NPU 与 CPU 精度对齐;稳态推理 NPU 加速约 6.3×。
├── inference.py # NPU/CPU 推理 + 精度对比(--device npu|cpu)
├── make_assets.py # 生成 assets/ 信息图
├── requirements.txt # Python 依赖
├── readme.md # 本文件
├── assets/
│ ├── agent_workflow.png # 适配工作流
│ ├── npu_device_call.png # NPU 设备与推理证据
│ └── model_result.png # 模型结果信息图
├── outputs/ # 推理输出(npz/json,gitignore)
├── models/ # 权重目录(gitignore)
└── profusion_repo/ # 上游源码(gitignore)@article{dong2025profusion,
title={PROFusion: Robust and Accurate Dense Reconstruction via Camera Pose Regression and Optimization},
author={Dong, Siyan and Wang, Zijun and Cai, Lulu and Ma, Yi and Yang, Yanchao},
journal={arXiv preprint arXiv:2509.24236},
year={2025}
}