从图片到视频:SAM3保姆级分割教程,附完整代码
1. 引言
在计算机视觉领域,图像与视频的语义分割一直是核心任务之一。随着基础模型的发展,Meta推出的SAM3(Segment Anything Model 3)成为当前最先进的可提示分割模型之一。它不仅支持图像中的对象检测与分割,还扩展至视频场景下的目标跟踪与动态分割,真正实现了“万物皆可分”。
SAM3 的最大优势在于其统一的可提示机制——用户可以通过文本描述、点坐标、边界框或掩码等方式,灵活指定需要分割的目标。这种交互式设计极大降低了使用门槛,使得开发者和研究人员能够快速构建高精度的视觉理解系统。
本文将围绕 CSDN 星图平台提供的SAM 3 图像和视频识别分割镜像,手把手带你完成从环境部署到图像/视频分割的全流程实践。我们将涵盖:
- 镜像部署与服务启动
- 图像中文本提示分割
- 视频中基于点提示的目标添加与精细控制
- 跨帧目标跟踪与ID管理
- 完整代码实现与结果可视化
无论你是初学者还是有一定经验的开发者,都能通过本教程快速掌握 SAM3 的核心用法。
2. 模型简介与部署准备
2.1 SAM3 核心能力概述
SAM3 是 Meta 推出的第三代通用分割模型,具备以下关键特性:
- 多模态提示输入:支持文本、点、框、掩码等多种提示方式。
- 跨域适应性强:无需微调即可泛化到新类别和新场景。
- 视频时序一致性:引入时间维度建模,实现稳定的目标跨帧跟踪。
- 高效推理架构:优化后的 Transformer 架构保证实时性与准确性平衡。
该模型已在 Hugging Face 开源,地址为:https://huggingface.co/facebook/sam3
2.2 部署与初始化流程
使用 CSDN 星图平台提供的预置镜像可以免去复杂的依赖安装过程。具体步骤如下:
- 在 CSDN星图镜像广场 搜索 “SAM 3 图像和视频识别分割” 镜像并部署。
- 等待约 3 分钟,确保模型加载完成。
- 点击右侧 Web UI 图标进入交互界面。
⚠️ 注意:若页面显示“服务正在启动中...”,请耐心等待 2~5 分钟后再刷新访问。
部署成功后,你将看到一个简洁的 Web 界面,支持上传图片或视频,并通过英文关键词(如"book"、"rabbit")进行目标分割。
3. 图像分割实战:基于文本提示
3.1 基础设置与库导入
我们首先在本地环境中复现 SAM3 的调用逻辑。假设你已获取模型权重文件sam3.pt和 BPE 编码文件bpe_simple_vocab_16e6.txt.gz。
import cv2 import torch import numpy as np import supervision as sv from pathlib import Path from PIL import Image from typing import Optional from IPython.display import Video from sam3.model_builder import build_sam3_video_predictor import os import glob import matplotlib.pyplot as plt from sam3.visualization_utils import ( load_frame, prepare_masks_for_visualization, visualize_formatted_frame_output, )3.2 辅助函数定义
为了提升代码可读性和复用性,定义两个常用工具函数:
# 设置绘图字体大小 plt.rcParams["axes.titlesize"] = 12 plt.rcParams["figure.titlesize"] = 12 # 将绝对坐标转换为相对坐标(归一化) def abs_to_rel_coords(coords, IMG_WIDTH, IMG_HEIGHT, coord_type="point"): if coord_type == "point": return [[x / IMG_WIDTH, y / IMG_HEIGHT] for x, y in coords] elif coord_type == "box": return [ [x / IMG_WIDTH, y / IMG_HEIGHT, w / IMG_WIDTH, h / IMG_HEIGHT] for x, y, w, h in coords ] else: raise ValueError(f"未知坐标类型: {coord_type}")3.3 加载模型与初始化会话
# 使用 GPU 加速推理 DEVICES = [torch.cuda.current_device()] # 模型路径配置 checkpoint_path = "models/sam3.pt" bpe_path = "assets/bpe_simple_vocab_16e6.txt.gz" # 构建预测器 predictor = build_sam3_video_predictor( checkpoint_path=checkpoint_path, bpe_path=str(bpe_path), gpus_to_use=DEVICES ) # 启动处理会话 SOURCE_IMAGE = "assets/images/sample.jpg" response = predictor.handle_request( request=dict( type="start_session", resource_path=SOURCE_IMAGE, ) ) session_id = response["session_id"] print(f"会话ID: {session_id}")3.4 文本提示分割执行
只需提供目标类别的英文名称,即可完成自动定位与分割:
prompt_text_str = "cat" # 示例:猫 frame_idx = 0 response = predictor.handle_request( request=dict( type="add_prompt", session_id=session_id, frame_index=frame_idx, text=prompt_text_str, ) ) out = response["outputs"] # 可视化结果 image = Image.open(SOURCE_IMAGE).convert("RGB") detections = sv.Detections.from_sam(out) mask_annotator = sv.MaskAnnotator() annotated_image = mask_annotator.annotate(image.copy(), detections) plt.figure(figsize=(8, 6)) plt.imshow(annotated_image) plt.title("文本提示分割结果 - 'cat'") plt.axis("off") plt.show()4. 视频分割进阶:点提示与目标跟踪
4.1 视频预处理:帧提取
视频需先拆分为独立帧以便逐帧处理。使用ffmpeg进行高效转换:
SOURCE_VIDEO="assets/videos/bedroom.mp4" OUTPUT_DIR="output_frames" mkdir -p $OUTPUT_DIR ffmpeg -i $SOURCE_VIDEO -q:v 2 -start_number 0 $OUTPUT_DIR/%05d.jpg4.2 帧序列加载
video_frames_for_vis = sorted(glob.glob(os.path.join(OUTPUT_DIR, "*.jpg"))) try: video_frames_for_vis.sort(key=lambda p: int(Path(p).stem)) except: video_frames_for_vis.sort() # 备用排序4.3 初始化视频会话
response = predictor.handle_request( request=dict( type="start_session", resource_path=SOURCE_VIDEO, ) ) session_id = response["session_id"]4.4 方法一:文本提示启动目标跟踪
prompt_text_str = "person" frame_idx = 0 predictor.handle_request( request=dict( type="add_prompt", session_id=session_id, frame_index=frame_idx, text=prompt_text_str, ) ) # 全局传播以实现跨帧跟踪 def propagate_in_video(predictor, session_id): outputs_per_frame = {} for response in predictor.handle_stream_request( request=dict(type="propagate_in_video", session_id=session_id) ): outputs_per_frame[response["frame_index"]] = response["outputs"] return outputs_per_frame outputs_per_frame = propagate_in_video(predictor, session_id) outputs_vis = prepare_masks_for_visualization(outputs_per_frame) # 每隔60帧可视化一次 for idx in range(0, len(outputs_vis), 60): visualize_formatted_frame_output( idx, video_frames_for_vis, [outputs_vis], ["SAM3 跟踪结果"], figsize=(6, 4) )4.5 移除指定目标(按 ID)
若某目标干扰主任务,可通过remove_object接口移除:
obj_id = 1 # 如小女孩 predictor.handle_request( request=dict( type="remove_object", session_id=session_id, obj_id=obj_id, ) ) # 重新传播验证效果 outputs_per_frame = propagate_in_video(predictor, session_id) outputs_vis = prepare_masks_for_visualization(outputs_per_frame)4.6 添加点提示目标
精确控制分割区域,适用于复杂背景或多实例场景:
IMG_WIDTH, IMG_HEIGHT = Image.open(video_frames_for_vis[0]).size points_abs = np.array([[406, 170]]) # 正样本点 labels = np.array([1]) # 1:正样本,0:负样本 points_tensor = torch.tensor( abs_to_rel_coords(points_abs, IMG_WIDTH, IMG_HEIGHT, "point"), dtype=torch.float32 ) labels_tensor = torch.tensor(labels, dtype=torch.int32) predictor.handle_request( request=dict( type="add_prompt", session_id=session_id, frame_index=0, points=points_tensor, point_labels=labels_tensor, obj_id=1, ) )4.7 正负样本结合实现精细分割
通过正负样本点协同,可排除误检区域,仅保留感兴趣部分(如只分割衣服而非整个人):
points_abs = np.array([ [421, 155], # 衣服上点(正) [420, 202], # 腿部点(负) [400, 107], # 头部点(负) ]) labels = np.array([1, 0, 0]) points_tensor = torch.tensor( abs_to_rel_coords(points_abs, IMG_WIDTH, IMG_HEIGHT, "point"), dtype=torch.float32 ) labels_tensor = torch.tensor(labels, dtype=torch.int32) predictor.handle_request( request=dict( type="add_prompt", session_id=session_id, frame_index=0, points=points_tensor, point_labels=labels_tensor, obj_id=1, ) ) # 再次传播查看精细化结果 outputs_per_frame = propagate_in_video(predictor, session_id) outputs_vis = prepare_masks_for_visualization(outputs_per_frame)5. 总结
SAM3 凭借其强大的统一建模能力和灵活的提示机制,正在重塑图像与视频分割的技术范式。本文通过完整的工程实践,展示了如何利用 CSDN 星图平台的预置镜像和本地 SDK 实现以下功能:
- 快速部署 SAM3 模型并启动 Web 服务
- 使用文本提示实现图像中任意类别的自动分割
- 对视频数据进行帧级处理与跨帧目标跟踪
- 通过点提示精准添加或修正分割目标
- 利用正负样本机制实现细粒度区域控制
- 动态管理目标 ID,支持增删改操作
这些能力为实际应用提供了坚实基础,例如:
- 视频编辑中的智能抠像
- 监控场景下的特定人员追踪
- 医疗影像中病灶区域标注
- 自动驾驶中的动态障碍物识别
未来,随着更多轻量化版本和定制化训练方案的推出,SAM3 将进一步降低 AI 分割技术的应用门槛。
获取更多AI镜像
想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。