\documentclass[a4paper]{article}

% Basic packages
\usepackage[fontset=fandol]{ctex}
\usepackage{amsmath, amssymb}
\usepackage{graphicx}
\usepackage[margin=2.5cm]{geometry}
\usepackage[most]{tcolorbox}
\usepackage{etoolbox}
\usepackage{listings}
\usepackage{hyperref}
\usepackage{booktabs}
\usepackage{subcaption}
\usepackage{float}

% Highlight boxes
\newtcolorbox{knowledgebox}[1]{
    enhanced, colback=blue!5!white, colframe=blue!75!black, colbacktitle=blue!75!black,
    coltitle=white, fonttitle=\bfseries, title=#1, attach boxed title to top left={yshift=-2mm, xshift=2mm},
    boxrule=1pt, sharp corners
}

\newtcolorbox{importantbox}[1]{
    enhanced, colback=yellow!10!white, colframe=yellow!80!black, colbacktitle=yellow!80!black,
    coltitle=black, fonttitle=\bfseries, title=#1, sharp corners
}

\newtcolorbox{warningbox}[1]{
    enhanced, colback=red!5!white, colframe=red!75!black, colbacktitle=red!75!black,
    coltitle=white, fonttitle=\bfseries, title=#1, sharp corners
}

% Listings
\lstset{
    language=Python,
    basicstyle=\ttfamily\small,
    keywordstyle=\color{blue},
    stringstyle=\color{red!60!black},
    commentstyle=\color{green!60!black},
    breaklines=true,
    frame=single,
    numbers=left,
    numberstyle=\tiny\color{gray},
    captionpos=b,
    extendedchars=false
}

% Front-page metadata
\newcommand{\notetitle}{SAM3 与 VLM：Visual Prompting 与 Grounding}
\newcommand{\noteauthors}{基于公开课程资料整理}
\newcommand{\notedate}{2025}
\newcommand{\videochannel}{五道口纳什}
\newcommand{\videopublishdate}{2025}
\newcommand{\videoduration}{约 17 分钟}
\newcommand{\videourl}{}
\newcommand{\videocoverpath}{cover.jpg}
\newcommand{\repourl}{https://github.com/hqhq1025/ai-course-notes}


% Footer with repo info
\usepackage{fancyhdr}
\pagestyle{fancy}
\fancyhf{}
\fancyfoot[C]{\thepage}
\fancyfoot[R]{\footnotesize\color{gray}\href{\repourl}{AI Course Notes}}
\renewcommand{\headrulewidth}{0pt}
\renewcommand{\footrulewidth}{0pt}

\begin{document}

\begin{titlepage}
\centering
{\Large 课程笔记\par}
\vspace{1.2cm}
{\huge\bfseries \notetitle\par}
\vspace{0.8cm}
{\large \noteauthors\par}
\vspace{0.3cm}
{\large \notedate\par}
\vspace{1.2cm}

\ifdefempty{\videocoverpath}{
{\small 请在生成笔记时填入视频封面图的本地路径。\par}
}{
\includegraphics[width=0.82\textwidth,height=0.45\textheight,keepaspectratio]{\videocoverpath}\par
}

\vfill
\begin{tcolorbox}[width=0.9\textwidth, colback=black!2!white, colframe=black!60, sharp corners]
\textbf{视频作者/频道}：\videochannel\par
\textbf{发布日期}：\videopublishdate\par
\textbf{视频时长}：\videoduration\par
\ifdefempty{\videourl}{}{
\textbf{视频链接}：\href{\videourl}{\nolinkurl{\videourl}}\par
}
\par
\textbf{项目主页}：\href{\repourl}{\nolinkurl{\repourl}}\par
\end{tcolorbox}
\end{titlepage}

\tableofcontents
\newpage

%% --- 正文内容开始 --- %%

\section{引言：多模态的新世界}

本期是 Modern Agents 系列中第一次正式介绍 VLM（Vision-Language Model，视觉语言模型）。课程围绕三大主题展开：

\begin{enumerate}
    \item \textbf{SAM3}：Meta 发布的 Segment Anything Model 3，用于经典 CV 任务——检测、分割、识别；
    \item \textbf{SAM3 Agent}：将 VLM 与 SAM3 结合，实现视觉问答（VQA）与 Visual Grounding；
    \item \textbf{Gemini 2.5 Flash 原生多模态}：端到端的对话式检测分割识别。
\end{enumerate}

\begin{knowledgebox}{从数字世界到物理世界}
多模态视觉能力让语言模型"插上眼睛"，打开了通往物理世界的大门。Embodied AI、Robotics 等更广阔的应用场景，都依赖于模型对图像中物体的检测、分割与识别能力。
\end{knowledgebox}

\section{Visual Prompting：视觉提示的新范式}

\subsection{什么是 Visual Prompting}

Visual Prompting 的核心理念是：\textbf{与其用文字告诉 AI 找什么，不如直接在图片里标注}。具体的视觉线索（Visual Cues）包括：

\begin{itemize}
    \item \textbf{点标注}（Point Prompt）：在图片上指定一个点
    \item \textbf{框标注}（Bounding Box Prompt）：画一个矩形框
    \item \textbf{涂鸦标注}（Scribble）：自由涂画区域
    \item \textbf{文本标注}：在图片上写文字说明
\end{itemize}

这些视觉线索引导模型完成特定的视觉任务，如 VQA、图像分割、目标检测等。在图像生成领域，用户也可以通过在图片中框选区域并写上文字，来指导视觉生成模型做更精确的编辑。

\begin{importantbox}{Visual Prompting 的本质}
Visual Prompting 是一种将人类的视觉意图直接编码到图像中的交互方式。它弥补了纯文本 Prompt 在空间定位上的不足——某些视觉任务（如"最左边的那个蓝色物体"）用文字描述既冗长又容易歧义，而直接在图上标注则直观明了。
\end{importantbox}

\subsection{Visual Prompting 与 Visual Grounding}

Visual Grounding 是 Visual Prompting 的逆过程：
\begin{itemize}
    \item \textbf{Visual Prompting}：人在图上标注 $\rightarrow$ 引导模型理解
    \item \textbf{Visual Grounding}：模型理解文本 $\rightarrow$ 在图上定位（框出/分割出目标）
\end{itemize}

两者结合形成了完整的"视觉对话"闭环。

\subsection{本章小结}

Visual Prompting 将传统的文本提示扩展到视觉维度，为 CV 任务提供了更自然、更精确的人机交互方式。它是理解 SAM3 与 VLM 协作的基础概念。


\section{SAM3：Segment Anything Model 3}

\subsection{SAM3 相比 SAM1/SAM2 的进化}

SAM（Segment Anything Model）系列是 Meta 推出的通用分割模型。SAM3 相比前两代的关键进化在于\textbf{支持了文本 Prompt 输入}：

\begin{table}[H]
\centering
\begin{tabular}{lccc}
\toprule
\textbf{能力} & \textbf{SAM1} & \textbf{SAM2} & \textbf{SAM3} \\
\midrule
点/框 Prompt 分割 & \checkmark & \checkmark & \checkmark \\
视频分割 & $\times$ & \checkmark & \checkmark \\
文本 Prompt 分割 & $\times$ & $\times$ & \checkmark \\
识别（输出 Label） & $\times$ & $\times$ & \checkmark \\
\bottomrule
\end{tabular}
\caption{SAM 系列能力对比}
\end{table}

\begin{warningbox}{SAM3 不是 VLM}
SAM3 虽然支持文本输入，但它只接受\textbf{简单的名词短语}（如 "cat"、"person"、"shoe"），而非自然语言句子。它不支持列表输入（如 "cat, remote"），也不支持复杂的修饰语。需要一次识别多类物体时，必须逐个遍历类别名称。
\end{warningbox}

\subsection{SAM3 的使用流程}

SAM3 的基本使用非常简洁：

\begin{enumerate}
    \item 通过 \texttt{build\_model} 加载 SAM3 模型（约 3.3GB，自动下载到 HuggingFace Hub 目录）
    \item 将模型放到 CUDA 设备上
    \item 构建 Processor，传入图像和文本 Prompt
    \item 获取输出：Mask（分割掩码）、Bounding Box、置信度分数
\end{enumerate}

\begin{lstlisting}[caption={SAM3 基本使用示例（伪代码）}]
# 构建模型
model = build_sam3_model()
model.to("cuda")

# 构建 Processor
processor = SAM3Processor(model)

# 读取图片并推理
image = load_image(url)
with torch.inference_mode():
    outputs = processor(image, text_prompt="remote")
    # outputs 包含: masks, bounding_boxes, confidence_scores
\end{lstlisting}

\subsection{SAM3 实例级分割示例}

以 COCO 数据集中的经典图像（两只猫、两个遥控器）为例：

\begin{itemize}
    \item 输入 \texttt{"remote"}：准确识别两个遥控器，各自有独立的 Mask 和编号（Instance 0、Instance 1），置信度约 0.96
    \item 输入 \texttt{"cat"}：准确识别两只猫，置信度同样很高
    \item 多类检测：通过遍历类别列表 \texttt{{[}"remote", "cat"{]}}，融合结果得到全部四个实例
\end{itemize}

对于更复杂的场景（如多个孩子、鞋子、门等），SAM3 也能实现实例级别的分割，但在复杂目标（如半遮挡的门）上置信度会有所下降。

\subsection{本章小结}

SAM3 通过引入文本 Prompt，在保持高质量分割能力的同时实现了识别功能，但其文本理解能力仅限于简单名词短语。对于需要空间推理或语义理解的复杂查询，需要结合 VLM 来弥补。


\section{SAM3 Agent：VLM + SAM3 的协作架构}

\subsection{架构设计：大脑与眼睛/手}

SAM3 官方代码库提供了一个 Agent 示例，其核心思想是将 VLM 与 SAM3 分工协作：

\begin{importantbox}{SAM3 Agent 的分工模式}
\begin{itemize}
    \item \textbf{VLM（大脑）}：负责高层语义推理、理解用户的自然语言意图、规划执行步骤
    \item \textbf{SAM3（眼睛/手）}：负责底层视觉操作、生成精确的 Mask 分割
\end{itemize}
VLM 不直接画 Mask，而是指挥 SAM3 去画 Mask。
\end{importantbox}

\subsection{工具定义与 System Prompt}

SAM3 Agent 定义了四个工具（Tools），其中最核心的是 \texttt{segment\_phrase}：

\begin{itemize}
    \item 输入：一个简单的名词短语（如 "child"、"blue vest"）
    \item 输出：全图中所有匹配物体的 Mask 图像（带编号标签）
\end{itemize}

System Prompt 中明确规定了关键约束：
\begin{itemize}
    \item \textbf{禁止使用方位词}：不能输入 "left child"
    \item \textbf{禁止使用数量词}：不能输入 "three cats"
    \item \textbf{强制通用名词}：只能用 "child"、"person" 等通用短语
\end{itemize}

\subsection{Visual Grounding 的完整交互流程}

以"找出最左侧穿蓝色马甲的孩子"为例：

\textbf{第 1 轮——分割阶段}：
\begin{enumerate}
    \item GPT-4o 接收原始图像和用户 Query
    \item 因为 SAM3 不擅长方位推理（在 Tool 描述中已说明），GPT-4o 规划策略：先分割出所有穿蓝色马甲的孩子
    \item 调用 \texttt{segment\_phrase("child in blue vest")}
    \item SAM3 返回带编号 Mask 的结构图（检测到 3 个匹配实例）
\end{enumerate}

\textbf{第 2 轮——推理阶段}：
\begin{enumerate}
    \item GPT-4o 接收带 Mask 标注的结构图（这就是 Visual Prompting！）
    \item 进行视觉验证和空间推理，确定哪个 Mask ID 对应"最左侧"的孩子
    \item 输出最终答案
\end{enumerate}

\begin{warningbox}{VLM 的空间推理仍有缺陷}
在实际测试中，GPT-4o 将 Mask ID 1 判断为最左侧，但正确答案应是 Mask ID 2——模型把左右搞混了。这说明即使是最先进的 VLM，在空间位置推理上仍然存在不稳定性。
\end{warningbox}

\subsection{实现细节}

SAM3 Agent 的官方实现并未使用 LangChain/LangGraph 等现代 Agent 框架，而是采用了较为朴素的方式：

\begin{itemize}
    \item 支持文本和图像的混合输入
    \item Tool 定义直接写在 System Prompt 中
    \item 官方示例基于 LLaMA 3 Vision 8B；讲者改用 GPT-4o（支持 Tool + 多模态输入）
\end{itemize}

\subsection{本章小结}

SAM3 Agent 展示了一种经典的"VLM + 专业视觉模型"协作范式：VLM 负责推理与规划，SAM3 负责精准的视觉操作。通过 Tool Call 机制，不具备分割能力的 VLM 获得了像素级别的分割能力，实现了 Visual Grounding。


\section{Gemini 2.5 Flash：原生多模态视觉能力}

\subsection{对话式的检测分割识别}

Gemini 2.5 Flash 代表了一种更"端到端"的路线：无需外挂 SAM3 等专业模型，模型本身就具备检测、分割和识别的能力。

\begin{importantbox}{Gemini 2.5 Flash 的原生视觉能力}
截至 2025 年 12 月，支持原生 Mask 分割输出的 VLM 仅有 Gemini 2.5 Flash。其关键特点：
\begin{itemize}
    \item 对话式交互：用自然语言 Query 触发分割
    \item 输出格式：List of Dict，每个 Dict 包含 \texttt{box\_2d}（边界框）、\texttt{mask}（分割掩码图片）、\texttt{label}（描述性标签）
    \item BBox 坐标在 1000×1000 范围内归一化，叠加到原图时需要转换
\end{itemize}
\end{importantbox}

\subsection{使用方式}

调用 Gemini 2.5 Flash 进行分割的关键配置：

\begin{itemize}
    \item 使用 \texttt{gemini-2.5-flash} 模型
    \item 设置 \texttt{temperature=0}（确保确定性输出）
    \item 传入图文 Prompt，使用官方推荐的分割 Prompt 模板
\end{itemize}

\subsection{分割效果评估}

以多个孩子跑步的测试图为例：
\begin{itemize}
    \item 六个孩子中，五个的检测分割非常准确
    \item 第三个孩子的框略有偏差
    \item 整体准确率很高，Mask 质量是 0/1 矩阵的像素级分割
\end{itemize}

\begin{knowledgebox}{Gemini 2.5 Flash Preview 与 Pro 的区别}
\begin{itemize}
    \item \textbf{Gemini 2.5 Flash}：支持完整的 Mask 输出，是目前唯一支持原生对话式分割的 VLM
    \item \textbf{Gemini 2.5 Flash Preview}（新发布）：暂不支持 Mask 输出
    \item \textbf{Gemini 2.5 Flash 3 Pro}：可能只输出描点而非完整 Mask
\end{itemize}
\end{knowledgebox}

\subsection{本章小结}

Gemini 2.5 Flash 展示了 VLM 发展的一个重要方向——将检测、分割、识别能力原生内化到一个统一模型中，实现真正的"对话式视觉理解"。虽然 SAM3 + VLM 的组合方案更灵活，但端到端方案代表了未来的趋势。


\section{三种方案对比}

\begin{table}[H]
\centering
\begin{tabular}{p{3cm}p{3.5cm}p{3.5cm}p{3.5cm}}
\toprule
\textbf{维度} & \textbf{SAM3 单独} & \textbf{SAM3 + VLM} & \textbf{Gemini 原生} \\
\midrule
文本理解 & 简单名词短语 & 任意自然语言 & 任意自然语言 \\
分割精度 & 高 & 高（SAM3 执行） & 高 \\
空间推理 & 不支持 & VLM 负责（有局限） & 模型内置 \\
交互方式 & API 调用 & 多轮 Tool Call & 对话式 \\
部署复杂度 & 需要 GPU（3.3GB） & 需要 GPU + API & 云 API \\
可扩展性 & 需遍历类别 & Agent 自动规划 & 单次请求 \\
\bottomrule
\end{tabular}
\caption{三种视觉分割方案对比}
\end{table}


\section{总结与延伸}

本期课程完成了从传统 CV 工具到现代多模态 Agent 的完整过渡：

\begin{enumerate}
    \item \textbf{SAM3} 通过引入文本 Prompt，将"万物分割"升级为"万物检测分割识别"
    \item \textbf{SAM3 Agent} 展示了如何用 VLM 作为推理大脑、SAM3 作为视觉执行器，通过 Tool Call 实现 Visual Grounding
    \item \textbf{Gemini 2.5 Flash} 代表了端到端原生多模态的方向，将检测分割识别统一在一个对话式模型中
\end{enumerate}

\begin{knowledgebox}{拓展思考}
\begin{itemize}
    \item \textbf{Embodied AI}：视觉分割是机器人操作的基础——识别物体、理解场景、规划抓取
    \item \textbf{Visual Prompting 的未来}：随着模型能力提升，人类提供的视觉线索将从"显式标注"演变为"模型自主生成视觉草图"（如 Gemini 的 Agentic Vision）
    \item \textbf{开放词汇分割}：SAM3 + VLM 的组合实现了 Open-Vocabulary Segmentation，不再受限于预定义的类别列表
\end{itemize}
\end{knowledgebox}

%% --- 正文内容结束 --- %%

\end{document}
