YOLO1 笔记

YOLO论文:You Only Look Once: Unified, Real-Time Object Detection

YOLO的思想是,摒弃R-CNN系列网络的多层复杂结构,改为直接采用端到端的网络同时预测目标类别和边界框。

得益于这种网络结构,YOLO能够在很快(几乎可以实时处理视频)的时间内进行前向传播。此外,YOLO直接以整张图象作为输入,这意味着特征提取网络能够隐式地提取图像全局的上下文信息,从而大幅降低了将背景误认为是目标的频率——与R-CNN系列的、基于区域建议的网络相对比,因为这些网络只在乎区域建议里的图像内容/特征图像内容。据作者表示,YOLO还有一定的迁移能力:用自然图像训练的YOLO网络能够较正确地识别绘画,不过没说为什么(看到了再补上)。

YOLO的缺点是,在精确度方面仍不及当时最先进的目标检测网络。尽管YOLO能够快速地区分图像中的目标,却很难精准地定位它(尤其是较小的目标,这与YOLO1的设计有关,在后续的版本中有所改善)。总之这也是网络在速度和精度上的一种取舍吧。


数据结构设计


“网格”

YOLO将图像分为的网格(在实现时取),如果一个目标的中心落在某个网格内,那么这个网格将负责预测这个目标。

每一个网格预测组边界框参数以及这些边界框的置信分数(在实现时取)。表示边界框的中心位置,位置相对于所在网格,对网格大小normalize;表示边界框宽和高,对整张图像大小normalize。置信分数表示有这个边界框中是否有目标,以及这个边界框和实际目标的边界框有多吻合,其定义为,即如果没有目标则为0,如果有目标则为预测框和实际框的IOU。

同时,每一个网格还预测总共个类别每一个类别的置信度,(在实现时取),只在边界框置信分数不为0时有意义。

所以,YOLO网络在上述参数下的实现,其输出为一个的三维张量。

上述两个评价指标相乘,定义一个同时涵盖边界框预测置信分数和分类置信度的评价标准:


网络结构设计

由于YOLO的端到端设计理念,它的网络结构十分简单。就是24个卷积层和2个全连接层(在YOLO的轻量级版本Fast YOLO中,为了提高前向传播速度,只采用了9个卷积层),接收448×448的输入图像。

YOLO的网络结构

(这个网络结构图里,方块图和下面的卷积层参数并没有对齐...所以不要看方块图了,只看下面的参数就好)


训练

在预训练中,使用了网络的前20个卷积层,加上额外的一个平均池化层和一个全连接层。预训练进行了一个星期。

在fintune阶段,加上后面的4个卷积层和两个全连接层,前置的研究表明这样有助于让模型有更好的表现。前面20层没说还训练不训练,应该是固定了吧。

除了最后一层,其它层都用了Leaky ReLu作为激活函数:

Leaky ReLu可以让神经元在输出负值时仍能对网络权重更新有贡献。(但是为什么主要采用的激活函数是ReLu而不Leaky ReLu?)

损失函数

YOLO采用的损失函数,以及解读:

\begin{aligned} \lambda_{\text {coord }} \sum_{i=0}^{S} \sum_{j=0}^{B} \mathbb{1}_{i j}^{\text {obj }}\left[\left(x_{i}-\hat{x}_{i}\right)^{2}+\left(y_{i}-\hat{y}_{i}\right)^{2}\right] \\+\lambda_{\text {coord }} \sum_{i=0}^{S^{2}} \sum_{j=0}^{B} \mathbb{1}_{i j}^{\text {obj }}\left[(\sqrt{w_{i}}-\sqrt{\hat{w}_{i}})^{2}+(\sqrt{h_{i}}-\sqrt{\hat{h}_{i}})^{2}\right] \\+\sum_{i=0}^{S^{2}} \sum_{j=0}^{B} \mathbb{1}_{i j}^{\text {obj }}\left(C_{i}-\hat{C}_{i}\right)^{2} \\+\lambda_{\text {noobj }} \sum_{i=0}^{S^{2}} \sum_{j=0}^{B} \mathbb{I}_{i j}^{\text {nootj }}\left(C_{i}-\hat{C}_{i}\right)^{2} \\+\sum_{i=0}^{S^{2}} \mathbb{1}_{i}^{\text {obj }} \sum_{c \in \text { classes }}\left(p_{i}(c)-\hat{p}_{i}(c)\right)^{2} \end{aligned}\\

第一项:对所有包含目标的网格而言,其两个Bounding Box中心坐标的预测误差;第二项:对所有包含目标的网格而言,其两个Bounding Box尺寸的预测误差。这两项一并理解为Bounding Box位姿参数的预测误差,因为只有在网格包含目标的情况下Bounding Box位姿才是有意义的,所以只在这种情况下累积误差。这两项误差还要乘上一个值,这个主要是因为作者希望模型能够更好地预测边框。

第三项、第四项:预测网格是否包含目标时的误差。但如果网格实际上不包含目标,则累积的误差还要乘上一个值,因为一般在一幅图中,更多的网格不包含目标,但实际上我们更看重网络预测出True Positive而不是Ture Negative的能力,所以需要抑制一下不包含目标的网络贡献的误差。

第五项:对所有包含目标的网络而言,其分类误差。

所以其实YOLO的整个设计都是比较简单的。

超参数

训练了135个epoch,batchsize为64,momentum为0.9,decay为0.0005。

学习率在最开始的几个epoch从升到,然后再随着epoch增加而降低至。之所以要先升高一段,是因为,其实前面的epochs需要大学习率来加速梯度下降,但是一开始就应用太大的学习率会导致模型发散。

在第一个全连接层后面加了概率为0.5的dropout。

数据增强:随机平移、尺度缩放、调节图像饱和度。


YOLO1的局限性

首先,由于YOLO的数据结构设计,每个网格最多预测一个物体,所以较小且密集的目标是预测不出来的。

其次,YOLO通过网络直接预测Bounding Box,所以很难预测出一些具有不寻常的的长宽比的Bounding Box。

还有,YOLO在累积误差的时候并没有考虑Bounding Box的大小,但是实际上,对于Bouding Box中心点的预测而言,一个小的误差在小Bounding Box上往往比在大的Bouding Box上更严重。所以YOLO1在Bounding Box定位上经常有不理想的误差。

另外,YOLO末尾的全连接层完全是多此一举。对每个网格输出一个向量,不如直接通过卷积完成。

你可能感兴趣的:(YOLO1 笔记)