标签 :目标检测 YOLO 深度学习 计算机视觉 算法
摘要:在YOLO横空出世之前,目标检测领域一直被R-CNN系列(Two-stage)统治。YOLO(You Only Look Once)将检测任务巧妙转化为回归问题,实现了端到端的实时检测。本文将从核心思想、网络架构、7×7×30张量解构、独树一帜的损失函数设计等维度,带你彻底吃透YOLOv1。
一、 背景:为什么我们需要YOLO?
在YOLOv1提出之前,经典的目标检测方法主要分为两类:
-
Two-stage(两阶段):如R-CNN, Faster-RCNN。先生成候选区域(Region Proposals),再对候选区域进行分类和回归。优点是准确率高,缺点是速度极慢(通常只有5 FPS),无法满足实时性。
-
One-stage(单阶段):如YOLO系列。摒弃了候选框生成步骤,直接通过一个神经网络输入图像,输出目标的类别和位置。YOLOv1在当年Titan X GPU上能达到惊人的 45 FPS。
二、 核心思想:网格划分法 (Grid Cell)
YOLOv1将输入图像划分为 S×S 的网格(在V1中 S=7)。
核心规则 :如果某个物体(Object)的中心点落在某个网格内,那么这个网格就负责预测这个物体。
每个网格单元需要预测:
-
B个Bounding Box(在V1中 B=2)。每个框包含5个参数:(x,y,w,h,confidence)。
-
C个类别概率(在PASCAL VOC数据集中 C=20)。
7×7×30 张量是如何得来的?
输入图像经过CNN后,最终输出一个 7×7×30 的张量(Tensor)。
为什么是30?
-
2个预测框,每个框5个参数(坐标4个 + 置信度1个):2×5=10
-
数据集的类别数:20。
-
总计:10+20=30
参数含义:
-
(x,y):预测框中心点相对于当前网格边界的偏移量,被归一化到 0∼1 之间。
-
(w,h):预测框的宽高相对于整张图像宽高的比例,归一化到 0∼1。
-
confidence:置信度。计算公式为 Pr(object)∗IoUpredtruth。如果格子内有物体,Pr(object)=1,此时置信度就等于预测框和真实框的IoU;如果没有物体,置信度为0。
三、 网络架构:借鉴GoogLeNet
YOLOv1的网络结构借鉴了GoogLeNet,但做出了修改:
-
24个卷积层:大量使用 1×1卷积(用于跨通道特征整合降维),紧跟 3×3 卷积(用于特征提取)。取消了Inception模块,改为简单的串联。
-
2个全连接层:负责将特征图映射到 7×7×30的输出。
四、 独树一帜的损失函数
YOLOv1的损失函数非常具有艺术性,它试图让坐标、置信度、分类三个方面的误差达到完美平衡。损失函数分为三大块:
-
位置误差(坐标预测):
-
对于 x,y 的预测:计算 (x−x^)2+(y−y^)2
-
对于 w,h 的预测:计算 √(w−w^)2+√(h−h^)2。
-
重点扩展:为什么开根号? 对于大物体,预测框稍微大一点,在视觉上没什么影响;但对于小物体,同样的宽高误差会导致IoU剧烈下降。开根号可以拉平这种差异,让模型对小目标的坐标预测更加敏感。
-
权重系数:λcoord=5(放大坐标损失)。
-
-
置信度误差(Confidence):
-
包含物体的框:(C−C^)2。
-
不包含物体的框:λnoobj∗(C−C^)2。
-
重点扩展:为什么要有 λnoobj? 一张图最多只有几个物体,但 7×7×2=98 个预测框中,绝大多数都是没有物体的背景。如果不加限制,模型会倾向于把所有框的置信度都预测为0。因此设定 λnoobj=0.5,降低背景的损失权重。
-
-
分类误差:
- 只在包含物体的网格上计算:∑(p(c)−p^(c))2。
五、 YOLOv1 的局限性
-
重叠问题:每个网格只能预测一个类别。如果一群鸟或者两只狗的中心的落在同一个格子,模型只能检测出其中一个。
-
小目标检测弱:由于只有 7×7 的网格,特征图分辨率太粗,且没有多尺度融合。
-
泛化能力:对长宽比不常见的物体,泛化能力较弱。