视频封面

视频元信息

  • 课程:吴恩达深度学习专项课程 · 卷积神经网络(CNN)· 第 28 讲 3.3
  • 主题:目标检测之滑动窗口检测算法(Sliding Windows Detection)
  • 语言:官方中英字幕

内容摘要(TL;DR)

本节介绍滑动窗口检测算法:先用紧密裁剪的车/非车图片训练一个 CNN 分类器,再用不同大小的窗口以固定步长在测试图上滑动,逐块送入 CNN 判断是否含车。核心缺陷是计算成本极高,且步长粗细则精度与速度难以兼顾。视频最后预告可用卷积方式高效实现滑动窗口。


一、回顾与本节定位 [00:00]

上一节讲了目标定位(Object Localization)和关键点检测(Landmark Detection),本节开始构建另外两种目标检测算法。

本节重点:使用 CNN 完成 滑动窗口检测算法(Sliding Windows Detection)。

理解:目标定位回答"是什么、在哪(单个物体)",而目标检测要回答"图中有哪些物体、各自在哪(多个物体)",滑动窗口是把检测问题转化为大量分类问题的朴素思路。


二、第一步:构建带标签的训练集 [00:17]

以车辆检测为例,先准备训练集 X 和 Y。

做法:

  • 收集紧密裁剪(closely cropped)的图片;
  • 正样本:图像中几乎整张都是车,车居中;
  • 负样本:图像中没有车。

要点:

  • 关键点:训练集必须是"紧密裁剪"的图片——即把车以外的部分裁掉,让车基本占满整张图;
  • 这样得到的是一个标准的二分类数据集。

理解:之所以要紧密裁剪,是因为后续滑窗检测时,送入 CNN 的每一个窗口都希望"要么是整辆车,要么完全不是车",训练分布要和推理时的输入分布尽量一致。


三、第二步:训练 CNN 分类器 [00:57]

给定上述标签训练集,训练一个卷积网络:

  • 输入:一张紧密裁剪的图片(如裁剪后的车图);
  • 输出:Y ∈ {0, 1},即"是不是车"。

易错点:这里的 CNN 只是一个二分类器,输出的是"有车/无车",并不输出边界框坐标。定位能力是靠"窗口滑动 + 分类"间接实现的。

思考:这与目标定位任务不同——定位网络的输出是 (bx, by, bh, bw) 加类别,而滑窗分类器只输出一个 0/1。


四、第三步:滑动窗口检测流程 [01:14]

训练好 CNN 后,就可以在测试图上做滑窗检测。

基本流程:

  1. 选定一个窗口大小(window size);
  2. 从图像某个位置取一个小矩形区域(如红色小方块),送入 CNN 预测;
  3. 将窗口平移一个步长(stride),再取一块送入 CNN;
  4. 重复,直到窗口滑过图像中每一个位置;
  5. 对每个位置输出 0 或 1。

要点:

  • 关键点:滑动窗口 = 遍历所有位置 + 逐块分类;
  • 视频中为加快动画演示,故意用了较大的步长;
  • 实际做法是把每个小裁剪图送入 CNN,按步长对每个位置分类 0/1。

理解:可以把滑窗检测想象成"用放大镜逐格扫描整张图",每扫一格就问一次 CNN:"这一格里有车吗?"


五、多尺度滑动:不同大小的窗口 [02:44]

用同一窗口大小扫完一遍后,换更大的窗口重复上述过程。

做法:

  1. 第一遍:用某一尺寸的窗口滑遍全图;
  2. 第二遍:取更大的区域,将其缩放到 CNN 期望的输入尺寸,再送入 CNN 输出 0/1,然后继续滑动;
  3. 第三遍:用更大的窗口再重复;
  4. 依此类推。

要点:

  • 关键点:每次换窗口大小后,都要把该区域 resize 到 CNN 固定的输入尺寸;
  • 目的:只要图中某处有车,希望总有一个窗口能让 CNN 输出 1,从而检测到车。

易错点:多尺度是必需的。如果只用一种窗口大小,尺寸偏大或偏小的目标都可能漏检。窗口大小决定能"框住"多大的物体。

理解:这就是"图像金字塔"思想的雏形——用不同尺度扫描同一张图,以应对目标尺寸变化。


六、算法命名与本质 [03:47]

之所以叫滑动窗口检测(Sliding Windows Detection),是因为:

  • 取一个个方形窗口(square boxes);
  • 以某个步长(stride)在整张图上滑动;
  • 对每个方形区域分类"是否含车"。

本质:把目标检测问题转化为在大量裁剪区域上反复执行分类任务。


七、核心缺陷:计算成本极高 [04:04]

巨大缺点:计算成本(computational cost)。

原因:

  • 需要从图像中裁剪出极多的不同方形区域;
  • 每个区域都要独立地跑一遍 CNN。

步长的两难权衡:

步长选择 窗口数量 计算成本 定位精度
粗步长(大 stride) 少 低 差,定位不准
细步长(小 stride) 极多 极高 好

要点:

  • 考点:粗步长降低计算量,但会损害性能(定位精度下降);
  • 考点:细步长定位更准,但送入 CNN 的小区域数量暴增,计算成本极高;
  • 结论:无论怎么选,都很难同时兼顾速度与精度。

易错点:不要以为滑窗检测只是"慢一点"。由于每个窗口都要完整前向传播一次 CNN,窗口数量随步长平方级增长,实际几乎不可用。


八、历史背景:神经网络之前为何可行 [04:48]

在神经网络兴起之前,人们用的是更简单的分类器,如:

  • 简单线性分类器;
  • 配合手工设计特征(hand-engineered features)。

当时可行的原因:

  • 每个分类器计算代价很低(只是一个线性函数);
  • 因此滑窗检测在当时运行尚可,不算差方法。

现在的问题:

  • 用 CNN 跑单次分类任务本身就昂贵得多;
  • 所以这种滑窗方式极其缓慢(infeasibly slow);
  • 而且除非用很细的粒度/很小的步长,否则无法准确定位物体。

思考:这体现了"特征工程时代"与"深度学习时代"计算范式的差异——分类器从廉价线性模型变成昂贵 CNN,原本可接受的穷举策略就变得不可行。


九、解决方案预告:卷积化实现 [05:32]

好消息:这个计算成本问题有很好的解决方案。

关键点:滑动窗口目标检测器可以用卷积方式(convolutionally)实现,效率高得多。

视频最后预告:下一节将讲解如何用卷积高效实现滑动窗口。

理解:卷积化实现的核心思想是——把全连接层转成卷积层,让一次前向传播就同时算出所有窗口位置的输出,从而共享计算、避免重复。


【拓展】相关背景与踩坑提示

  • 【拓展】滑窗检测与后续算法的关系:滑窗检测是目标检测的"朴素基线"。后续的 OverFeat 用卷积化滑窗大幅提速,R-CNN / Fast R-CNN / Faster R-CNN 用区域提议(region proposal)替代穷举,YOLO / SSD 则把检测变为单次回归,彻底摆脱逐窗口分类。
  • 【拓展】为什么"紧密裁剪"很重要:若训练图是整张街景,模型学到的是"街景里有车"而非"这块区域是车",推理时小窗口输入会与训练分布不匹配,导致误判。这是训练/推理分布一致性的经典案例。
  • 【拓展】非极大值抑制(NMS):滑窗检测常对同一物体产生多个重叠的阳性窗口,需要用 NMS 合并去重。这是滑窗类方法的常见配套步骤。
  • 【拓展】步长与感受野:窗口大小应大致匹配目标在图像中的尺度;窗口远大于目标时,一块区域里既有车又有大量背景,CNN 仍可能判 1,导致边界框粗糙。
  • 【易错点】滑窗分类器不直接给出边界框:它只回答"是/否",框的位置由窗口位置决定,因此框的精度受窗口大小和步长限制。

关键标签 / 关键词

目标检测 滑动窗口检测 Sliding Windows Detection CNN 图像分类 紧密裁剪 窗口大小 步长 stride 多尺度 计算成本 卷积化实现 吴恩达深度学习 卷积神经网络 Object Detection


生成时间:2026-10-11 00:09:58 生成平台:VideoNote www.xygy.top