01-sam和深度估计
01-SAM 分割与单目深度估计:从二维感知到三维理解
在具身智能(Embodied AI)场景中,机器人仅“看清”物体(分割)是不够的,还需要知道物体“在哪里”(深度)。本章节将结合 Meta 的 Segment Anything Model (SAM) 和 单目深度估计 (Monocular Depth Estimation),实现对场景的 3D 语义感知。
一、 为什么需要结合 SAM 与深度估计?
单纯的分割或单纯的深度图在机器人交互中都有局限性,两者的结合是实现 3D Object Awareness(三维物体感知) 的关键。
1.1 视觉与功能对比
| | | |
| | | |
| | | |
| | | |
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