LingBot-Depth 实测:从 RGB-D 深度补全到透明、反光物体的灵巧抓取
「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. 模型向下游提供什么
当前模型的直接输出包括:
-
depth:形状为[H, W]的float32米制深度; -
points:结合相机内参得到的[H, W, 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 |

图 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 传感器不完整、破碎的深度转换为更稠密、米制且像素对齐的几何估计。论文证明,这种改进可以直接提升透明杯、钢杯和透明收纳盒等困难物体的灵巧抓取成功率。本机测试进一步说明:
-
RealSense 数据可以直接接入,前提是 RGB/深度对齐、单位和内参正确;
-
0–9 档提供明确的速度—细节权衡,本机范围约为 4.97–14.27 FPS;
-
对 0.5–1.0 m 物体,3 档适合测距,5 档是较稳妥的工程起点;
-
文件输出和可视化可以全部移出实时链路,但模型仍是主要瓶颈;
-
深度补全并不等于真实透明表面测量,最终档位必须通过带真值的深度评估或实际抓取闭环确定。
参考资料
-
Yunze Liu et al. HOI4D: A 4D Egocentric Dataset for Category-Level Human-Object Interaction. CVPR 2022.
-
Yanjie Ze et al. 3D Diffusion Policy: Generalizable Visuomotor Policy Learning via Simple 3D Representations. RSS 2024.
本文论文插图来自 LingBot-Depth 项目配套素材,实测图表由本文所述本地运行数据生成。测试日期:2026-07-22。
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐


所有评论(0)