news 2026/1/20 6:19:34

从图片到视频:SAM3保姆级分割教程,附完整代码

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
从图片到视频:SAM3保姆级分割教程,附完整代码

从图片到视频: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 星图平台提供的预置镜像可以免去复杂的依赖安装过程。具体步骤如下:

  1. 在 CSDN星图镜像广场 搜索 “SAM 3 图像和视频识别分割” 镜像并部署。
  2. 等待约 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.jpg

4.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星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/1/19 15:43:46

HDRNet深度学习图像增强:5步实现专业级照片处理

HDRNet深度学习图像增强:5步实现专业级照片处理 【免费下载链接】hdrnet An implementation of Deep Bilateral Learning for Real-Time Image Enhancement, SIGGRAPH 2017 项目地址: https://gitcode.com/gh_mirrors/hd/hdrnet 还在为照片色彩平淡、细节模糊…

作者头像 李华
网站建设 2026/1/18 16:42:26

从0开始学多模态AI:Qwen3-VL-2B-Instruct入门指南

从0开始学多模态AI:Qwen3-VL-2B-Instruct入门指南 随着人工智能进入多模态时代,模型不再局限于“读文字”,而是能够“看图说话”、理解视觉内容并进行图文联合推理。通义千问系列推出的 Qwen3-VL-2B-Instruct 正是这一趋势下的代表性成果——…

作者头像 李华
网站建设 2026/1/19 11:36:26

YimMenu游戏辅助工具:安全高效的GTA V增强方案

YimMenu游戏辅助工具:安全高效的GTA V增强方案 【免费下载链接】YimMenu YimMenu, a GTA V menu protecting against a wide ranges of the public crashes and improving the overall experience. 项目地址: https://gitcode.com/GitHub_Trending/yi/YimMenu …

作者头像 李华
网站建设 2026/1/18 10:23:23

BlackDex揭秘:Android应用零门槛脱壳技术深度解析

BlackDex揭秘:Android应用零门槛脱壳技术深度解析 【免费下载链接】BlackDex BlackDex: 一个Android脱壳工具,支持5.0至12版本,无需依赖任何环境,可以快速对APK文件进行脱壳处理。 项目地址: https://gitcode.com/gh_mirrors/bl…

作者头像 李华
网站建设 2026/1/19 11:13:31

Qwen3-VL-2B实战案例:智能客服图文识别系统完整指南

Qwen3-VL-2B实战案例:智能客服图文识别系统完整指南 1. 引言 随着人工智能技术的不断演进,多模态模型正在成为智能服务系统的核心驱动力。传统的文本型AI助手在面对图像信息时往往束手无策,而现实业务场景中,用户频繁通过图片提…

作者头像 李华
网站建设 2026/1/18 2:26:43

NotaGen实战案例:生成勃拉姆斯风格艺术歌曲

NotaGen实战案例:生成勃拉姆斯风格艺术歌曲 1. 引言 在古典音乐创作领域,如何借助人工智能技术复现特定作曲家的创作风格一直是研究热点。NotaGen作为一款基于大语言模型(LLM)范式构建的符号化音乐生成系统,通过WebU…

作者头像 李华