
1. 目标检测的“前YOLO时代”为什么我们需要“只看一次”如果你在2015年之前想用计算机视觉技术从一张图片里找出“有什么东西”以及“东西在哪”那感觉就像是用一把放大镜一寸一寸地扫描整张报纸只为找几个特定的词。没错这就是当时主流目标检测方法的真实写照。我最早接触这个领域时用的就是R-CNN系列那种等待一个结果需要好几秒甚至十几秒的焦灼感至今记忆犹新。当时的核心思路可以概括为“分而治之再合而审之”。具体来说流程大致是这样的首先你需要一个“区域提议”算法比如Selective Search在图像上生成成百上千个可能包含物体的候选框。这个过程本身就很耗时因为它基于颜色、纹理等底层特征进行分割和合并。然后每个候选框都被裁剪出来统一缩放到固定尺寸再塞进一个庞大的卷积神经网络比如AlexNet里进行分类判断它到底属于“猫”、“狗”还是“背景”。最后还要对分类结果和框的位置进行微调。Faster R-CNN虽然通过引入RPN网络将区域提议步骤集成到网络中大大提升了效率但本质上它仍然是一个“两阶段”检测器先找出一堆可能的位置再对这些位置进行精细判断。这就带来了一个根本性的效率瓶颈图像中的许多像素在不同的候选框里被重复提取了无数次特征。想象一下一张图片背景里的大片天空几乎出现在每一个候选框中而卷积网络却要对这片天空进行成千上万次完全相同的卷积计算这无疑是巨大的计算浪费。更关键的是这种串行化的流程提议-分类严重限制了检测速度的进一步提升。Faster R-CNN在当时的顶级硬件上也只能做到每秒5帧200毫秒一帧这距离“实时”通常指每秒30帧以上还有着巨大的鸿沟。对于自动驾驶、视频监控、机器人交互等需要即时响应的应用场景来说这种延迟是完全不可接受的。所以当Joseph Redmon等人在2015年抛出“You Only Look Once”这个口号时对整个领域来说不啻于一记惊雷。它的核心思想极其大胆且直观为什么不把目标检测重新定义为一个单一的回归问题呢让神经网络只对图像做一次前向传播就直接输出所有边界框的位置和类别概率。这个想法直指当时两阶段方法的效率痛点旨在彻底消除冗余计算。从“看很多次”到“只看一次”这不仅仅是速度的提升更是一种设计哲学的根本转变。接下来我们就深入YOLO的初代模型看看这个革命性的想法是如何落地的。2. YOLOv1开山之作的朴素与智慧YOLOv1的论文标题《You Only Look Once: Unified, Real-Time Object Detection》已经清晰地宣告了它的野心统一、实时。它的设计在今天看来有些“简单粗暴”但正是这种简洁性奠定了整个系列的基石。2.1 核心思想将图像视为一个网格系统YOLOv1的第一步是将输入的整张图像论文中为448x448划分为一个S x S的网格原文中S7。这个7x7的网格就是整个检测系统的坐标系基础。每个网格单元格负责预测什么这是理解YOLOv1的关键。每个单元格需要预测两件事B个边界框每个框预测5个值(x, y, w, h, confidence)。(x, y)边界框中心相对于该单元格自身左上角的偏移量值在0到1之间。这意味着网络学习的是框在单元格内的相对位置。(w, h)边界框的宽度和高度相对于整张图片尺寸的归一化值。这是为了尺度不变性。confidence置信度这个值有两重含义。一是“这个框里含有物体的概率”Pr(Object)二是“这个框预测得准不准”与真实框的IoU即交并比。在公式上置信度被定义为 Pr(Object) * IoU(truth|pred)。如果单元格里没有物体中心那么这个置信度理想值应为0。C个条件类别概率即 Pr(Class_i | Object)。注意这是条件概率前提是这个单元格里有物体。无论一个单元格预测多少个边界框B个它只预测一组类别概率这组概率被所有B个框共享。所以对于一个7x7的网格每个网格预测2个框和20个VOC类别概率最终的输出张量就是 7 x 7 x (2*5 20) 7 x 7 x 30。这个30维的向量就编码了该单元格的所有预测信息。为什么是7x7的奇数网格这是一个非常实用的设计细节。作者指出图片的中心往往是主要物体如人脸、汽车最可能出现的位置。使用奇数网格如7x7会有一个明确的中心单元格第4行第4列。如果使用偶数网格如8x8中心点就会落在四个单元格的交界处导致“中心物体”的责任由四个单元格共同承担这会降低网络预测的置信度增加训练的不稳定性。这个细节体现了YOLO设计中对实际数据分布的考量。2.2 网络架构基于GoogLeNet的快速特征提取YOLOv1的骨干网络借鉴了GoogLeNet的Inception模块思想但采用了更简单的串联卷积层和池化层结构。它包含24个卷积层和2个全连接层。最后的全连接层负责输出那个7x7x30的预测张量。这里有一个容易被忽略但至关重要的点YOLOv1在ImageNet数据集上先以224x224的分辨率预训练分类任务的前20层卷积层。预训练完成后在这20层后面添加4个卷积层和2个全连接层并将输入分辨率切换到448x448进行目标检测任务的微调。这种“先在分类任务上学通用特征再在检测任务上微调”的策略成为了深度学习模型训练的标配有效缓解了数据不足的问题。2.3 损失函数一个多任务学习的权衡艺术YOLO的损失函数是它工作的核心驱动力也是一个充满权衡的设计。它需要同时优化边界框坐标、置信度和类别概率。总损失函数是五个部分的加权和Loss λ_coord * ∑(坐标误差) λ_obj * ∑(有物体时的置信度误差) λ_noobj * ∑(无物体时的置信度误差) ∑(类别概率误差)坐标损失只对负责预测物体的那个边界框与真实框IoU最大的那个计算。使用均方误差MSE计算中心点(x, y)和宽高(w, h)的误差。注意对宽高误差取了平方根这是为了缓解大框和小框在误差上的不平衡。同样偏移10个像素对于一个小框来说是致命错误对于一个大框则影响轻微。取平方根后小框的误差会被相对放大让网络更关注小物体的定位精度。置信度损失使用二元交叉熵。这里的关键是图片中大部分网格是没有物体的负样本。如果对正负样本一视同仁负样本的梯度会淹没正样本的信号。因此论文设置了λ_coord5来增强坐标损失的重要性并设置λ_noobj0.5来降低没有物体网格的置信度损失权重。这是一个非常关键的训练技巧。类别损失同样使用交叉熵但只对包含物体中心的那个网格进行计算。2.4 推理与NMS从密集预测到稀疏输出网络前向传播一次会输出7x7x298个边界框。显然绝大多数框的置信度会很低对应背景。我们首先用一个阈值如0.2过滤掉低置信度的框。但过滤后对于同一个物体相邻的多个网格可能都预测出了重叠度很高、且置信度都不错的框。这时就需要非极大值抑制NMS来去重。其过程是将所有框按置信度从高到低排序。取出置信度最高的框放入最终输出列表。计算这个框与剩余所有框的IoU。剔除所有IoU超过某个阈值如0.5的框因为它们很可能是对同一个物体的重复检测。在剩余的框里重复上述过程直到没有框剩下。经过NMS我们最终得到的就是干净、稀疏的检测结果。2.5 YOLOv1的得与失革命性的速度与明显的短板优势是颠覆性的极致的速度在Titan X GPU上达到45 FPS其简化版Fast YOLO甚至达到155 FPS真正实现了实时检测。全局推理由于看到整张图再做预测相比基于滑动窗口或区域提议的方法对背景的误检False Positive更少。因为它有更多的上下文信息来判断某个区域是否是背景。更强的泛化能力当在自然图像上训练应用到艺术画作上进行检测时YOLO的性能下降远小于当时的R-CNN系列表明其学到的特征更具通用性。局限性也同样突出这些短板驱动了后续版本的演进空间粒度粗7x7的网格划分太粗糙每个网格只能预测两个框和一组类别。这导致模型对成群出现的小物体检测能力极差如鸟群、人群因为多个小物体的中心很可能落入同一个网格而该网格只能预测一个主导物体。定位精度相对较低边界框的预测比较“随意”尤其是对于不常见的长宽比物体。这直接导致了mAP平均精度均值指标上YOLOv1落后于更精巧的Faster R-CNN。损失函数的设计缺陷虽然取了平方根但坐标损失尤其是宽高损失对大框和小框的惩罚仍然不平衡。同时一个网格只能预测一个类别的限制也影响了在密集场景下的表现。尽管有这些不足YOLOv1证明了“单阶段、端到端回归”这条路的可行性其简洁和高效为后续研究打开了大门。接下来我们看YOLOv2/v9000如何针对这些短板进行“补课”。3. YOLOv2 (YOLO9000)更好、更快、更强YOLOv2的论文副标题“Better, Faster, Stronger”精准概括了它的目标。它不是对v1的推倒重来而是一系列精妙改进的集合这些改进很多都成为了目标检测领域的标准技术。3.1 核心改进一更稳定的训练与更好的特征批量归一化Batch Normalization, BN这是YOLOv2提升最大的改进之一。作者在所有的卷积层后面都添加了BN层并移除了Dropout。BN通过规范化每一层的输入分布极大地加速了训练收敛提升了模型稳定性和最终精度。它还有一定的正则化效果因此可以替代Dropout。高分辨率分类器YOLOv1先在224x224上预训练然后在448x448上微调。YOLOv2则直接在448x448分辨率上预训练分类网络10个epoch让网络提前适应高分辨率输入然后再在检测任务上微调。这个简单的改动带来了近4%的mAP提升。卷积化与锚框Anchor BoxesYOLOv1最后用了全连接层来预测张量这破坏了空间信息。YOLOv2移除了全连接层改用全卷积网络。同时借鉴了Faster R-CNN的“锚框”思想。锚框就是一组预先定义好的、不同大小和长宽比的基准框。网络不再直接预测框的绝对坐标而是预测相对于这些锚框的偏移量。例如输出不再是(x, y, w, h)而是(tx, ty, tw, th)通过公式与锚框的坐标(ax, ay, aw, ah)计算得到最终框bx σ(tx) cxby σ(ty) cybw aw * e^(tw)bh ah * e^(th)其中(cx, cy)是网格左上角坐标σ是sigmoid函数将偏移限制在0到1之间确保框中心不会跑出当前网格。这个设计让定位学习变得更容易、更稳定。维度聚类Dimension ClustersFaster R-CNN的锚框大小和比例是手动选择的。YOLOv2提出用k-means聚类在训练集的真实框上自动学习出更好的锚框先验。更妙的是它没有使用欧氏距离而是使用d(box, centroid) 1 - IoU(box, centroid)作为距离度量这使得聚类结果直接与IoU指标挂钩。实验发现使用5个聚类先验框就能达到Faster R-CNN手动设计9个锚框的召回率在复杂度和性能间取得了平衡。3.2 核心改进二多尺度与细粒度特征细粒度特征Fine-Grained Features为了改进小物体检测YOLOv2引入了直通层Passthrough Layer。它将前面某个较浅层26x26分辨率的特征图通过重组将相邻空间位置的特征堆叠到通道维度的方式与深层特征图13x13进行拼接。这相当于把高分辨率的细节特征“带”到了深层让网络在拥有高层语义信息的同时也能利用浅层的细节信息显著提升了对小物体的检测能力。多尺度训练Multi-Scale Training由于网络是全卷积的可以适应不同尺寸的输入。YOLOv2在训练时每10个批次就随机改变一次输入图像的尺寸从{320, 352, ..., 608}这个32的倍数集合中随机选择。这让模型学会了在不同分辨率下进行鲁棒预测。在测试时你可以根据需要选择不同大小的输入用小尺寸获得高速度用大尺寸获得高精度。3.3 骨干网络革新Darknet-19为了进一步提升速度YOLOv2设计了新的骨干网络Darknet-19。它比YOLOv1基于的GoogLeNet以及当时流行的VGG-16更轻量、更高效。Darknet-19包含19个卷积层和5个最大池化层大量使用了3x3卷积和1x1卷积来减少参数量。它在ImageNet上达到72.9%的top-1准确率但速度远超VGG-16。3.4 YOLO9000弱监督下的海量类别检测这是YOLOv2最雄心勃勃的部分。作者想检测超过9000个类别但根本没有这么多带边界框标注的数据。他们的解决方案是联合训练同时使用检测数据集有精确的框标注如COCO、Pascal VOC和分类数据集只有图像类别标签如ImageNet。技术核心是WordTree利用WordNet一个英语词汇语义关系数据库构建一个层次化的标签树。例如“狗”和“猫”都是“哺乳动物”的子节点“哺乳动物”又是“动物”的子节点。在预测时网络不再做一个巨大的softmax而是沿着树路径做一系列条件softmax。例如先预测是“动物”的概率再预测是“哺乳动物”的概率最后预测是“狗”的概率。这样模型可以从检测数据中学到“定位”从海量分类数据中学到“细粒度分类”实现了知识的迁移。YOLO9000在ImageNet检测任务上可以检测9418个类别虽然对未见过的类别定位精度一般但证明了弱监督学习在大规模检测上的潜力。YOLOv2的成果通过这一系列改进YOLOv2在Pascal VOC 2007上达到了78.6 mAP同时保持67 FPS的速度在更苛刻的COCO数据集上也表现优异。它真正做到了在精度和速度上都成为当时的领先者。4. YOLOv3迈向成熟的工业级基线YOLOv3的论文标题非常谦逊——《An Incremental Improvement》一个渐进式的改进。但它带来的改进是系统性的使得YOLOv3成为一个极其强大、稳定且被广泛采用的工业级模型其影响力持续多年。4.1 骨干网络再升级Darknet-53YOLOv3引入了全新的骨干网络Darknet-53。它借鉴了ResNet的残差连接思想解决了深层网络梯度消失的问题但设计上更加高效。结构由53个卷积层组成1x1和3x3卷积交替包含大量的残差块。性能在ImageNet分类任务上Darknet-53与当时更深、更复杂的ResNet-152精度相当但速度是其2倍以上。这得益于其更优的GPU计算效率更高的BFLOP/s即每秒十亿次浮点运算。作用更强的骨干网络为检测头提供了更丰富、更鲁棒的特征是精度提升的根本保障。4.2 多尺度预测融合FPN思想这是YOLOv3对小物体检测最关键的改进。YOLOv2只有一个尺度的预测13x13。YOLOv3引入了特征金字塔网络FPN的思想在三个不同尺度的特征图上进行预测深层特征图下采样32倍如13x13感受野大适合检测大物体。中层特征图下采样16倍如26x26通过将深层特征图上采样并与中层特征图拼接得到适合检测中物体。浅层特征图下采样8倍如52x52通过进一步上采样和拼接得到保留了丰富的细节专门用于检测小物体。每个尺度的特征图都对应一个检测头负责预测该尺度下最可能出现的物体。每个网格单元预测3个锚框v2是5个所以三个尺度总共预测 13x13x3 26x26x3 52x52x3 10647个框这大大增强了对不同大小物体尤其是小物体的检测能力。4.3 分类与置信度预测的改进独立的逻辑回归分类器YOLOv3放弃了Softmax改为对每个类别使用独立的二元逻辑回归分类器。在训练时使用二元交叉熵损失。这样做有两个好处一是可以更好地处理多标签问题一个物体可能同时属于多个类别如“女人”和“行人”二是在数据集类别有重叠时如“人”和“女人”Softmax的互斥假设会带来问题而独立分类器则没有这个限制。置信度预测对象置信度框中是否有物体也改用逻辑回归预测训练时同样使用二元交叉熵。对于每个真实物体只分配一个“最佳”锚框与真实框IoU最大且大于阈值作为正样本其他锚框则忽略其置信度损失。这比v1/v2的分配策略更清晰。4.4 锚框聚类与损失函数YOLOv3在COCO数据集上使用k-means距离度量仍为1-IoU重新聚类了9个锚框并按尺度分配给三个预测层大尺度锚框给浅层特征图小尺度锚框给深层特征图。损失函数基本延续v2的框架但对坐标损失进行了微调不再使用平方根而是直接预测宽高的对数偏移并使用均方误差。4.5 YOLOv3的遗产与未竟之业YOLOv3发布后迅速成为工业界和学术界的宠儿。它在精度COCO AP50指标上媲美当时最先进的单阶段检测器RetinaNet和速度在Titan X上处理608x608图像可达20 FPS之间取得了极佳的平衡。其代码简洁、依赖少、易于部署催生了无数基于它的改进和应用。YOLOv3也尝试了一些未成功的方法这些“失败”的经验同样宝贵尝试用线性激活代替逻辑激活来预测边界框坐标偏移效果变差证明了sigmoid约束的必要性。尝试使用Focal Loss一种解决正负样本不平衡的损失函数结果mAP下降了2个点。作者认为这是因为YOLOv3的样本分配策略和二元交叉熵已经较好地处理了不平衡问题。尝试Faster R-CNN中基于双IoU阈值的正负样本分配策略0.7为正0.3为负中间忽略效果不佳说明YOLO的单阶段密集预测机制需要不同的样本分配策略。YOLOv3标志着YOLO系列从一个“快速但粗糙”的模型成长为一个“快速且精准”的成熟解决方案。它确立的“高效骨干网络Darknet 多尺度特征金字塔预测”的范式深刻影响了后续几乎所有单阶段检测器的发展。从v1到v3我们可以清晰地看到一条技术演进主线从追求极致的速度到兼顾精度与速度的平衡再到通过更强大的特征提取和多尺度融合实现对各种场景尤其是小物体的稳健检测。每一次改进都直指前一代的痛点用工程上的巧思和扎实的实验一步步将“You Only Look Once”的理念推向极致。