对YOLO-v1的理解及阅读笔记

写在最前面

开始写博客是想记录学习,也是鞭策自己。学习过程中发现网上许多博文不甚清楚,或者看过就忘,整理的过程增加了一些自己的理解,也算不小的收获。刚刚入门,难免出错,如有问题请不吝赐教,也欢迎讨论。
最后,我想我至少会认认真真更新到毕业吧(大概

YOLO-v1 阅读笔记

YOLO-v1论文标题:《You Only Look Once: Unified, Real-Time Object Detection》,CVPR2016的文章。论文地址:(懒得写链接了)。论文复现代码:https://github.com/LeslieZhoa/tensorflow-YOLO1.
YOLO是经典的目标检测算法之一,正好做项目用到,重新认真看了一遍,在翻译原文的基础增加了自己的理解。

第一章 介绍

目前的检测器,R-CNN先在一张图中将潜在的Bbox全部提出来,然后对这些框进行分类,之后再进行后处理,消除重复的检测,定义置信度等。由于每个部分都是被单独训练的,因此这些复杂的技术路线很慢而且难以优化。我们将目标检测重新定义为一个单纯的回归问题,从图像的像素直接到边界框的坐标和分类的概率。
整个YOLO框架如下图,很简单的框架,三步,resize为448*448,跑一个CNN,然后用NMS消除重复即可。对YOLO-v1的理解及阅读笔记

第二章 模型框架

  1. 将输入图像分为S*S的网格,如果目标的中心落在某一个单元格内,那么这个单元格就负责检测这个目标。每个单元格预测B个边界框及其置信度分数,置信度分数反映了这个边界框内包含一个目标的可能性以及预测目标类别的准确性。定义为:
    对YOLO-v1的理解及阅读笔记
    Pr是指示函数,表示单元格内是否含有目标。IOU表示预测框与GT框之间的交互比。
  2. 每个Bbox包含5个预测值:x, y, w, h,and confidence. (x, y)表示的是Bbox的中心坐标,它是相对于单元格边界的相对值。宽度和高度的值是相对于整幅图像的。
  3. 每个单元格需要预测C个条件概率,是对类别的预测。这些条件概率是建立在该单元格包含一个目标的条件下,是此类别的概率。一个单元格只预测一个类别,与Bbox的数量无关。

对YOLO-v1的理解及阅读笔记

  1. 在测试阶段,我们将类别的置信度,即条件概率,与边界框存在目标的置信度相乘,得到分类置信度:class confidence.
    对YOLO-v1的理解及阅读笔记
    (看到这里有些疑惑,测试阶段哪来的truth呢?我的理解是。这里的测试阶段应该指的是有label的验证集,复现的代码里,对未知图像的测试是直接取网络的输出作为confidence,没有IOU的计算,因为不存在truth。)
    下图展示了model。
    对YOLO-v1的理解及阅读笔记
    将检测过程看成一个回归问题,将一幅图像分成SS的网格,每个网格预测B个边界框和C个类别的概率,因此一幅图像可以被编码为SS*(B*5+C)的张量。5是指x,y,w,h,confidence.
    在VOC数据集上,我们使用S=7,B=2,C=20.

2.1节 网络设计

  1. 网络依然是CNN提取特征,最后全连接层对输出的概率和坐标进行预测。网络框架基于GoogLeNet,但是没有使用Inception结构,取而代之的是11加33的两个网络层结构,一共有24个卷积层,和2个全连接层。整体网络结构如下图.写的很清楚,1*1的目的是减少特征维度,以减轻计算量。

对YOLO-v1的理解及阅读笔记

2.1节 训练过程

  1. 在ImageNet上进行了预训练。
  2. 我们对x,y,w,h都进行了归一化处理,使其值落在0到1之间,便于回归计算。具体做法是这样,对w,h,利用图像的宽和高进行归一化;对x,y,将其参数化为相对于特定网格单元位置的偏移。有篇博文对此的解释通俗易懂,直接截图学习下,原文链接
    对YOLO-v1的理解及阅读笔记
    对YOLO-v1的理解及阅读笔记
  3. 对于**函数,除了最后一层用了一个线性**;其它层用的是leaky rectified 线性**:
    对YOLO-v1的理解及阅读笔记
  4. 利用和均方误差对输出进行优化。有几个不足之处:首先,它将定位误差和分类误差置于平等的权重可能不是很好;其次,在一幅图像的许多网格中并不存在目标物体,那么其confidence为0,这会使得梯度失衡,导致模型不稳定。
    为了解决这个问题,使用权重系数增大对位置坐标的预测,设为5;对于没有包含任何物体的边界框,减小分类预测,设为0.5(在下面损失函数中可以体现).另外,均方根对大尺寸和小尺寸的边界框惩罚力度是一样的,小尺寸对偏移比大尺寸更加敏感,因此我们使用w,h的平方根来代替原值,以减弱其影响(但是并没有根除)。
  5. 在训练期间,我们只使用与GT框的IOU最大的那个边界框,作为此目标的检测器,也就是说每个目标只取一个检测框为其预测。
  6. 以上都是网络结构和一些优化方法,下面说一下比较重要的损失函数。
    对YOLO-v1的理解及阅读笔记其中,两个指示函数,1i表示单元格i中是否包含目标;1ij表示在单元格i中第j个边界框负责进行预测(前面说过,每个单元格只取一个边界框进行预测,只取一个类别作为单元格负责的类别,这也是YOLO的缺点,无法处理同时存在一个单元格中的多目标,因此对小目标检测并不友好。)两个λ是之前提到的权重系数。损失函数只对负责预测的那个边界框(前面提到的IOU最大)进行定位惩罚。
  7. 训练细节略.

2.3 测试阶段的前向推导

  1. 根据之前的参数设计,我们的网络在VOC数据集上对每张图会产生98个边界框及其分类概率。可以很清楚的看到,哪个目标落在了哪个单元格内(因为一个单元格只预测一个类别的目标,即confidence最大的那个),对一个目标,网络最终只生成一个Bbox。另外,在多个单元的边界附近的一些大的物体可以被多个单元很好地定位。然后使用NMS来处理这些针对单个目标的多个可能的边界框。

2.4 YOLO的限制

  1. 由于每个网格单元只预测两个框,并且只能有一个类,所以 YOLO 对包围框预测施加了很强的空间约束。此空间约束限制了对邻近目标检测的数量,比如群体中的小目标,鸟群之类的比较难检测。
  2. 由于受限于训练数据,因此比较难以处理新的或者不常见的纵横比的物体。另外,由于我们的网络使用了很多的下采样,可能会丢失一些细节信息,特征相对稀疏。
  3. 第三点,之前提到的在损失函数中,对小尺寸边界框和大尺寸边界框相同的误差处理方式依然没有根本解决。大尺寸对小的错误偏移通常可以接受,而小尺寸则影响较大。这一问题的根源是对边界框的位置预测不正确导致的。

第三章 与其他检测系统的对比

主要说一下与R-CNN的对比。相同点:YOLO的每个单元格同样也利用卷积特征提出了潜在的边界框和置信度;不同点:YOLO加了空间约束,减少对同一个对象的多个检测,一张图只有98个候选框,而R-CNN有2000个,而且YOLO是端到端的系统,R-CNN是多任务联合的模型。

第四章 实验

1 YOLO在FPS为45的水平上,mAP达到了63.4.与Faster R-CNN的73.2还有一定的差距,主要表现在对目标的定位上不准确。比Fast R-CNN好的地方在于,假阳性减小了3倍。


下篇更新YOLO-v2

参考文献

[1] https://blog.****.net/qq_38232598/article/details/88695454
[2] https://www.jianshu.com/p/13ec2aa50c12
[3] https://www.jianshu.com/p/09f40e26451c