w
weasonlee/profusion_pr
模型介绍
文件和版本
Pull Requests
讨论
分析

PROFusion Pose Regression (siyan824/profusion_pr) 昇腾 NPU 适配

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 变换)

适配环境

组件版本
NPUAscend 910 ×2(64GB HBM)
CANN8.5.1
torch2.9.0
torch_npu2.9.0.post1
transformers / Python4.57.6 / 3.11

适配要点

  1. MyNvtxRange:上游 pose_regression/utils/device.py 中 MyNvtxRange 硬编码 torch.cuda.synchronize() 与 torch.cuda.nvtx,在 CPU-only torch + NPU 环境下会直接崩溃;适配为 no-op 上下文管理器(inference.py: patch_cuda_only_bits)。
  2. RoPE2D:cuRoPE2D 为 CUDA 编译扩展,NPU 上不可用;源码自带纯 PyTorch fallback(数值等价),无需改动。
  3. Attention:编码器/解码器均走 F.scaled_dot_product_attention,由 torch_npu SDPA 算子承接,无 xformers 依赖。
  4. SVD 位姿头:PoseHead.svd_orthogonalize 中的 torch.svd / torch.det 在 Ascend 910 上正常执行(已验证)。
  5. 权重加载: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 相对位姿

CPU vs NPU 精度与性能对比

测试条件:PIL/NumPy 合成的几何一致 RGB-D 序列(224×224,正弦深度场 + 随轨迹运动重投影生成后续帧,GT 相对位姿已知),3 个连续帧对,fp32,逐对回归。

输出cos_simmax_abs_errmean_abs_err
poses(全部 3 对,4×4 展平)0.9996190.0627890.004418
pose pair 00.9988550.0627890.012895
pose pair 11.0000000.0008390.000176
pose pair 21.0000000.0007190.000182
指标CPU (fp32)NPU (fp32)说明
单帧对稳态耗时0.920 s0.145 s稳态加速 6.3×
3 对总耗时(含首次)2.775 s4.654 sNPU 首对含算子编译预热(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}
}