YOLO v2(2016):又叫YOLO9000,更快更好更强,引入Anchor机制

YOLO v2(2016):又叫YOLO9000,更快更好更强,引入Anchor机制

导出时间:2025/11/23 20:26:31

1、摘要

通过采用一种新颖的多尺度训练方法,同一 YOLOv2模型可在不同分辨率下运行,实现了速度与 精度之间的灵活平衡。在67帧/秒时,YOLOv2在VOC 2007数据集上获得76.8 mAP;在40帧/秒时,其 mAP提升至78.6

  1. 核心思想:像“可伸缩的放大镜”
想象 YOLOv2 模型是一个 可伸缩的放大镜:
  • 放大镜调大(高分辨率):看得更清楚(精度高),但移动速度慢(计算慢,帧率低)。
  • 放大镜调小(低分辨率):看得快(速度快,帧率高),但可能漏掉细节(精度略低)。
多尺度训练就是让这个“放大镜”在训练时不断练习不同的缩放级别,从而学会无论放大还是缩小,都能认出目标。

最后,我们提出了一种联合训练目标检测与分类 的方法。基于此方法,我们在COCO检测数据集和 ImageNet分类数据集上同步训练YOLO9000。我们 的联合训练方法使YOLO9000能够对缺乏标注数据的 物体类别进行检测预测。我们在ImageNet检测任务 上验证了该方法的有效性:尽管仅拥有200个类别中 44类的检测数据,YOLO9000在ImageNet验证集上 仍取得了19. 7的平均精度(mAP)。对于COCO未收 录的156个类别,其mAP值达到16.0。值得注意的 是,YOLO不仅能识别200多个类别,还能对超过 9000种不同物体类别进行预测,且全程保持实时运行 能力。

  1. 核心问题:标注数据不够怎么办?
  • 目标检测(比如框出图中的狗)需要大量标注数据(画框+标签)。
  • 分类任务(比如判断图片是猫还是狗)的标注更容易获得(只需标签,不用画框)。
但现实中,很多物体 有分类数据,却缺乏检测数据(比如“考拉”有分类标签,但没人标注它在图里的位置)。
怎么办? →
  1. 联合训练:让检测模型“一箭双雕”
方法:
  • 同时喂两种数据:
    • 检测数据(带框的图,如COCO):教模型“框物体+认类别”。
    • 分类数据(仅标签的图,如ImageNet):教模型“认更多类别”。
  • 共享大部分网络:两种任务共用同一个特征提取器(Darknet-19),只有最后几层分开学。
效果:
模型既能精准框出物体(检测),又能认识大量类别(分类)——哪怕某些类别从未见过标注框!

2、区域提议介绍

什么是区域提议(Region Proposal)?

区域提议是指从图像中提取可能包含目标的潜在区域(即候选框,Proposals),这些区域通常是矩形框,覆盖了图像中的物体位置。区域提议的目标是:
  • 减少计算量:避免对整张图像的所有位置进行密集扫描。
  • 提高召回率:确保尽可能多的真实目标被候选框覆盖。

区域提议的实现方法

区域提议的生成可以分为传统方法和深度学习方法:

(1)传统方法(非深度学习)

① 滑动窗口(Sliding Window)

  • 在图像上以不同尺度和长宽比滑动固定大小的窗口,生成大量候选框。
  • 缺点:计算量大,冗余框多。

② Selective Search

  • 基于图像的低级特征(颜色、纹理、边缘等)进行层次化区域合并,生成候选框。
  • 步骤:
    1. 初始化:将图像分割成许多小区域(超像素)。
    2. 计算区域相似度(颜色、纹理、大小等)。
    3. 合并最相似的区域,直到整张图像合并为一个区域。
    4. 在合并过程中记录所有可能的候选框。
  • 优点:比滑动窗口更高效,召回率较高。
  • 缺点:仍然是启发式方法,计算较慢(约2秒/图)。

③ EdgeBoxes

  • 基于边缘信息(如Canny边缘检测)生成候选框,假设目标周围有清晰的边缘。
  • 优点:计算较快,适合边缘明显的物体。
  • 缺点:对纹理复杂的目标效果较差。

(2)深度学习方法(现代主流方法)

① Region Proposal Network (RPN) — Faster R-CNN

  • RPN(区域提议网络) 是一个轻量级CNN,直接预测候选框:
    • 输入:CNN特征图(如VGG、ResNet提取的特征)。
    • 输出:每个位置预测多个锚框(Anchor Boxes)的物体得分和边界框偏移量。
  • 锚框(Anchor Boxes):
    • 在特征图的每个位置预设不同尺度和长宽比的框(如3种尺度×3种长宽比=9个锚框)。
    • RPN判断锚框是否包含目标,并调整其位置。
  • 优点:
    • 速度快(GPU上约10ms生成候选框)。
    • 端到端训练,与检测网络共享特征。
  • 代表模型:Faster R-CNN。

② Mask R-CNN

  • 在Faster R-CNN基础上增加分割分支,生成更精确的候选区域(RoIAlign改进)。

③ Cascade R-CNN

  • 通过多级RPN逐步优化候选框质量,提高定位精度。


3、再次强调yolo缺陷

通过与Fast R-CNN的对比分析发现,YOLO在定 位精度方面存在显著误差。此外,相较于基于区域提议的方法,YOLO的召回率相对较低

1. 定位精度较低的原因

(1)网格划分的离散化误差

  • YOLO将图像划分为固定数量的网格(如7×7),每个网格负责预测目标。目标的中心点必须落在某个网格内才会被检测,而边界框的坐标是基于网格的相对偏移量预测的。这种离散化会导致:
    • 对小目标或密集目标的定位不精确:微小位置偏差会因网格分辨率不足而被放大。
    • 边界框回归的敏感性:YOLO直接预测边界框的宽高和中心坐标,但缺乏对区域细节的精细化处理(如R-CNN系列的多阶段微调)。

(2)单阶段检测的局限性

  • YOLO是单阶段(one-stage)检测器,直接回归边界框和类别,而Fast R-CNN是两阶段方法:
    • Fast R-CNN:先通过区域提议(如Selective Search或RPN)生成候选框(可能包含目标的区域),再对每个候选框进行精细化分类和回归。这种“粗选+精修”的流程能更准确定位。
    • YOLO:缺少显式的区域提议步骤,依赖网格的粗粒度预测,难以处理目标形状或尺度的剧烈变化。

(3)多任务学习的冲突

  • YOLO的损失函数同时优化分类、定位和置信度,定位误差(如中心点偏移)可能被其他任务(如分类)的梯度淹没,而Fast R-CNN通过分阶段训练缓解了这一问题。

召回率较低的原因

(1)网格划分的覆盖不足

  • YOLO的每个网格只能预测固定数量的目标(如2个),若多个目标中心点落在同一网格内,会导致漏检。而基于区域提议的方法(如Fast R-CNN)通过密集的候选框(约2000个/图像)覆盖更多潜在目标区域,显著提高召回率。

(2)背景与前景的区分能力

  • 基于区域提议的方法:通过候选框生成机制(如RPN)主动筛选可能包含目标的区域,减少背景干扰。
  • YOLO:依赖网格的全局推理,若目标尺寸过小或与背景对比度低,容易因置信度不足被过滤掉。

(3)对小目标的敏感性差

  • YOLO的深层特征图会丢失小目标的细节信息(尤其在早期版本中),而区域提议方法可能通过多尺度或滑动窗口保留小目标候选框。

4、创新点之一:批量归一化(BN)

批量归一化。批量归一化显著提升了模型的收敛速 度,同时无需采用其他形式的正则化[7]。通过在 YOLO的所有卷积层中应用批量归一化,我们实现了 超过2%的平均精度提升。批量归一化还能帮助模型进 行正则化。通过批量归一化,我们可以在不发生过拟 合的情况下移除模型中的dropout层。

1. 批量归一化(BN)是什么?

BN就是神经网络的“学习加速器”+“稳定器”:
批量归一化是一种对神经网络中间层的输入进行标准化的技术,由Ioffe & Szegedy在2015年提出。它的核心思想是:
  • 在每一层的输入前,对每个批(Batch)的数据进行归一化(均值为0,方差为1),再通过可学习的参数(缩放因子γ和偏移因子β)调整数据分布。
  • 公式:
image.png

2. 为什么BN能提升YOLOv2的收敛速度?

(1)缓解内部协变量偏移(Internal Covariate Shift)
  • 问题:深层网络中,每一层的输入分布会随着训练过程不断变化(因前层参数在更新),导致训练不稳定,学习率必须设得很小。
  • BN的作用:强制每层的输入分布稳定(均值为0,方差为1),使得网络可以更快收敛,允许使用更大的学习率。
(2)缓解梯度消失/爆炸
  • 归一化后的数据分布在激活函数(如ReLU)的敏感区间(如非饱和区),梯度传播更稳定。
(3)对初始化的依赖降低
  • 传统网络对权重初始化敏感(如Xavier初始化),而BN能自动调整数据分布,减少对初始化的依赖。

3. 为什么BN可以替代其他正则化(如Dropout)?

(1)BN本身具有轻微的正则化效果
  • 每个Batch的均值和方差是基于当前Batch样本估算的,相当于引入了噪声(类似Dropout的随机性),从而抑制过拟合。
  • 但BN的主要作用不是正则化,而是加速训练。
(2)YOLOv2中移除Dropout的原因
  • BN已经能稳定训练,且YOLOv2的网络结构较简单(相比大型分类网络如ResNet),过拟合风险较低。
  • Dropout会减少神经元的协同适应性,而BN能保持网络的表达能力,二者叠加可能反而影响性能。

5、创新点之二:高分辨率分类器

高分辨率分类器。目前最先进的检测方法都采用基于ImageNet [16]预训练的分类器。以AlexNet为例,大多数分类器处理的输入图像尺寸通常小于256×256[8]。而原始YOLO模型在224×224分辨率下训练分类器网络,随后将分辨率提升至448用于检测任务。这

意味着网络需要同时切换到学习对象检测并调整到新的输入分辨率。

针对YOLOv2模型,我们首先在ImageNet数据集上对448×448全分辨率下进行10轮分类网络训练。这种高分辨率输入能让网络有充足时间优化参数调整

1. 背景与现状

  • 传统方法:大多数基于ImageNet预训练的分类器(如AlexNet)使用的输入图像分辨率较低(通常小于256×256)。这是因为分类任务对细节的要求相对较低,且小尺寸图像能减少计算量。
  • YOLOv1的做法:原始YOLO先在224×224分辨率下训练分类器,然后在检测任务中将分辨率提高到448×448。这种突然的分辨率切换会导致两个问题:
    1. 网络需同时学习新任务:从分类切换到检测,任务复杂度增加。
    2. 分辨率跳跃:输入尺寸突然增大,网络需要额外适应高分辨率输入的特征分布。

2. YOLOv2的改进:高分辨率分类器

  • 直接训练高分辨率分类器:
    • YOLOv2直接在448×448分辨率下预训练分类网络(在ImageNet上训练10轮)。
    • 这种高分辨率输入让网络有充足时间调整滤波器(卷积核)、归一化参数等,适应更高分辨率的输入特征。
  • 优势:
    1. 特征提取更精细:高分辨率保留了更多细节,有利于检测小物体。
    2. 平滑过渡到检测任务:预训练后,网络已适应高分辨率输入,只需专注于学习检测任务(如边界框预测、对象分类),无需同时适应分辨率变化。
  • 效果:mAP提升近4%,验证了高分辨率预训练的有效性。

6、创新点之三:锚框

我们移除了YOLO的全连接层,改用锚框来预测边 界框。

一、锚框是什么?为什么要用它?

想象你在玩一个"找东西"的游戏:给你一张照片,让你把里面的物体都圈出来。YOLOv1的做法是直接把照片分成7×7的小格子,每个格子猜2个框框。这就像用固定的网格来套物体,效果不太好,特别是当物体大小形状差别很大时。
YOLOv2改进的方法就像先准备几个"模板框"(这就是锚框),然后根据这些模板调整位置和大小。就像你画画时先用几个基本形状打底稿,再修改成最终作品,比直接凭空画要容易多了。

二、锚框具体怎么工作的?

  1. 网络结构简化(把复杂变简单)
  • 原来的YOLOv1用全连接层(就像把所有信息打乱重排)来预测框框,现在改用全卷积(保持空间信息不变)。
  • 就像原来是把拼图打散再拼,现在是直接在原图上移动和调整框框。
  1. 图片尺寸调整(416×416的玄机)
  • 图片大小从448改成416,这样经过5次"缩小一半"后得到13×13的特征图(416÷32=13)。
  • 为什么是13不是14?因为13是奇数,能确定一个最中心的位置。大物体通常在图像中间,这样检测更准。
  1. 锚框预测的五个关键值
对每个锚框,网络预测:
  1. tₓ,t_y:框框中心点应该往右/往下移动多少(限制在0-1之间,不会跑出当前格子)
  2. t_w,t_h:框框宽度和高度应该放大/缩小多少(用指数计算,保证永远是正数)
  3. t_o:这里真的有物体的概率是多少(用sigmoid变成0-1之间的数)
公式看起来复杂,其实就像:
  • 中心点:原来位置 + 微调
  • 宽高:原来尺寸 × 放大系数
  • 置信度:判断这个框靠不靠谱
  1. 自动学习锚框尺寸(不用人工瞎猜)
  • 传统方法要人工设定锚框大小,YOLOv2用k-means聚类自动找出数据集中最常见的5种框尺寸。
  • 就像整理衣柜:把所有衣服(真实框)摊开,自动找出5种最常出现的尺寸(比如大衣、衬衫等),以后就主要用这几种尺寸来搭配。
  1. 位置预测的约束(防止框框乱跑)
  • 限制框中心必须在当前格子内(通过sigmoid函数)。
  • 就像给小孩画画规定"颜色不能涂出线外",这样学习更稳定。
  • 每个格子负责自己区域内的物体,分工明确。

三、这样做的好处

  1. 检测更多物体:从原来每图98个框增加到845个框(13×13×5),找到东西的概率更高。
  2. 适应不同形状:5种锚框覆盖不同大小和长宽比,能更好地框住胖的、瘦的、大的、小的各种物体。
  3. 学习更简单:
    • 预测"调整量"比直接猜坐标容易
    • 就像告诉你"把领带往右移一点"比直接说"领带应该在(123,456)位置"更容易理解
  4. 训练更稳定:
    • 限制移动范围防止初期乱猜
    • 像学自行车先用辅助轮,熟练了再放开

7、创新点之四:Darknet-19

Darknet-19 是 YOLOv2 的“骨架网络”(也叫主干网络),专门为检测任务设计的一个轻量又强大的特征提取器。它只有 19 层,比之前的网络(比如 VGG、ResNet)更小更快,但效果却更好!
  1. 为什么需要 Darknet-19?
YOLOv1 用的是 GoogLeNet(22 层)+ 自定义结构,但有两个问题:
  1. 速度不够快:GoogLeNet 计算量较大,影响实时性。
  2. 特征提取不够强:对小物体、复杂场景的检测效果一般。
所以 YOLOv2 决定自己设计一个更适合检测任务的网络 —— Darknet-19。

  1. Darknet-19 的核心特点

(1) 轻量化设计(19 层)

  • 只有 19 层卷积(比 VGG-16 还少),但用了更高效的模块。
  • 主要结构:3×3 卷积 + 1×1 卷积交替(减少计算量)。

(2) 批量归一化(Batch Normalization, BN)

  • 每一层卷积后都加 BN,让训练更稳定、收敛更快(mAP 直接涨 2%)。
  • 有了 BN,甚至可以去掉 Dropout(省事又高效)。

(3) 高分辨率适应(448×448 微调)

  • 先在 224×224 图像上训练分类任务(像普通 CNN 那样)。
  • 然后切换到 448×448 分辨率微调 10 个 epoch,让网络适应更高清的输入(提升检测精度)。

(4) 用全局平均池化代替全连接层

  • 传统网络(如 VGG)最后用全连接层,参数量巨大且容易过拟合。
  • Darknet-19 改用 Global Average Pooling(全局平均池化),直接把特征图压缩成类别概率,更轻量、更高效。

8、创新点之四:损失函数改进

  1. YOLOv1 损失函数回顾(对比基线)
YOLOv1 的损失函数像一锅"大杂烩",包含5个部分:
  1. 框的中心坐标误差(均方误差)
  2. 框的宽高误差(均方误差,但开根号处理)
  3. 有物体时的置信度误差(用交叉熵)
  4. 无物体时的置信度误差(权重较低)
  5. 分类误差(交叉熵)
问题:
  • 所有误差直接简单相加,没有合理权衡重要性
  • 对小框和大框的定位误差惩罚不平衡
  • 正负样本(有物体/无物体)严重不均衡(比如98个预测框里可能只有几个有物体)

改进1:坐标预测从"猜位置"变成"微调位置"

  • YOLOv1:直接让网络猜框的精确坐标(类似让你凭空说"苹果在(123,456)位置")
    • 问题:数字太大难学习,容易猜错
  • YOLOv2:改成对锚框做微调(类似告诉你"把模板框往右移10%,高度拉长20%")
    • 实际做法:
      • 中心点预测:用sigmoid限制移动范围(不让框跑出当前格子)
      • 宽高预测:计算缩放比例(取对数保证永远是正数)
    • 好处:就像用修正带改错字,比重新写一整句话简单多了!

改进2:置信度打分从"考试评分"变成"判断题"

  • YOLOv1:用均方误差(类似考试打分,59分和60分差别不大但一个挂科一个及格)
  • YOLOv2:改用二元交叉熵(直接判断"有物体"或"没物体")
    • 公式:-log(p)当有物体,-log(1-p)当没物体
    • 好处:像判断题,对就是对错就是错,网络学得更明确
    • 额外技巧:给"没物体"的情况降低权重(避免简单负样本主导训练)

改进3:分类从"单选"变成"多选"

  • YOLOv1:用softmax(类似单选题,假设"狗"和"猫"不能同时存在)
  • YOLOv2:改用多标签分类(类似多选题,"狗"+"动物"可以同时选)
    • 实现方式:对每个类别独立用sigmoid输出概率
    • 好处:能处理现实中的层级关系(比如"柯基"既是"狗"也是"动物")

改进4:给不同任务分配"学习精力"

YOLOv2 像聪明的学生,会重点学习薄弱环节:
  1. 坐标预测:权重×5(重点练)
  2. 无物体的置信度:权重×0.5(随便练练)
  3. 分类任务:训练后期才加大权重(先学定位再学分类)
类比:就像考研复习:
  • 数学差就多刷数学题(坐标损失权重高)
  • 政治随便看看(无物体损失权重低)
  • 英语后期冲刺(分类损失后期加强)