首页 › 具身智能 › 04-具身场景的计算机视觉、3D重建 › 01-sam和深度估计

01-sam和深度估计

01-SAM 分割与单目深度估计:从二维感知到三维理解​

在具身智能(Embodied AI)场景中,机器人仅“看清”物体(分割)是不够的,还需要知道物体“在哪里”(深度)。本章节将结合 Meta 的 Segment Anything Model (SAM) 和 单目深度估计 (Monocular Depth Estimation),实现对场景的 3D 语义感知。​

​

​

一、 为什么需要结合 SAM 与深度估计?​

单纯的分割或单纯的深度图在机器人交互中都有局限性,两者的结合是实现 3D Object Awareness(三维物体感知) 的关键。​

1.1 视觉与功能对比​

​

​
模态​
​
​
视觉效果​
​
​
机器人能获取的信息​
​
​
局限性​
​
​
仅 SAM (分割)​
​
​
清晰的物体轮廓​
​
​
"这里有一个杯子" (2D 区域)​
​
​
无距离感。机器人不知道杯子是在桌边还是在房间另一头,无法规划抓取路径。​
​
​
仅 Depth (深度)​
​
​
模糊的颜色热力图​
​
​
"这一块区域离我比较近"​
​
​
无物体概念。深度图边缘模糊,机器人难以区分"杯子"和"桌子"的边界,容易抓空。​
​
​
SAM + Depth​
​
​
轮廓 + 距离​
​
​
"这个轮廓清晰的杯子,中心距离我 0.8米"​
​
​
互补增强。SAM 提供了精确的边缘(修正深度图的边缘模糊),深度图提供了空间位置。​
​

​

1.2 评测标准 (Metrics)​

在学术界和工程落地中,我们通常关注以下指标:​

分割质量 (Segmentation Quality):​

◦

mIoU (mean Intersection over Union): SAM (ViT-H) 通常能达到 90%+ 的 IoU,意味着它扣出的物体边缘极度贴合真实物体。​

深度准确性 (Depth Accuracy):​

◦

RMSE (均方根误差): 衡量预测深度与真实深度的偏差。​

◦

AbsRel (绝对相对误差): 越低越好。​

◦

注意: 单目深度估计通常输出相对深度 (Relative Depth)(如 0~1 的值),在实际应用中,通常需要通过相机参数或一个已知参考点将其对齐到真实世界尺度(米)。​

​

​

二、 交互式实战:点击分割与测距 (Interactive Demo)​

为了直观体验“指哪打哪”的效果,我们提供一个交互式脚本。​

功能:加载图片 -> 鼠标点击物体 -> 实时生成 Mask -> 融合深度图计算该物体的平均距离。​

2.1 脚本代码 (interactive_sam_depth.py)(请先完成第四点环境配置)​

创建一个新文件 interactive_sam_depth.py 并运行:​

​

代码块​

Python

​

​

​

三、 核心原理讲解​

3.1 Segment Anything Model (SAM)​

SAM 是计算机视觉领域的“瑞士军刀”。​

•

图像编码器 (Image Encoder): 基于 ViT-H (Vision Transformer Huge),负责对图像进行深度特征提取。这是最耗时的部分,但一张图只需要运行一次。​

•

提示编码器 (Prompt Encoder): 将用户的点击(点)、框选(Box)或语言描述转化为向量。​

•

掩码解码器 (Mask Decoder): 极其轻量级。结合图像特征和提示特征,毫秒级生成分割掩码。这就是为什么上面的交互式 Demo 可以做到实时响应。​

3.2 单目深度估计 (Monocular Depth Estimation)​

我们使用的是 DPT (Dense Prediction Transformer)。​

•

原理: 既然是单目(一个摄像头),模型无法像双目相机那样通过视差计算深度。DPT 实际上是学习了“上下文线索”:​

◦

遮挡关系: 物体A挡住物体B,A更近。​

◦

透视关系: 道路远端汇聚成一点。​

◦

相对大小: 同样是车,看着小的离得远。​

⚠️ 重要提示:关于深度图颜色的反直觉现象​

你可能会发现生成的深度图中,越近的物体颜色越亮(数值越大),越远的地方颜色越黑(数值越小)。​

•

这是因为模型输出的是 “逆深度” (Inverse Depth, ​

1/distance

)。​

•

天空/远山: 距离无穷远,​

∞1​≈0

,所以是 黑色 (0)。​

•

近处物体: 距离很小,分母小导致数值大,所以是 高亮黄色。​

•

记忆口诀: “越亮越近,越黑越远”。​

​

​

​

​

四、 环境配置​

要运行上述代码,需要安装 PyTorch, Transformers 以及 SAM 库。​

下载 SAM 模型权重 (ViT-H)​

​

代码块​

Bash

# 文件大小约为 2.4 GB​

wget 'https://dl.fbaipublicfiles.com/segment\_anything/sam\_vit\_h\_4b8939.pth'​

(https://dl.fbaipublicfiles.com/segment\_anything/sam\_vit\_h\_4b8939.pth)​

​

安装 Python 依赖​

​

代码块​

Bash

pip install git+https://github.com/facebookresearch/segment-anything.git​

(https://github.com/facebookresearch/segment-anything.git)​

pip install transformers opencv-python matplotlib torch torchvision​

​

​

​

五、 批处理流程代码 (自动处理脚本)​

如果有一批图片需要自动生成 Mask 和 深度图(而非交互式点击),请使用以下脚本。​

优化说明:已修复文件保存路径,确保“仅深度”、“仅SAM”、“两者结合”的结果分别保存,互不覆盖。​

​

代码块​

Python

import torch​

import numpy as np​

from PIL import Image​

import matplotlib.pyplot as plt​

import os​

import time​

​