「LingBot-Depth 开源论文项目」
/~ce793Ziorz~:/
链接:https://pan.quark.cn/s/54eb9e384f22

本文结合 LingBot-Depth 技术报告与一次本地部署实测,说明它如何修复 RGB-D 传感器在透明、反光和弱纹理表面上的深度缺失,并分析修复深度如何进入物体测距、点云重建和灵巧手抓取链路。论文结论与本机测试数据在文中分别标注,避免混淆。

图 1:LingBot-Depth 项目总览。图片来自项目技术报告配套素材 [1]。

1. 为什么透明和反光物体对深度相机很困难

结构光、双目和 ToF 深度相机都可能在以下区域失效:

  • 透明玻璃和透明塑料会让光线透射或折射,传感器可能测到背景而不是物体表面;

  • 不锈钢等高反光材料会产生镜面反射,使主动光或立体匹配无法稳定返回;

  • 低纹理表面、强光和遮挡会造成空洞、离群值与破碎轮廓。

对机器人而言,这不是简单的“画面不好看”。抓取策略需要物体表面在相机坐标系中的真实三维位置。深度空洞可能导致物体点云缺失,背景深度泄漏则可能把手指引向错误位置。

LingBot-Depth 的核心思想是把传感器自然产生的缺失区域视为 natural masks,通过 Masked Depth Modeling(MDM)学习 RGB 外观和剩余有效深度之间的对应关系。模型输入完整 RGB 与不完整深度,输出像素对齐、具有米制尺度的稠密深度 [1]。

图 2:论文中的注意力可视化。深度缺失位置可以从 RGB 上下文及周围有效深度中获得几何线索。图片来自项目技术报告配套素材 [1]。

需要注意的是,模型输出的是几何上合理的深度估计,不是透明表面的直接物理测量。高度透明、折射复杂或训练分布之外的物体仍可能产生误差。

2. 模型向下游提供什么

当前模型的直接输出包括:

  1. depth:形状为 [H, W]float32 米制深度;

  2. points:结合相机内参得到的 [H, W, 3] 相机坐标系点云(可选);

  3. 中间视觉特征:代码提供特征推理接口,但是否用于下游取决于具体任务。

从像素深度到三维点的反投影关系为:

Z = depth
X = (u - cx) × Z / fx
Y = (v - cy) × Z / fy

如果下游只需要目标距离,不必生成点云:在目标检测框或实例分割掩码中,对有效深度取中位数即可。如果目标是生成灵巧手抓取姿态,则通常仍需要目标物体的局部点云。

3. 论文中的灵巧手抓取链路

论文第 5.3 节使用 Rokae XMate-SR5 机械臂、X Hand-1 灵巧手与 Orbbec Gemini 335 RGB-D 相机。其抓取链路并不是由 LingBot-Depth 直接输出手指动作,而是:

RGB + 原始深度
    ↓
LingBot-Depth 修复米制深度
    ↓
相机内参反投影为点云
    ├── Point Transformer 提取点云几何特征
RGB ── DINOv2 ViT-L/14 提取外观特征
    ↓
DP3 风格的 Diffusion Policy
    ↓
N × 22 灵巧手姿态
    ↓
机械臂与灵巧手执行

策略在 HOI4D 人手—物体交互数据上训练,并通过三维关键点对应将人手动作重定向到灵巧手配置。LingBot-Depth 的贡献在于改善策略看到的三维几何,而不是替代抓取策略本身。

图 3:钢杯、玻璃杯、透明收纳盒和玩具车的预测抓取姿态与真实执行。图片来自项目技术报告配套素材 [1]。

论文每种物体进行 20 次测试,结果如下:

目标物体 使用 LingBot-Depth 使用原始深度
不锈钢杯 17/20(85%) 13/20(65%)
透明杯 16/20(80%) 12/20(60%)
玩具车 16/20(80%) 9/20(45%)
透明收纳盒 10/20(50%) N/A,原始深度不可抓取

透明收纳盒是最典型的例子:原始传感器深度严重损坏,无法形成可用几何;补全后虽然仍有偶发误差,但已经能够支持一半试验成功抓取 [1]。

当前公开仓库主要提供深度补全模型和示例,没有包含论文完整的 Point Transformer、Diffusion Policy、机械臂标定与控制系统。因此,“运行本仓库”与“复现完整灵巧抓取”是两个不同范围。

4. 本机部署与测试数据

4.1 测试环境

项目 配置
操作系统 Ubuntu 24.04.3 LTS
GPU NVIDIA GeForce RTX 3090 24 GiB,使用物理 GPU 1
Python 3.11.15
PyTorch 2.6.0 + CUDA 12.6
xFormers 0.0.29.post2
模型 lingbot-depth-pretrain-vitl-14-v0.5

4.2 examples/10

实测数据由 RealSense D435I 采集,元数据记录为:

  • 640×480,采集帧率 30 FPS;

  • 深度已经对齐到彩色图;

  • 深度单位为毫米,比例为约 0.001 m/unit

  • 采用彩色相机内参;

  • 原始深度有效像素为 279,603 / 307,200;

  • 约 9.0% 像素没有原始深度;

  • 在有效原始深度中,约 71.9% 落在 0.5–1.0 m。

这里的 30 FPS 是相机采集帧率,不是 LingBot-Depth 推理帧率

图 4:examples/10。所有深度图使用相同的 0.3–1.5 m 色标;白色区域表示原始深度缺失。右图为本机 5 档推理结果。

从图中可以看到,模型把原始深度中的空洞补成连续表面,并保持了桌面、前景物体和背景之间的层次。不过,这组数据没有高精度真值,因此只能做定性比较,不能把“视觉连续”直接等同于绝对精度正确。

5. 0–9 档:速度与细节的取舍

resolution_level 控制内部 token 数量,不控制传感器量程。档位越高,token 越多,通常保留更多空间细节,但延迟也越高。

测试方法:

  • 输入固定为 examples/10,640×480;

  • 模型常驻 GPU 1;

  • 每档预热 3 次,正式计时 30 次;

  • 使用 torch.cuda.synchronize() 获取真实 GPU 完成时间;

  • 只返回 GPU 深度张量,不生成点云、不回传 CPU、不写文件;

  • 一次性的模型加载时间不计入持续推理延迟。

档位 Token 平均延迟 P50 P95 持续 FPS
0 1,200 70.06 ms 70.06 ms 70.36 ms 14.27
1 1,466 85.47 ms 85.54 ms 85.73 ms 11.70
2 1,733 98.94 ms 98.99 ms 99.22 ms 10.11
3 2,000 114.17 ms 114.15 ms 114.49 ms 8.76
4 2,266 119.93 ms 119.83 ms 120.74 ms 8.34
5 2,533 133.65 ms 133.62 ms 134.06 ms 7.48
6 2,800 157.07 ms 157.13 ms 157.54 ms 6.37
7 3,066 172.79 ms 172.79 ms 173.29 ms 5.79
8 3,333 190.78 ms 190.76 ms 191.34 ms 5.24
9 3,600 201.36 ms 201.36 ms 201.81 ms 4.97

下载原始测速 CSV

图 5:本机 RTX 3090 实测。柱状图为持续 FPS,红线为平均延迟。

图 6:0–9 档深度结果。所有子图使用同一色标。较低档位并非简单降低输出分辨率,而是减少模型内部 token。

图 7:0、5、9 档点云的统一裁剪、视角和显示密度。用于观察局部几何变化,不代表精度真值。

工程上可以从以下配置开始:

  • 普通 0.5–1.0 m 物体测距:3 档,约 8.76 FPS;

  • 速度与近距离几何细节平衡:5 档,约 7.48 FPS;

  • 透明、反光、小型或细长物体:5–7 档,并通过实际抓取闭环选择;

  • 0 档可达到约 14.27 FPS,但不应在缺少真值或抓取验证时仅凭速度选用;

  • 9 档提供最高 token 数,但本机只有约 4.97 FPS。

6. 面向实时下游的最简链路

对只需要深度或局部点云的下游,最快的数据流不是反复运行示例脚本,而是让模型常驻同一个 Python/GPU 进程:

RealSense RGB8 + uint16 深度
    ↓
复用 pinned-memory 与 GPU 输入缓冲区
    ↓
常驻 LingBot-Depth(depth-only)
    ↓
GPU float32 米制深度 [H, W]
    ├── 目标掩码内取中位数 → 物体距离
    └── 目标掩码 + 缓存内参 → 局部点云 → 抓取策略

可以省略:

  • 每帧重新加载模型;

  • PNG、NPY 与 PLY 文件;

  • 深度彩色可视化和对比图;

  • 只测距离时的相机内参与点云;

  • 下游也在 GPU 时的 GPU→CPU 数据复制;

  • 完整场景点云——抓取任务通常只需要目标局部点云。

必须保留:

  • 与深度对齐的 RGB;

  • 原始深度及正确的毫米→米转换;

  • LingBot-Depth 推理;

  • 抓取任务中的目标掩码、相机内参及相机到机器人基座的标定;

  • 对透明/反光物体的安全校验与失败处理。

本机对 5 档做了进一步分段计时:

环节 耗时
NumPy 摄像机帧上传 GPU 约 0.94 ms
仅深度模型推理 约 133.50 ms
内存中反投影完整点云 小于 1 ms,处于测量噪声范围
深度 GPU→CPU 约 0.26 ms
GPU 上计算中位深度 约 0.55 ms
保存两个 NPY 约 0.64 ms
着色并保存四张 PNG 约 16.03 ms
构建并保存 PLY 约 15.71 ms

取消所有文件输出大约可再省 32 ms,但模型推理仍占绝大部分时间。因此继续提速的重点应转向降低档位、模型编译/推理引擎或多 GPU 调度,而不是继续压缩已经不足 1 ms 的输入准备。

相机以 30 FPS 采集而模型只能处理约 5–14 FPS 时,应使用长度为 1 的“最新帧队列”:采集线程覆盖旧帧,推理线程每次只取最新帧,避免延迟随积压持续增长。

7. 复现实测

以下命令适用于本文使用的服务器目录。

7.1 激活环境

cd /home/bbtgpu/code/github-project/lingbot-depth/lingbot-depth-main
source /home/bbtgpu/miniconda3/etc/profile.d/conda.sh
conda activate lingbot-depth

7.2 最简持续测速

CUDA_VISIBLE_DEVICES=1 python benchmark_pipeline.py \
  --example 10 \
  --resolution-level 5 \
  --warmup 5 \
  --iterations 50

该命令不写任何输出文件。物理 GPU 1 被 CUDA_VISIBLE_DEVICES=1 隔离后,在程序内部显示为 cuda:0,这是正常映射。

7.3 单帧仅深度、不落盘

CUDA_VISIBLE_DEVICES=1 python example.py \
  --device cuda \
  --model /home/bbtgpu/code/github-project/lingbot-depth/models/lingbot-depth-v0.5/model.pt \
  --example 10 \
  --resolution-level 5 \
  --depth-only \
  --no-save

单帧命令仍会为每次进程启动重新加载模型。实时系统应使用常驻接口,而不是循环启动该命令。

8. 结论与边界

LingBot-Depth 的价值在于把 RGB-D 传感器不完整、破碎的深度转换为更稠密、米制且像素对齐的几何估计。论文证明,这种改进可以直接提升透明杯、钢杯和透明收纳盒等困难物体的灵巧抓取成功率。本机测试进一步说明:

  1. RealSense 数据可以直接接入,前提是 RGB/深度对齐、单位和内参正确;

  2. 0–9 档提供明确的速度—细节权衡,本机范围约为 4.97–14.27 FPS;

  3. 对 0.5–1.0 m 物体,3 档适合测距,5 档是较稳妥的工程起点;

  4. 文件输出和可视化可以全部移出实时链路,但模型仍是主要瓶颈;

  5. 深度补全并不等于真实透明表面测量,最终档位必须通过带真值的深度评估或实际抓取闭环确定。

参考资料

  1. LingBot-Depth 技术报告(本地 PDF)

  2. LingBot-Depth 项目仓库

  3. LingBot-Depth v0.5 模型

  4. Yunze Liu et al. HOI4D: A 4D Egocentric Dataset for Category-Level Human-Object Interaction. CVPR 2022.

  5. Yanjie Ze et al. 3D Diffusion Policy: Generalizable Visuomotor Policy Learning via Simple 3D Representations. RSS 2024.

  6. 项目 Apache-2.0 许可证副本


本文论文插图来自 LingBot-Depth 项目配套素材,实测图表由本文所述本地运行数据生成。测试日期:2026-07-22。

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐