
视频元信息
- 课程:吴恩达深度学习专项课程 · 卷积神经网络(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 后,就可以在测试图上做滑窗检测。
基本流程:
- 选定一个窗口大小(window size);
- 从图像某个位置取一个小矩形区域(如红色小方块),送入 CNN 预测;
- 将窗口平移一个步长(stride),再取一块送入 CNN;
- 重复,直到窗口滑过图像中每一个位置;
- 对每个位置输出 0 或 1。
要点:
- 关键点:滑动窗口 = 遍历所有位置 + 逐块分类;
- 视频中为加快动画演示,故意用了较大的步长;
- 实际做法是把每个小裁剪图送入 CNN,按步长对每个位置分类 0/1。
理解:可以把滑窗检测想象成"用放大镜逐格扫描整张图",每扫一格就问一次 CNN:"这一格里有车吗?"
五、多尺度滑动:不同大小的窗口 [02:44]
用同一窗口大小扫完一遍后,换更大的窗口重复上述过程。
做法:
- 第一遍:用某一尺寸的窗口滑遍全图;
- 第二遍:取更大的区域,将其缩放到 CNN 期望的输入尺寸,再送入 CNN 输出 0/1,然后继续滑动;
- 第三遍:用更大的窗口再重复;
- 依此类推。
要点:
- 关键点:每次换窗口大小后,都要把该区域 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