\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}
\usepackage{tikz}
\usetikzlibrary{positioning,arrows.meta,shapes.geometric}
\IfFileExists{pgfplots.sty}{
    \usepackage{pgfplots}
    \pgfplotsset{compat=1.18}
}{}

% 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}{CS231N Lecture 10: Video Understanding}
\newcommand{\noteauthors}{基于 Ruohan Gao 授课内容整理}
\newcommand{\notedate}{2025年5月1日}
\newcommand{\videochannel}{Stanford CS231n 10th Anniversary}
\newcommand{\videopublishdate}{2025-05-01}
\newcommand{\videoduration}{}
\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
\ifdefempty{\videoduration}{}{\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{导言：视频理解不是图像理解的简单加一维}

Ruohan Gao 这一讲的目标很清楚：把我们已经熟悉的 2D 视觉问题扩展到真正的视频世界。视频看起来只是“图像序列”，但只要加入时间维，任务性质就会改变。动作、节奏、持续时间、上下文变化、声音和交互，都会进入模型视野。因此，视频理解不是把 CNN 原样复制到时间轴，而是重新思考什么信息值得保留、如何建模、以及怎样控制计算成本。

\begin{importantbox}{本讲主线}
\begin{enumerate}
    \item 视频是什么，以及为什么它比图像更难。
    \item 短 clip、3D CNN、two-stream 是怎样建模时序的。
    \item 长视频为什么需要 RNN、attention 和更高效的结构。
    \item 视频理解如何走向多模态、具身和 foundation model。
\end{enumerate}
\end{importantbox}

\begin{figure}[H]
\centering
\includegraphics[width=0.95\textwidth]{slides-images/slide-000.jpg}
\caption{标题页：Lecture 10 聚焦 Video Understanding，讲者是 Ruohan Gao\protect\footnotemark}
\end{figure}
\footnotetext{Slides 第1页。}

\begin{figure}[H]
\centering
\includegraphics[width=0.95\textwidth]{slides-images/slide-002.jpg}
\caption{课程开场先回顾图像任务，再把问题自然过渡到视频理解\protect\footnotemark}
\end{figure}
\footnotetext{Slides 第3页。}

\begin{figure}[H]
\centering
\includegraphics[width=0.95\textwidth]{slides-images/slide-003.jpg}
\caption{图像任务回顾：分类、检测和分割是视频理解的前置基础\protect\footnotemark}
\end{figure}
\footnotetext{Slides 第4页。}

\subsection{视频到底是什么}

最基本的定义是：视频就是带时间维度的图像序列。对单张图像而言，输入通常是 $3 \times H \times W$；对视频而言，输入可以写成

\[
T \times 3 \times H \times W \qquad \text{或} \qquad 3 \times T \times H \times W.
\]

这里的 $T$ 不是装饰性的维度，而是承载“动作如何展开”的核心变量。视频中的信息可以粗略分为两类：

\begin{itemize}
    \item \textbf{外观}：场景里有什么，人的姿态是什么，物体长什么样。
    \item \textbf{运动}：东西怎么动，动作如何持续，事件如何演化。
\end{itemize}

\begin{knowledgebox}{为什么视频会改变问题本质}
\begin{itemize}
    \item 图像问题回答的是“这是什么”。
    \item 视频问题往往回答的是“这在做什么、何时发生、接下来会怎样”。
    \item 也就是说，视频不只是增加了帧数，而是增加了事件和时间结构。
\end{itemize}
\end{knowledgebox}

\begin{figure}[H]
\centering
\includegraphics[width=0.95\textwidth]{slides-images/slide-006.jpg}
\caption{视频可以看成 2D 图像加上时间维度，也可以理解为一个四维张量\protect\footnotemark}
\end{figure}
\footnotetext{Slides 第7页。}

\begin{figure}[H]
\centering
\includegraphics[width=0.95\textwidth]{slides-images/slide-007.jpg}
\caption{视频分类任务：输入是 $T \times 3 \times H \times W$ 的 clip，输出是动作类别\protect\footnotemark}
\end{figure}
\footnotetext{Slides 第8页。}

\subsection{视频理解的典型任务}

视频任务的语义重心偏向动作、时间和事件边界。常见任务包括：

\begin{enumerate}
    \item \textbf{Video classification}：判断整个 clip 在做什么。
    \item \textbf{Temporal action localization}：找出动作在时间轴上的起止位置。
    \item \textbf{Spatio-temporal detection}：同时找时间和空间中的人、物与动作。
    \item \textbf{Audio-visual understanding}：把声音和画面一起用于理解或分离。
\end{enumerate}

\begin{importantbox}{视频任务为什么更难}
\begin{enumerate}
    \item \textbf{数据更大}：存储、解码和训练都更贵。
    \item \textbf{信息更稀疏}：关键动作可能只出现在少量帧里。
    \item \textbf{依赖更长}：很多标签对应的是时序上下文，而不是某一帧。
    \item \textbf{噪声更多}：镜头切换、运动模糊、遮挡和背景变化都更常见。
\end{enumerate}
\end{importantbox}

\begin{figure}[H]
\centering
\includegraphics[width=0.95\textwidth]{slides-images/slide-008.jpg}
\caption{视频任务关注动作类别，而不只是静态对象类别\protect\footnotemark}
\end{figure}
\footnotetext{Slides 第9页。}

\begin{figure}[H]
\centering
\includegraphics[width=0.95\textwidth]{slides-images/slide-009.jpg}
\caption{图像识别看对象，视频识别看动作和事件\protect\footnotemark}
\end{figure}
\footnotetext{Slides 第10页。}

\subsection{视频太大了}

视频理解的第一道工程门槛不是模型，而是数据体积。课程里给出的粗略估算很直接：视频通常以 30 fps 左右采样，未压缩视频会迅速增长到 GB 级别。按课上给出的量级，标准清晰度视频每分钟约 1.5 GB，高清甚至可到 10 GB 级别。

\begin{figure}[H]
\centering
\includegraphics[width=0.95\textwidth]{slides-images/slide-010.jpg}
\caption{视频数据很大：时长、分辨率和帧率乘起来会把存储和训练成本迅速推高\protect\footnotemark}
\end{figure}
\footnotetext{Slides 第11页。}

这意味着一个现实结论：\textbf{长视频不能整段直接喂给模型。} 最常见的应对方式，是把长视频切成短 clip，降低空间分辨率与帧率，让训练和推理都落到可控区间。

\begin{figure}[H]
\centering
\includegraphics[width=0.95\textwidth]{slides-images/slide-011.jpg}
\caption{一个实用折中：把长视频压缩成短 clip，降低 fps 和分辨率后再训练\protect\footnotemark}
\end{figure}
\footnotetext{Slides 第12页。}

\begin{knowledgebox}{短 clip 训练的直觉}
很多动作不需要完整看完才能判断。对“跑步”“游泳”“举重”这类动作来说，几秒钟内的局部运动模式通常就已经足够，因此训练时可以随机采样多个短片段，再把它们的预测聚合起来。
\end{knowledgebox}

\begin{figure}[H]
\centering
\includegraphics[width=0.95\textwidth]{slides-images/slide-013.jpg}
\caption{训练时常把长视频拆成短 clip，让模型先学局部动作模式\protect\footnotemark}
\end{figure}
\footnotetext{Slides 第14页。}

\begin{figure}[H]
\centering
\includegraphics[width=0.95\textwidth]{slides-images/slide-014.jpg}
\caption{测试时可以对多个 clip 做预测，再把结果平均成视频级判断\protect\footnotemark}
\end{figure}
\footnotetext{Slides 第15页。}

\begin{warningbox}{视频数据工程不是附属问题}
视频任务里的很多失败，不是模型不够强，而是采样、解码、压缩、链接失效和帧率设置出了问题。视频理解比图像理解更像一个完整系统工程。
\end{warningbox}

\section{短时序建模：单帧、早融合、晚融合和 3D CNN}

\subsection{单帧 baseline 为什么常常不差}

最朴素的做法，是把视频当成一堆图像来处理：抽取单帧、丢给图像分类器、最后在时间上平均或投票。这个 baseline 常常 surprisingly strong，因为很多动作本身就带着明显的静态线索，比如场景、道具、人体姿态和运动装备。

\begin{importantbox}{单帧 baseline 的意义}
\begin{itemize}
    \item 它是最便宜的对照组。
    \item 它能告诉你“外观信息到底有多强”。
    \item 如果单帧已经很强，说明任务可能被静态背景严重污染。
\end{itemize}
\end{importantbox}

\subsection{Early fusion, late fusion, 3D CNN}

短时序建模阶段最重要的不是某一个单独网络，而是“什么时候开始把时间维度纳入计算”。课程把它分成三类：

\begin{center}
\begin{tabular}{p{2.8cm} p{4.3cm} p{4.0cm}}
\toprule
方法 & 核心做法 & 主要特点 \\
\midrule
Late fusion & 每帧先用 2D CNN 编特征，最后再聚合时间 & 先学空间，再合并时间，最朴素也最稳妥 \\
Early fusion & 一开始就把多帧堆成更厚的 channel & 早早混合时间信息，但很粗暴 \\
3D CNN & 用 3D 卷积和 3D pooling 逐步融合时空信息 & 更自然，但算力更贵 \\
\bottomrule
\end{tabular}
\end{center}

\begin{figure}[H]
\centering
\includegraphics[width=0.95\textwidth]{slides-images/slide-020.jpg}
\caption{Early fusion：把时间堆成 channel，在第一层 2D 卷积里一次性看到所有帧\protect\footnotemark}
\end{figure}
\footnotetext{Slides 第21页。}

\begin{figure}[H]
\centering
\includegraphics[width=0.95\textwidth]{slides-images/slide-021.jpg}
\caption{3D CNN：把卷积和 pooling 都扩展到时间维，让网络从一开始就有时空归纳偏置\protect\footnotemark}
\end{figure}
\footnotetext{Slides 第22页。}

\subsection{为什么 3D CNN 是“慢融合”}

3D CNN 的直觉很好理解：如果视频里的模式本来就会在时间上移动，那卷积也应该在时间上滑动。于是，输入从 $C \times H \times W$ 变成 $C \times T \times H \times W$，卷积核也从 $k_H \times k_W$ 变成 $k_T \times k_H \times k_W$。

\begin{knowledgebox}{3D 卷积的基本形式}
如果输入特征是 $X \in \mathbb{R}^{C \times T \times H \times W}$，那么一个 3D 卷积核会在 $(T, H, W)$ 三个维度上滑动，输出仍然保留时间维。这样做的效果是：模型在每一层都能逐渐扩大时空感受野，而不是把时间只留到最后一层处理。
\end{knowledgebox}

\begin{figure}[H]
\centering
\includegraphics[width=0.95\textwidth]{slides-images/slide-022.jpg}
\caption{从 2D 卷积自然过渡到 3D 卷积：时间维和空间维被统一看成一个局部立方体\protect\footnotemark}
\end{figure}
\footnotetext{Slides 第23页。}

\begin{figure}[H]
\centering
\includegraphics[width=0.95\textwidth]{slides-images/slide-024.jpg}
\caption{Late fusion 的 toy example：时间维先保留到最后，卷积主要先在空间上展开\protect\footnotemark}
\end{figure}
\footnotetext{Slides 第25页。}

\begin{figure}[H]
\centering
\includegraphics[width=0.95\textwidth]{slides-images/slide-027.jpg}
\caption{Early fusion 的 toy example：时间信息在最早阶段被压成 channel，空间特征之后再逐步提取\protect\footnotemark}
\end{figure}
\footnotetext{Slides 第28页。}

\begin{figure}[H]
\centering
\includegraphics[width=0.95\textwidth]{slides-images/slide-030.jpg}
\caption{3D CNN 的 toy example：时间和空间一起逐步融合，因此也叫 slow fusion\protect\footnotemark}
\end{figure}
\footnotetext{Slides 第31页。}

\begin{importantbox}{三种融合方式的核心差别}
\begin{itemize}
    \item Late fusion 是“先空间、后时间”。
    \item Early fusion 是“先时间、后空间”。
    \item 3D CNN 是“时间和空间一起慢慢融合”。
\end{itemize}
\end{importantbox}

\subsection{为什么 early fusion 还不够}

讲者在 toy example 里给出的对比很清楚：early fusion 的第一层 2D 卷积虽然看到了多帧，但它本质上还是把时间当作额外 channel，一次性压缩。问题在于，一层卷积通常不足以编码复杂动作的全部时间结构。很多动作不是“某一帧像什么”，而是“变化过程如何发生”。

\begin{warningbox}{early fusion 的局限}
它把时间信息“早早压扁”，因此对需要逐层抽象运动模式的任务不够灵活。这个设计在工程上简单，但表达能力有限。
\end{warningbox}

\subsection{C3D：3D CNN 的 VGG 风格版本}

3D CNN 真正成为成熟方案，C3D 是里程碑之一。它像 VGG 一样堆很多简单的 `3x3x3` 卷积和 `2x2x2` pooling，把视频看成一个真正的 3D 体。其结构简洁，便于迁移，也容易作为 feature extractor 直接下游使用。

\begin{figure}[H]
\centering
\includegraphics[width=0.95\textwidth]{slides-images/slide-039.jpg}
\caption{C3D 是 3D CNN 的经典骨架：像 VGG 一样堆叠标准化的 3D 卷积块\protect\footnotemark}
\end{figure}
\footnotetext{Slides 第40页。}

\begin{figure}[H]
\centering
\includegraphics[width=0.95\textwidth]{slides-images/slide-040.jpg}
\caption{C3D 的层级结构：从 16 帧输入一路下采样到全连接层，形成可迁移的视频特征提取器\protect\footnotemark}
\end{figure}
\footnotetext{Slides 第41页。}

\begin{figure}[H]
\centering
\includegraphics[width=0.95\textwidth]{slides-images/slide-041.jpg}
\caption{C3D 的计算代价不低：3x3x3 的 3D 卷积非常贵，因此效率成为视频模型的重要约束\protect\footnotemark}
\end{figure}
\footnotetext{Slides 第42页。}

\begin{knowledgebox}{C3D 的重要性}
C3D 的价值不在于它是最终答案，而在于它把“视频也可以像图像一样用标准卷积堆起来”这件事讲清楚了。它把视频理解从概念问题推进到可工程化实现的问题。
\end{knowledgebox}

\begin{figure}[H]
\centering
\includegraphics[width=0.95\textwidth]{slides-images/slide-042.jpg}
\caption{Sports-1M 上的对比：3D CNN 和 C3D 都比单帧更强，但代价也明显更高\protect\footnotemark}
\end{figure}
\footnotetext{Slides 第43页。}

\begin{importantbox}{短时序阶段的结论}
\begin{enumerate}
    \item 单帧 baseline 是必须先看的参照。
    \item Early fusion 简单，但时间压缩太早。
    \item 3D CNN 更自然地融合时空信息。
    \item 但 3D 卷积计算代价高，后续方法必须继续追求效率。
\end{enumerate}
\end{importantbox}

\section{运动与外观分离：Two-Stream 网络和光流}

\subsection{为什么要把 motion 和 appearance 拆开}

视频里的信息并不总是适合混在一起处理。很多动作识别任务里，外观和运动各自携带不同类型的线索：

\begin{itemize}
    \item 外观分支更像图像分类器，负责识别人、物体和背景。
    \item 运动分支更像动作分类器，负责识别帧与帧之间的变化。
\end{itemize}

把这两种信号拆开，往往比强行一锅炖更有效。这就是 two-stream 的核心直觉。

\begin{figure}[H]
\centering
\includegraphics[width=0.95\textwidth]{slides-images/slide-043.jpg}
\caption{运动信息本身就足以让人理解动作：人类对 biological motion 的感知很强\protect\footnotemark}
\end{figure}
\footnotetext{Slides 第44页。}

\subsection{光流到底在测什么}

Two-stream 最经典的运动表示是 optical flow。它不是直接输入 RGB，而是输入相邻帧之间每个像素的位移估计。更形式化地说，光流是一个位移场

\[
F(x, y) = (d_x, d_y),
\]

其中 $d_x$ 和 $d_y$ 分别表示水平和垂直方向的位移。直觉上，光流告诉我们“这个像素在下一帧会往哪里动”。在经典亮度恒常假设下，可以写成

\[
I_{t+1}(x + d_x, y + d_y) \approx I_t(x, y).
\]

\begin{knowledgebox}{为什么光流有用}
\begin{itemize}
    \item 它把“运动”显式化了。
    \item 它让模型少做一层“自己猜运动”的工作。
    \item 它对动作识别特别有效，因为很多动作的核心就是动态变化，而不是静态外观。
\end{itemize}
\end{knowledgebox}

\begin{figure}[H]
\centering
\includegraphics[width=0.95\textwidth]{slides-images/slide-044.jpg}
\caption{光流定义：从帧 $t$ 到帧 $t+1$ 的像素位移场\protect\footnotemark}
\end{figure}
\footnotetext{Slides 第45页。}

\begin{figure}[H]
\centering
\includegraphics[width=0.95\textwidth]{slides-images/slide-045.jpg}
\caption{光流在两个方向上的分量可以分别可视化成 horizontal flow 和 vertical flow\protect\footnotemark}
\end{figure}
\footnotetext{Slides 第46页。}

\subsection{Two-stream 的架构}

Two-stream 的结构很直接：

\begin{enumerate}
    \item \textbf{Spatial stream}：输入单帧 RGB 图像，学外观。
    \item \textbf{Temporal stream}：输入多帧光流堆叠，学运动。
    \item \textbf{Fusion}：把两个分支的预测平均、加权或用分类器再融合。
\end{enumerate}

\begin{figure}[H]
\centering
\includegraphics[width=0.95\textwidth]{slides-images/slide-046.jpg}
\caption{Two-stream 的输入形式：一个分支看单帧图像，另一个分支看光流堆叠\protect\footnotemark}
\end{figure}
\footnotetext{Slides 第47页。}

\begin{figure}[H]
\centering
\includegraphics[width=0.95\textwidth]{slides-images/slide-047.jpg}
\caption{Two-stream 在 UCF-101 上的结果：运动分支、外观分支和融合后效果有明显差别\protect\footnotemark}
\end{figure}
\footnotetext{Slides 第48页。}

\begin{importantbox}{Two-stream 的经验现象}
课程中强调了一个反直觉但重要的现象：只看 motion 的 temporal stream 往往已经很强，有时甚至比单纯的 spatial stream 更强。这说明动作任务里，运动信号可能比静态外观更关键。
\end{importantbox}

\subsection{Two-stream 的局限}

Two-stream 解决了“外观和运动混在一起不容易学”的问题，但它也有明显代价：

\begin{itemize}
    \item 光流本身要预计算，工程成本高；
    \item 模型是两个分支，整体更复杂；
    \item 两个分支的信息融合还比较粗。
\end{itemize}

这也是后续 3D CNN、I3D、Non-local block 和 Transformer 风格方法出现的背景。

\begin{warningbox}{Two-stream 的经验教训}
显式运动表示很强，但它把前处理和模型切成了两部分。随着任务变大、视频变长、数据变多，大家越来越希望模型内部自己学会时空表征。
\end{warningbox}

\section{长时序建模：CNN + RNN 到 self-attention}

\subsection{为什么短 clip 不够}

短 clip 能捕获局部动作，但很多任务需要更长时间跨度上的语义。例如，一个人先站、后跑、再停下，或者一个动作从准备、执行到完成，往往都需要跨越更长的时间窗口。此时只看几秒钟就不够了。

\begin{figure}[H]
\centering
\includegraphics[width=0.95\textwidth]{slides-images/slide-049.jpg}
\caption{短 clip 只能覆盖局部运动：如果动作跨越更长时间，就需要长时序建模\protect\footnotemark}
\end{figure}
\footnotetext{Slides 第50页。}

\subsection{CNN + RNN / LSTM}

一个自然的想法是：先用 CNN 对每个短片段或每一帧提取特征，再把这些特征送进 RNN 或 LSTM 聚合时间信息。这样做的好处是把问题拆成两个层次：

\begin{itemize}
    \item CNN 负责局部空间或局部时空特征；
    \item RNN 负责更长范围的时间依赖。
\end{itemize}

\begin{figure}[H]
\centering
\includegraphics[width=0.95\textwidth]{slides-images/slide-050.jpg}
\caption{长时序建模的第一步：先用 CNN 提取每个时间片的局部特征，再交给序列模型处理更长的依赖\protect\footnotemark}
\end{figure}
\footnotetext{Slides 第51页。}

\begin{figure}[H]
\centering
\includegraphics[width=0.95\textwidth]{slides-images/slide-051.jpg}
\caption{如果用 LSTM 处理这些局部特征，就能把短时序表征扩展到更长的视频级表示\protect\footnotemark}
\end{figure}
\footnotetext{Slides 第52页。}

\begin{knowledgebox}{CNN + RNN 的核心思想}
CNN 看到的是局部窗口，RNN 看到的是时间序列。把两者串起来，就能兼顾“局部动作模式”和“全局视频语义”。
\end{knowledgebox}

\subsection{Recurrent convolutional network}

课程还提到一种更细粒度的组合方式：把 RNN 的矩阵乘法替换成卷积，得到 recurrent convolutional network。它的思想是：

\begin{itemize}
    \item 在空间维度上保留卷积的局部归纳偏置；
    \item 在时间维度上递归地传递状态；
    \item 通过时空联合建模来处理视频序列。
\end{itemize}

这种设计在概念上很自然，但受限于 RNN 本身的顺序性，训练和推理都不算高效。

\begin{importantbox}{为什么长序列会逼出 attention}
RNN 可以做长时序建模，但它难并行、难优化、长距离依赖也容易变弱。attention 的价值，就是把“远处帧之间可以直接连接”这件事做成显式计算。
\end{importantbox}

\subsection{self-attention 和 non-local block}

当视频足够长时，局部卷积和循环结构仍然会受限。一个更直接的思路是引入 \textbf{self-attention} 或 \textbf{non-local block}：让任意两个时空位置都能交互，而不是只看邻近窗口。

如果输入向量为 $x$，那经典 self-attention 可以写成：

\[
q = xW_q,\quad k = xW_k,\quad v = xW_v,
\]
\[
e_{ij} = \frac{q_i^\top k_j}{\sqrt{d}}, \qquad a_{ij} = \mathrm{softmax}(e_{ij}), \qquad y_i = \sum_j a_{ij} v_j.
\]

\begin{itemize}
    \item Query / Key / Value 的逻辑和 Transformer 类似；
    \item 它可以在 3D 特征图上做全局匹配；
    \item 这样能捕获更长范围的时空依赖。
\end{itemize}

\begin{knowledgebox}{self-attention 在视频里有什么用}
\begin{itemize}
    \item 它让远距离帧之间直接交互。
    \item 它适合捕获长程依赖和非局部关系。
    \item 它为后续 Transformer 化的视频模型铺路。
\end{itemize}
\end{knowledgebox}

\begin{importantbox}{长时序建模的共同目标}
不管是 RNN、Recurrent CNN、Non-local block 还是 Transformer，目标都一样：把“很远的帧之间可能有关联”这件事显式编码进模型。
\end{importantbox}

\section{从短 clip 到复杂动作任务}

\subsection{动作不一定靠外观猜}

讲者给出了一些非常典型的动作识别例子：举重、涂眼影、快速挥动之类的动作，往往更依赖运动而不是静态外观。视觉模型如果只盯着某一帧，很容易忽略“动作过程”。

\subsection{Temporal action localization}

分类只回答“是什么动作”，但实际视频里还常常要问“动作什么时候开始、什么时候结束”。Temporal action localization 就是在时间轴上找动作边界。这个任务把片段级分类推进到“时间上的定位 + 分类”。

\subsection{Spatio-temporal detection}

如果还想知道动作发生在画面的哪个位置，那就变成空间和时间同时定位的问题。这比普通检测更难，因为每个预测不仅有 box，还要有时间维度。

\begin{warningbox}{长视频任务的核心难点}
真正困难的不是“有没有模型”，而是“模型如何在有限算力下看完足够多的内容”。因此 clip 采样、关键片段选择和高效推理，都是视频理解里绕不开的问题。
\end{warningbox}

\section{多模态视频理解：声音、视觉和融合}

\subsection{为什么要把音频也算进来}

视频并不只有视觉。很多场景中，音频同样提供重要线索：

\begin{itemize}
    \item 人在说话时，声音能帮助识别是谁在说。
    \item 乐器演奏时，画面和声音可以互相约束。
    \item 某些动作在视觉上相似，但声音差异很大。
\end{itemize}

\subsection{视觉引导的音频分离}

一个很有代表性的任务是 visually guided audio source separation。直觉很简单：如果视频里能看到谁在动、谁在发声，那就可以借助视觉把混合音频拆开。

\begin{knowledgebox}{音视频分离为什么值得做}
\begin{itemize}
    \item 它把“看见谁在动”转化成“知道声音属于谁”。
    \item 它能改善会议、访谈、音乐和机器人交互中的感知质量。
    \item 它说明视频理解不仅是识别，还可以是信号分解和重建。
\end{itemize}
\end{knowledgebox}

\subsection{Audio-visual transformers 和多模态理解}

进一步地，研究者开始把图像 patch、视频 clip 和音频谱图一起送进 Transformer 结构，做统一的多模态建模。课程里列出的方向包括 attention bottleneck、audio-adaptive recognition、audio-visual masked autoencoding 等。这里的重点已经不只是“加一条音频分支”，而是把多模态表示统一进一个可学习框架。

\begin{importantbox}{多模态的两个方向}
\begin{enumerate}
    \item \textbf{判别式}：做分类、检索、定位。
    \item \textbf{生成式}：做重建、补全、mask prediction。
\end{enumerate}
\end{importantbox}

\section{高效视频理解：采样、选择和轻量化}

\subsection{为什么效率问题会变成主问题}

长视频很长，3D 卷积很贵，attention 更贵。如果模型每次都把所有帧完整跑一遍，成本会迅速失控。因此，视频理解越来越像一个“在预算内找信息”的问题，而不是纯粹的分类问题。

\begin{knowledgebox}{效率优化的思路}
高效视频理解不是简单“把模型变小”，而是把计算集中在最有用的时间段、空间区域和模态上。它本质上是在做信息预算分配。
\end{knowledgebox}

\subsection{几类常见策略}

效率提升通常有几种思路：

\begin{enumerate}
    \item \textbf{采样更少的 clip}：只处理更有信息的片段。
    \item \textbf{选择更轻的骨干}：例如更轻量的 3D 网络或更高效的 backbone。
    \item \textbf{做模态选择}：有些任务不一定需要所有模态同时推理。
    \item \textbf{做预览机制}：先用便宜模态估计哪里值得看，再做精细处理。
\end{enumerate}

\begin{figure}[H]
\centering
\includegraphics[width=0.95\textwidth]{slides-images/slide-048.jpg}
\caption{长视频动作分类的最终效果：运动信息、外观信息和融合策略共同决定性能\protect\footnotemark}
\end{figure}
\footnotetext{Slides 第49页。}

\subsection{从长视频到 egocentric video}

更进一步，课程把话题推进到 egocentric / exocentric 结合的场景。第一视角视频和外部视角视频可以互相补充，尤其在多人与多摄像头场景里，视频理解开始变成“谁在看什么、谁在和谁交互”的问题。

\begin{warningbox}{第一视角视频更难}
第一视角视频更接近真实体验，但同时也更抖、更碎、更依赖上下文，还会把“操作者意图”引入任务。这让模型更接近人，也更难。
\end{warningbox}

\section{视频理解和大模型}

\subsection{为什么视频理解会走向 LLM}

视频模型下一步不只是分类器，而是可以被 prompt 的系统：输入视频和问题，输出描述、解释或结构化答案。课程最后提到的 Video-LLaVA、Video-ChatGPT、VideoLLaMA 3，都说明视频理解正在进入统一的多模态对话框架。

\begin{importantbox}{视频 LLM 的意义}
\begin{itemize}
    \item 它把视频理解从分类器推进到交互式系统。
\item 它把动作识别推进到语言解释和任务规划。
    \item 它也把视频理解和具身智能、助手系统更紧密地连起来。
\end{itemize}
\end{importantbox}

\subsection{这一讲真正想让你记住什么}

这节课表面上讲的是视频理解方法史，实际上讲的是一条更大的路径：从短 clip 到长视频，从外观到运动，从单模态到多模态，从分类到定位，从识别到问答，再从问答走向可操作的系统。

\begin{table}[H]
\centering
\begin{tabular}{p{3.1cm}p{3.4cm}p{4.8cm}}
\toprule
\textbf{阶段} & \textbf{核心问题} & \textbf{主要方法} \\
\midrule
短 clip 分类 & 动作是什么 & 单帧、late fusion、early fusion、3D CNN \\
运动分离 & 动作靠什么线索 & optical flow、two-stream \\
长时序建模 & 动作如何跨越更长时间 & CNN + RNN、recurrent CNN、attention \\
复杂任务 & 动作何时何地发生 & temporal localization、spatio-temporal detection \\
多模态与未来 & 还能利用什么信息 & 音视频融合、efficiency、LLM \\
\bottomrule
\end{tabular}
\caption{视频理解从局部动作识别一路扩展到多模态和 foundation model}
\end{table}

\begin{importantbox}{这节课最值得记住的几句话}
\begin{enumerate}
    \item 视频就是 \textbf{2D + time}，但时间维度会带来完全不同的建模挑战。
    \item 单帧 baseline 往往不差，但它忽略了真正的运动信息。
    \item 3D CNN 的本质是让卷积在时空体上滑动，而不是只在图像平面上滑动。
    \item Two-stream 说明了外观和运动可以分开建模，光流是经典运动表示。
    \item 长视频不能只靠短 clip；需要 RNN、attention 或更高效的时序聚合。
    \item 现实系统里，数据规模、采样策略和效率和模型结构同样重要。
\end{enumerate}
\end{importantbox}

\section{总结与延伸}

\subsection{本章小结}
这一讲把视频理解拆成三层问题：如何表示局部运动、如何跨更长时间建模时序，以及如何在真实系统里兼顾精度与效率。3D CNN、two-stream、attention 和多模态融合并不是互斥路线，而是围绕“如何把时间维度引入视觉表示”这个核心问题的不同答案。

\subsection{拓展阅读}

\begin{itemize}
    \item Ji et al., \textit{3D Convolutional Neural Networks for Human Action Recognition}。
    \item Tran et al., \textit{Learning Spatiotemporal Features with 3D Convolutional Networks}（C3D）。
    \item Simonyan and Zisserman, \textit{Two-Stream Convolutional Networks for Action Recognition in Videos}。
    \item Donahue et al., \textit{Long-term Recurrent Convolutional Networks for Visual Recognition and Description}。
    \item Wang et al., \textit{Non-local Neural Networks}。
    \item Carreira and Zisserman, \textit{Quo Vadis, Action Recognition? A New Model and the Kinetics Dataset}（I3D）。
\end{itemize}

\end{document}
