YOLOv1 论文简要

没写完,后续更新

YOLOv1 论文📃传送门🚪:《You Only Look Once: Unified, Real-Time Object Detection》👈快戳我🥵

介绍

YOLO 已经成为目前最热门🔥🔥🔥的目标检测算法之一,虽然 YOLO 的作者在写完 YOLOv3 后,便停止了开发,但由于 YOLO 的卓越性能和创新性,吸引了不少企业、研究院对 YOLO 的改进,使得 YOLO 已经子孙满堂,玩出花🪷来了。但本文的重心依然是 YOLOv1

YOLO 的全名是 You Only Look Once,你只需要看一次。在 YOLO 中,我们将目标检测看作为一个回归问题,所以只需要在图片上"看"一次,就可以获取目标的所有边界框和类别。也正因将检测视为回归问题,所以 YOLO 的速度非常快。并且,由于不需要复杂的流程,测试时只需要在图片上简单的运行的神经网络就可以来预测检测

好了好了,下面来粗略瞅瞅 YOLOv1 都干了啥吧

在上图中,我们经历了以下操作:

  1. 调整图片大小,将输入图片大小调整为 448×448
  2. 将图片放入卷积网络运行
  3. 根据模型输出的置信度对结果进行非极大值抑制(NMS)

然后,再来欣赏下 YOLO 的魔力🪄吧(虽然 YOLO 在艺术品和自然图像上的运行结果中,它将人误检成了飞机,但它大部分上是准确的)

概念梳理

先不急,在谈 YOLO 是如何检测目标之前,先来解释一下 IOU、置信度、非极大值抑制(NMS)的概念💡。当然,倘若阁下对此早已了然于胸,那么也可以跳过这部分内容

IOU

IOU(交并比,intersection over union),交并比嘛,顾名思义咯,就是描述集合A与集合B的交集与并集之比的一个数值🔢
<math xmlns="http://www.w3.org/1998/Math/MathML" display="block"> I O U = A ∩ B A ∪ B IOU = \frac{A\cap B}{A\cup B} </math>IOU=A∪BA∩B

IOU 可以描述两个框的重合度,它们的 IOU 等于两个框重合部分的面积除以它们合并起来的面积。在 YOLO 中,IOU 可以描述模型预测框与实际框之间的重合度

在上图中,"交集"中青色区域是两个框的重合部分,"并集"中蓝色区域是两个框的相并部分。"交集"除以"并集"即可得到它们之间的 IOU

置信度

置信度(confidence)表示预测框与实际边界框之间的 IOU,即 <math xmlns="http://www.w3.org/1998/Math/MathML"> c o n f i d e n c e = P r ( O b j e c t ) ∗ I O U p r e d t r u t h confidence = Pr(Object)*IOU^{truth}_{pred} </math>confidence=Pr(Object)∗IOUpredtruth。 <math xmlns="http://www.w3.org/1998/Math/MathML"> P r ( O b j e c t ) Pr(Object) </math>Pr(Object) 为是否有目标,有就为1,没就是0。

置信度反映了该模型对预测框的准确程度。在设置标签时,如果该单元格中存在目标,则置信度应为1(因为有目标, <math xmlns="http://www.w3.org/1998/Math/MathML"> P r ( O b j e c t ) = 1 Pr(Object) = 1 </math>Pr(Object)=1,并且我们希望预测框与实际边界框完全重合, <math xmlns="http://www.w3.org/1998/Math/MathML"> I O U p r e d t r u t h = 1 IOU^{truth}_{pred} = 1 </math>IOUpredtruth=1)。如果该单元格中不存在目标,置信度应该为0。在测试时,当置信度输出为1,说明预测框与实际边界框完全重合,这是再理想不过🌈的,但如果置信度为0,那就寄了,懂吧😧😧😧

于是乎,这里有一个问题🫤⁉️,既然置信度是预测框与实际边界框之间的 IOU,那么在测试的时候可没有实际边界框来让我们计算 <math xmlns="http://www.w3.org/1998/Math/MathML"> I O U p r e d t r u t h IOU^{truth}_{pred} </math>IOUpredtruth 噢!吾当如何?🤔主公莫怕!且听臣下细细道来。因为我们将置信度设置为了标签,所以训练的过程中,模型会不断的学习置信度的规则,使得模型最终输出的就是置信度

既然说了这么多,这里再插一嘴,提一提🫴置信度分数(confidence scores)。在测试的时候,模型会输出一堆的预测框,但并不是每个都有用的,所以需要进行筛选。至于筛选的依据是什么,这不就来咯------👉置信度分数👈

在上图中, <math xmlns="http://www.w3.org/1998/Math/MathML"> P r ( C l a s s i ) Pr(Class_{i}) </math>Pr(Classi) 表示类别的概率,IOU 的就不必多言了。so?置信度分数=类别概率×置信度预测值

非极大值抑制

置信度分数是为了筛选预测框而存在的,巧了🫡,NMS(非极大值抑制,Non-Maximum Suppression)也是为了筛选预测框而存在的。非极大值抑制,顾名思义,不是最大的值就要抑制了。在依据置信度分数进行初步筛选后,可能会出现如下图所示的尴尬😅的情况

图中,目标是车🚙,但这里却有3个预测框,该如何进一步的筛选,吾又当如何?😨主公莫怕!有上将 NMS,定可斩杀冗余预测框,取得目标最终预测框。NMS 的步骤其实蛮简单,排序、比较、筛选、重复以上步骤

  • 排序: 对于所有的预测框按照置信度分数进行排序
  • 比较: 选出置信度分数最大的预测框作为标准,将剩余的预测框与这一标准比较
  • 筛选: 若二者的 IOU(重合度)高于阈值,则去除这一预测框

在上图中,对橙框🟧、蓝框🟦、绿框🟩根据置信度分数排序,得 [🟧0.9, 🟦0.8, 🟩0.7],最大的是 🟧0.9,将蓝框🟦、绿框🟩与橙框🟧作比较,设置阈值0.6,这里很明显啦~蓝框🟦、绿框🟩和橙框🟧的 IOU 值都大于阈值0.6(肉眼都看得出吧😏)

由此可见,NMS 其实在单个目标具有多个预测框的情况下进行进一步的筛选

检测

至此,终于进入了正文......

网格分割

我们先将输入的图像分成S×S的网格。如果目标的中心落入了某个网格中,则由该网格负责检测该目标(包括目标的边界框、类别、置信度)。下面是一张网格的可视化图,我们设置 S=7,将图像一共分成了49个网格

网格预测

每个网格预测B个边界框,一个边界框包含5个预测:x、y、w、h和置信度。(x, y) 表示边界框中心相对于网格边界的偏置(这里的网格边界一般指网格的左上角),(w, h) 是边界框的宽度和高度,置信度表示预测框与实际边界框之间的 IOU

前面说 (x, y) 表示边界框中心相对于网格边界的偏置(这里的网格边界一般指网格的左上角),"边界框中心"指上图的蓝点🔵,"网格的左上角"指上图的红点🔴

当然,(x, y, w, h) 在设置标签的时候还需要进行归一化处理,将 (x, y) 对于网格的尺寸做归一化,(w, h) 对于整张图片的尺寸做归一化

非常的抱歉😞,对于 (x, y, w, h) 的部分,笔者承认写的不好,因为懒得画图,有些细节解释有不周到,读者若有不理解之处,在评论区探讨或是自寻其他资料吧🤐

同时,对于存在目标的网格,网格还负责预测C个类别。在测试时,我们将类别概率乘以置信度预测值,也就是置信度分数,分数编码了该类出现在框中的概率以及预测框拟合目标的程度

我们将图像分成S×S的网格,并让每个网格都生成B个预测框,这些预测框生成 (x, y, w, h, confidence) 以及C个类别的概率。这些预测结果被编码为 S×S×(B×5+C) 的张量

我们使用Pascal VOC数据集,使用S=7,B=2,即将图片分成7×7=49个网格,每个网格会生成2个预测框。Pascal VOC有20个类别,所以C=20。我们最终的预测是 (7, 7, 30) 的张量(30=2×5+20,20:类别数,5:(x, y, w, h, confidence),2:2个预测框)

模型构建

网络的构建受到 GoogLeNet 图像分类模型的启发。YOLOv1 网络有24个卷积层,后面是2个全连接层,网络最终输出是 (7, 7, 30) 的张量。并且对最后一层使用线性激活函数,所有其它层使用下面的 Leaky ReLU 激活函数

模型训练

预训练

YOLOv1 先在ImageNet 1000类竞赛数据集上预训练卷积层。但是在预训练中,只使用前面的模型图的前20个卷积层,接着是平均池化层和全连接层,进行了大约一周的训练🏋️(一周的训练......劝退了)

预训练结束后,进行模型转换,去除了原本的平均池化层和全连接层,随后增加了4个卷积层与2个全连接层

正式训练

YOLOv1 使用了64的批大小,0.9的动量和0.0005的衰减率,在Pascal VOC 2007和2012的训练和验证数据集上训练了约135个周期

具体的训练方案如下

  • 第1个训练周期中慢慢地将学习率从0.001提高到0.01
  • 以0.01的学习率训练75个迭代周期
  • 0.001的学习率训练30个迭代周期
  • 最后用0.0001的学习率训练30个迭代周期

为了防止过拟合,使用了 Dropout 和数据增强。在第一个全连接层之后使用 rate=0.5 的Dropout层。对于数据增强,引入高达原始图像20%大小的随机缩放和转换。还在HSV色彩空间中使用高达1.5的因子来随机调整图像的曝光和饱和度

总结

因为每个网格只能预测1个框,一共49个网格,所以模型最多也就预测49个框。也因为这点,使得模型难以成群出现的小物体(比如鸟群,似乎这是任意模型的通病)

相关推荐
Funny_AI_LAB16 分钟前
MetaAI最新开源Llama3.2亮点及使用指南
算法·计算机视觉·语言模型·llama·facebook
zmjia11126 分钟前
全流程Python编程、机器学习与深度学习实践技术应用
python·深度学习·机器学习
方世恩1 小时前
【进阶OpenCV】 (5)--指纹验证
人工智能·opencv·目标检测·计算机视觉
_.Switch1 小时前
Python机器学习:自然语言处理、计算机视觉与强化学习
python·机器学习·计算机视觉·自然语言处理·架构·tensorflow·scikit-learn
A_lvvx1 小时前
OpenCV透视变换
人工智能·opencv·计算机视觉
鲸~屿2 小时前
计算机视觉 第十章OpenCV
人工智能·opencv·计算机视觉
一只在学习的瓶子2 小时前
【大模型 AI 学习】大模型 AI 部署硬件配置方案(本地硬件配置 | 在线GPU)
深度学习·阿里云·ai
HyperAI超神经3 小时前
Meta 首个多模态大模型一键启动!首个多针刺绣数据集上线,含超 30k 张图片
大数据·人工智能·深度学习·机器学习·语言模型·大模型·数据集
sp_fyf_20243 小时前
计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-03
人工智能·算法·机器学习·计算机视觉·语言模型·自然语言处理
Eric.Lee20213 小时前
数据集-目标检测系列- 螃蟹 检测数据集 crab >> DataBall
python·深度学习·算法·目标检测·计算机视觉·数据集·螃蟹检测