
视频元信息
- 所属课程:吴恩达深度学习专项课程 · 卷积神经网络(CNN)· 目标检测
- 章节编号:第 29 讲 · 3.4 在卷积网络上实现滑动窗口
- 语言:英文讲解(官方中英字幕)
- 核心主题:将全连接层转换为卷积层,从而实现滑动窗口目标检测的卷积化高效实现
内容摘要(TL;DR)
本视频讲解如何把神经网络中的全连接层等价改写为卷积层(5×5 卷积 + 1×1 卷积),再借助这一改写把滑动窗口目标检测的多次前向传播合并为一次卷积前向传播,从而共享大量重复计算,把算法效率提升几个数量级。最后指出该方法仍存在的弱点:边界框位置不够精确,为下一讲的 YOLO/Bounding Box 预测埋下伏笔。
一、课程引入:从"太慢"到"卷积化" [00:00]
上一讲学习了用滑动窗口(Sliding Windows)做目标检测,但发现它太慢(too slow)。本讲的目标是:如何用卷积方式实现该算法,让它变得高效。
本讲主线逻辑:先把全连接层改写成卷积层 → 再用这个改写技巧实现滑动窗口的卷积化 → 最后指出仍存在的精度弱点。
理解:这是目标检测系列的关键转折点。滑动窗口从"暴力枚举"升级为"一次前向传播出所有位置结果",是后续 YOLO 算法的基础思想。
二、把全连接层转换为卷积层 [00:14]
2.1 原始网络结构(用于说明的示例)
设目标检测算法输入 14×14×3 的图像(尺寸很小,仅为便于讲解):
| 层 | 操作 | 输出尺寸 |
|---|---|---|
| 输入 | 14×14×3 图像 | 14×14×3 |
| 卷积 | 16 个 5×5 滤波器 | 10×10×16 |
| 池化 | 2×2 最大池化 | 5×5×16 |
| 全连接 | 连接到 400 个单元 | 400 |
| 全连接 | 再一层 | — |
| 输出 | Softmax 单元 | 输出 Y |
分类类别(4 类):行人(pedestrian)、汽车(car)、摩托车(motorcycle)、背景(background)。
输出 Y 表示为 4 个数:对应 Softmax 在 4 个类别上输出的概率。
2.2 关键转换:全连接层 → 卷积层
第一个全连接层(400 个单元)的卷积实现:
- 用 400 个 5×5 的滤波器去卷 5×5×16 的输入
- 易错点:5×5 滤波器实际是 5×5×16,因为滤波器要跨全部 16 个通道,通道数必须匹配
- 输出为 1×1,400 个滤波器 → 输出 1×1×400
核心等价性:把 400 个节点看作 1×1×400 的体积(volume),这在数学上与全连接层完全等价——因为每个节点都是上一层 5×5×16 激活值的某个线性函数。
第二个全连接层的卷积实现:
- 使用 400 个 1×1 滤波器做 1×1 卷积
- 输出仍为 1×1×400
最后的输出层:
- 再用 1×1 滤波器 + Softmax 激活
- 得到 1×1×4 体积,替代原来的 4 个输出数字
推导:1×1 卷积本质上就是"逐像素的全连接层"——对每个空间位置独立地做一次跨通道的线性组合。它不改变空间尺寸,只改变通道数,因此可以完美替代全连接层。
思考:这种"全连接=卷积"的等价性是本讲的核心钥匙。一旦网络全是卷积层,输入尺寸就不再受限制——这正是后面能一次性处理整张大图的根本原因。
三、滑动窗口的卷积实现 [04:03]
该部分内容基于 OverFeat 论文(Sermanet、Eigen、Zhang、Mathieu、Fergus、LeCun)。
3.1 传统滑动窗口的朴素做法
设输入图像为 16×16×3(在原 14×14 基础上加了黄色边框):
- 把蓝色区域(左上 14×14)送入网络 → 得到分类结果
- 以步长 2 像素滑动,把绿色区域送入网络 → 又一个结果
- 再送入橙色区域、紫色区域……
- 在 16×16 图像上共需运行网络 4 次,得到 4 个标签
问题:这 4 次前向传播中,大量计算高度重复(highly duplicated)。
3.2 卷积化实现:一次前向传播得到全部结果
做法:把同一个网络(相同参数)直接作用在整张 16×16×3 图像上。
逐层尺寸变化如下:
| 层 | 操作 | 输出尺寸 |
|---|---|---|
| 输入 | 16×16×3 | 16×16×3 |
| 卷积 | 16 个 5×5 滤波器 | 12×12×16 |
| 池化 | 2×2 最大池化 | 6×6×16 |
| 卷积 | 400 个 5×5 滤波器 | 2×2×400 |
| 卷积 | 400 个 1×1 滤波器 | 2×2×400 |
| 卷积 | 1×1 滤波器 + Softmax | 2×2×4 |
核心结论:原本需要 4 次独立前向传播,现在一次前向传播就得到 2×2×4 的输出。其中每个 1×1×4 子块,恰好对应原网络中一个 14×14 区域的检测结果:
- 左上 1×1×4 → 左上角 14×14 区域的结果
- 右上 1×1×4 → 右上角区域的结果
- 左下、右下同理
3.3 为什么能共享计算?(绿色区域示例)
以绿色区域为例,逐步追踪:
- 若只把绿色区域送入原网络 → 第一层激活对应图中某个区域
- 池化后的第二层激活 → 对应另一个区域
- 依次往后……
卷积实现所做的:不是对 4 个子集独立做 4 次前向传播,而是把 4 次合并为一次,在 4 个 14×14 窗口共有的区域上共享大量计算。
理解:这本质上是卷积的"平移不变性/权值共享"特性带来的红利。同一组滤波器在图像的不同位置复用,输出的每个空间位置天然对应一个窗口的检测结果。
思考:可以把这种实现理解为"把滑动窗口的循环展开成卷积的空间维度",用一次矩阵运算替代 N 次重复运算。
四、更大的例子:28×28 图像 [09:09]
设输入为 28×28×3 图像,用同样方式做前向传播:
- 输出为 8×8×4
解读:
- 这等价于用 14×14 窗口在 28×28 图像上做滑动窗口
- 第一个输出对应左上角区域
- 以步长 2 向右滑动:窗口 1 → 窗口 2 → …… 共 8 个位置 → 得到第一行 8 个输出
- 再向下滑动,得到全部 8×8×4 输出
关键对应关系:正是因为网络中存在 2×2 最大池化,所以该卷积实现等价于在原始图像上以步长 2 运行神经网络。
推导:每经过一次 2×2 池化,空间分辨率减半,等效于原图上的采样步长翻倍。因此池化层决定了滑动窗口的"等效步长"。
五、方法总结与优势 [10:03]
5.1 传统滑动窗口做法(回顾)
- 抠出(crop)一个 14×14 区域
- 送入 ConvNet 运行
- 移到下一个区域,重复
- 再下一个 14×14 区域,重复……直到识别出汽车
缺点:串行(sequentially)执行,计算量巨大。
5.2 卷积化做法
- 直接把整张图(如 28×28)送入这个大 ConvNet
- 一次前向传播同时得到所有位置的预测
- 高效识别出汽车的位置
效率提升的本质:卷积实现让滑动窗口的多次前向传播共享计算,把"多次重复运算"变成"一次大运算",使整个算法高效得多。
六、遗留弱点与下讲预告 [10:57]
本算法仍有一个弱点(weakness):
边界框(bounding boxes)的位置不够精确。因为窗口位置由固定的滑动步长决定,无法给出像素级精准的物体边界。
下一讲:将讲解如何解决边界框位置不准确的问题(即引入更精确的边界框预测方法)。
思考:这个弱点正是 YOLO 等算法要解决的核心问题——从"固定网格位置"升级为"直接回归精确边界框坐标"。
七、核心知识点速查
- 全连接层 → 卷积层等价改写:全连接层可视为用滤波器尺寸等于输入空间尺寸的卷积层
- 5×5×16 滤波器:滤波器通道数必须与输入通道数匹配
- 1×1 卷积:等价于逐位置的全连接层,用于替代全连接层
- 滑动窗口卷积化:一次前向传播输出 2×2×4(或 8×8×4),每个 1×1×4 子块对应一个窗口位置
- 等效步长:由池化层(2×2 池化 → 步长 2)决定
- 核心收益:共享重复计算,效率大幅提升
- 遗留问题:边界框位置不精确
关键标签 / 关键词
吴恩达深度学习 #卷积神经网络 #目标检测 #滑动窗口 #卷积化实现 #全连接层转卷积层 #1x1卷积 #OverFeat #边界框 #计算机视觉 #CNN #深度学习
生成时间:2026-10-11 00:09:39 生成平台:VideoNote www.xygy.top