YOLO v2(2016):又叫YOLO9000,更快更好更强,引入Anchor机制
1、摘要
通过采用一种新颖的多尺度训练方法,同一 YOLOv2模型可在不同分辨率下运行,实现了速度与 精度之间的灵活平衡。在67帧/秒时,YOLOv2在VOC 2007数据集上获得76.8 mAP;在40帧/秒时,其 mAP提升至78.6
- 核心思想:像“可伸缩的放大镜”
- 放大镜调大(高分辨率):看得更清楚(精度高),但移动速度慢(计算慢,帧率低)。
- 放大镜调小(低分辨率):看得快(速度快,帧率高),但可能漏掉细节(精度略低)。
最后,我们提出了一种联合训练目标检测与分类 的方法。基于此方法,我们在COCO检测数据集和 ImageNet分类数据集上同步训练YOLO9000。我们 的联合训练方法使YOLO9000能够对缺乏标注数据的 物体类别进行检测预测。我们在ImageNet检测任务 上验证了该方法的有效性:尽管仅拥有200个类别中 44类的检测数据,YOLO9000在ImageNet验证集上 仍取得了19. 7的平均精度(mAP)。对于COCO未收 录的156个类别,其mAP值达到16.0。值得注意的 是,YOLO不仅能识别200多个类别,还能对超过 9000种不同物体类别进行预测,且全程保持实时运行 能力。
- 核心问题:标注数据不够怎么办?
- 目标检测(比如框出图中的狗)需要大量标注数据(画框+标签)。
- 分类任务(比如判断图片是猫还是狗)的标注更容易获得(只需标签,不用画框)。
- 联合训练:让检测模型“一箭双雕”
- 同时喂两种数据:
- 检测数据(带框的图,如COCO):教模型“框物体+认类别”。
- 分类数据(仅标签的图,如ImageNet):教模型“认更多类别”。
- 共享大部分网络:两种任务共用同一个特征提取器(Darknet-19),只有最后几层分开学。
2、区域提议介绍
什么是区域提议(Region Proposal)?
- 减少计算量:避免对整张图像的所有位置进行密集扫描。
- 提高召回率:确保尽可能多的真实目标被候选框覆盖。
区域提议的实现方法
(1)传统方法(非深度学习)
① 滑动窗口(Sliding Window)
- 在图像上以不同尺度和长宽比滑动固定大小的窗口,生成大量候选框。
- 缺点:计算量大,冗余框多。
② Selective Search
- 基于图像的低级特征(颜色、纹理、边缘等)进行层次化区域合并,生成候选框。
- 步骤:
- 初始化:将图像分割成许多小区域(超像素)。
- 计算区域相似度(颜色、纹理、大小等)。
- 合并最相似的区域,直到整张图像合并为一个区域。
- 在合并过程中记录所有可能的候选框。
- 优点:比滑动窗口更高效,召回率较高。
- 缺点:仍然是启发式方法,计算较慢(约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)是什么?
- 在每一层的输入前,对每个批(Batch)的数据进行归一化(均值为0,方差为1),再通过可学习的参数(缩放因子γ和偏移因子β)调整数据分布。
- 公式:
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。这种突然的分辨率切换会导致两个问题:
- 网络需同时学习新任务:从分类切换到检测,任务复杂度增加。
- 分辨率跳跃:输入尺寸突然增大,网络需要额外适应高分辨率输入的特征分布。
2. YOLOv2的改进:高分辨率分类器
- 直接训练高分辨率分类器:
- YOLOv2直接在448×448分辨率下预训练分类网络(在ImageNet上训练10轮)。
- 这种高分辨率输入让网络有充足时间调整滤波器(卷积核)、归一化参数等,适应更高分辨率的输入特征。
- 优势:
- 特征提取更精细:高分辨率保留了更多细节,有利于检测小物体。
- 平滑过渡到检测任务:预训练后,网络已适应高分辨率输入,只需专注于学习检测任务(如边界框预测、对象分类),无需同时适应分辨率变化。
- 效果:mAP提升近4%,验证了高分辨率预训练的有效性。
6、创新点之三:锚框
我们移除了YOLO的全连接层,改用锚框来预测边 界框。
一、锚框是什么?为什么要用它?
二、锚框具体怎么工作的?
- 网络结构简化(把复杂变简单)
- 原来的YOLOv1用全连接层(就像把所有信息打乱重排)来预测框框,现在改用全卷积(保持空间信息不变)。
- 就像原来是把拼图打散再拼,现在是直接在原图上移动和调整框框。
- 图片尺寸调整(416×416的玄机)
- 图片大小从448改成416,这样经过5次"缩小一半"后得到13×13的特征图(416÷32=13)。
- 为什么是13不是14?因为13是奇数,能确定一个最中心的位置。大物体通常在图像中间,这样检测更准。
- 锚框预测的五个关键值
- tₓ,t_y:框框中心点应该往右/往下移动多少(限制在0-1之间,不会跑出当前格子)
- t_w,t_h:框框宽度和高度应该放大/缩小多少(用指数计算,保证永远是正数)
- t_o:这里真的有物体的概率是多少(用sigmoid变成0-1之间的数)
- 中心点:原来位置 + 微调
- 宽高:原来尺寸 × 放大系数
- 置信度:判断这个框靠不靠谱
- 自动学习锚框尺寸(不用人工瞎猜)
- 传统方法要人工设定锚框大小,YOLOv2用k-means聚类自动找出数据集中最常见的5种框尺寸。
- 就像整理衣柜:把所有衣服(真实框)摊开,自动找出5种最常出现的尺寸(比如大衣、衬衫等),以后就主要用这几种尺寸来搭配。
- 位置预测的约束(防止框框乱跑)
- 限制框中心必须在当前格子内(通过sigmoid函数)。
- 就像给小孩画画规定"颜色不能涂出线外",这样学习更稳定。
- 每个格子负责自己区域内的物体,分工明确。
三、这样做的好处
- 检测更多物体:从原来每图98个框增加到845个框(13×13×5),找到东西的概率更高。
- 适应不同形状:5种锚框覆盖不同大小和长宽比,能更好地框住胖的、瘦的、大的、小的各种物体。
- 学习更简单:
- 预测"调整量"比直接猜坐标容易
- 就像告诉你"把领带往右移一点"比直接说"领带应该在(123,456)位置"更容易理解
- 训练更稳定:
- 限制移动范围防止初期乱猜
- 像学自行车先用辅助轮,熟练了再放开
7、创新点之四:Darknet-19
- 为什么需要 Darknet-19?
- 速度不够快:GoogLeNet 计算量较大,影响实时性。
- 特征提取不够强:对小物体、复杂场景的检测效果一般。
- 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、创新点之四:损失函数改进
- YOLOv1 损失函数回顾(对比基线)
- 框的中心坐标误差(均方误差)
- 框的宽高误差(均方误差,但开根号处理)
- 有物体时的置信度误差(用交叉熵)
- 无物体时的置信度误差(权重较低)
- 分类误差(交叉熵)
- 所有误差直接简单相加,没有合理权衡重要性
- 对小框和大框的定位误差惩罚不平衡
- 正负样本(有物体/无物体)严重不均衡(比如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:给不同任务分配"学习精力"
- 坐标预测:权重×5(重点练)
- 无物体的置信度:权重×0.5(随便练练)
- 分类任务:训练后期才加大权重(先学定位再学分类)
- 数学差就多刷数学题(坐标损失权重高)
- 政治随便看看(无物体损失权重低)
- 英语后期冲刺(分类损失后期加强)