yolo 系列的学习笔记。

YOLO v1

YOLO的核心思想就是利用整张图作为网络的输入,直接在输出层回归bounding box的位置和bounding box所属的类别。

简单概括为

  • 给个一个输入图像,首先将图像划分成7*7的网格
  • 对于每个网格,我们都预测2个边框(包括每个边框是目标的置信度以及每个边框区域在多个类别上的概率)
  • 根据上一步可以预测出$772$个目标窗口,然后根据阈值去除可能性比较低的目标窗口,最后NMS去除冗余窗口即可

每个bounding box要预测(x, y, w, h)和confidence共5个值,每个网格还要预测一个类别信息,记为C类。

在PASCAL VOC中,图像输入为448x448,取S=7,B=2,一共有20个类别(C=20)。则输出就是7x7x30的一个tensor。

在test的时候,每个网格预测的class信息和bounding box预测的confidence信息相乘,就得到每个bounding box的class-specific confidence score:

image-20210325140226481

等式左边第一项就是每个网格预测的类别信息,第二三项就是每个bounding box预测的confidence。这个乘积即encode了预测的box属于某一类的概率,也有该box准确度的信息。

得到每个box的class-specific confidence score以后,设置阈值,滤掉得分低的boxes,对保留的boxes进行NMS处理,就得到最终的检测结果。

缺点

  • 由于输出层是全连接层,因此在检测时候,YOLO训练模型只能支持和训练数据相同的输入分辨率。
  • 虽然每个格子可以预测B个bounding box,但是最终只选择只选择IOU最高的bounding box作为物体检测输出,即每个格子最多只预测出一个物体。当物体占画面比例较小,如图像中包含畜群或鸟群时,每个格子包含多个物体,但却只能检测出其中一个。
  • YOLO loss函数中,大物体IOU误差和小物体IOU误差对网络训练中loss贡献值接近(虽然采用求平方根方式,但没有根本解决问题)。因此,对于小物体,小的IOU误差也会对网络优化过程造成很大的影响,从而降低了物体检测的定位准确性。

YOLOv2(YOLO9000)

文章提出了一种新的训练方法–联合训练算法。YOLO9000就是使用联合训练算法训练出来的,他拥有9000类的分类信息,这些分类信息学习自ImageNet分类数据集,而物体位置检测则学习自COCO检测数据集

ImageNet对应分类有9000种,而COCO则只提供80种目标检测,作者使用multi-label模型,即假定一张图片可以有多个label,并且不要求label间独立。通过作者Paper里的图来说明,由于ImageNet的类别是从WordNet选取的,作者采用以下策略重建了一个树形结构(称为分层树):

  1. 遍历Imagenet的label,然后在WordNet中寻找该label到根节点(指向一个物理对象)的路径;

  2. 如果路径直有一条,那么就将该路径直接加入到分层树结构中;

  3. 否则,从剩余的路径中选择一条最短路径,加入到分层树。

得到对应9418个分类,通过重采样保证Imagenet和COCO的样本数据比例为4:1。

改进

Batch Normalization(批量归一化)

mAP提升2.4%。

High resolution classifier(高分辨率图像分类器)

mAP提升了3.7%。

Convolution with anchor boxes(使用先验框)

召回率大幅提升到88%

Multi-ScaleTraining(多尺度图像训练)

每10个Batch,网络会随机地选择一个新的图片尺寸,由于使用了下采样参数是32,所以不同的尺寸大小也选择为32的倍数{320,352…..608},最小320320,最大608608,网络会自动改变尺寸,并继续训练的过程。

这一政策让网络在不同的输入尺寸上都能达到一个很好的预测效果,同一网络能在不同分辨率上进行检测。当输入图片尺寸比较小的时候跑的比较快,输入图片尺寸比较大的时候精度高,所以你可以在YOLO v2的速度和精度上进行权衡。

YOLOv3

改进之处

  • 多尺度预测 (引入FPN)。
  • 更好的基础分类网络(darknet-53, 类似于ResNet引入残差结构)。
  • 分类器不在使用Softmax,分类损失采用binary cross-entropy loss(二分类交叉损失熵)

YOLOv3不使用Softmax对每个框进行分类,主要考虑因素有两个:

  1. Softmax使得每个框分配一个类别(score最大的一个),而对于Open Images这种数据集,目标可能有重叠的类别标签,因此Softmax不适用于多标签分类。
  2. Softmax可被独立的多个logistic分类器替代,且准确率不会下降。

分类损失采用binary cross-entropy loss。

YOLOv4

Optimal Speed and Accuracy of Object Detection

YOLOv4的特点是集大成者,俗称堆料。但最终达到这么高的性能,一定是不断尝试、不断堆料、不断调参的结果,给作者点赞。

主要贡献

  • 提出了一种高效而强大的目标检测模型。它使每个人都可以使用1080 Ti或2080 Ti
  • 验证了检测器训练过程中,最先进的 bag-of-freebies 和 bag-of-specials 的训练方法
  • 文章将目前主流的目标检测器框架进行拆分:input、backbone、neck 和 heads 部分。

数据上

cutmix 具体的方法【补充】

mosaic

yolov4 的mosaic 数据增强是参考 cutmix 数据增强,区别在于 mosaic 是一种将 4 张图合并成一张(cutmix 是2 张图),丰富了检测物体的背景;同时每小批包含一个大的变化图像(4倍),减少了估计均值和方差时候需要大 batch 的要求,降低了训练成本。

dropout

本论文认为 dropout 的主要缺陷在于它随机丢弃特征。尽管这对全连接层有效,但对特征具备空间关联的卷积层而言没那么有效。当特征互相关联时,即使使用 dropout,输入信息仍然能传输到下一层,导致网络过拟合。这表明我们需要 dropout 的更结构化形式来更好地正则化卷积网络。

dropout 被证明是全连接网络的有效策略,但是在特征相关的卷积网络效果不佳。dropblock 是在块相邻区域中丢弃特征,这样可以实现生成更简单模型的目的。

本论文介绍了一种 dropout 的结构化形式 DropBlock,对于正则化卷积网络格外有效。在 DropBlock 中,同一模块中的特征会被一起丢弃,即特征图的相邻区域也被丢弃了。由于 DropBlock 丢弃了相关区域中的特征,该网络必须从其他地方寻找证据来拟合数据

dropblock 使用在卷积网络中的正则化方法。

DropBlock有两个主要参数,block_size和γ。block_size是要删除的块的大小,γ控制要删除多少个激活单元。

这个参数描述了要删除的激活单元的数量,这取决于keep_prob和block_size。

$$ \gamma=\frac{1-\text { keep }_{-} p r o b}{\text { block_size }^{2}} \frac{\text { feat_size }^{2}}{(\text { feat_size }-\text { block_size }+1)^{2}} $$

可以推断出,keep_prob越大,被删除的激活就越少。

DropBlock论文: https://arxiv.org/pdf/1810.12890.pdf

label smooth

When using deep learning models for classification tasks, we usually encounter the following problems: overfitting, and overconfidence. Overfitting is well studied and can be tackled with early stopping, dropout, weight regularization etc. On the other hand, we have less tools to tackle overconfidence. Label smoothing is a regularization technique that addresses both problems.

label smooth 是用于处理网络的 over-confidence 问题的

$$ \operatorname{Loss}=-\sum_{i=1}^{K} p_{i} \log q_{i} $$

转换成 $$ \operatorname{Loss}_{i}=\left{\begin{array}{l}(1-\varepsilon) * \operatorname{Loss}, \text { if }(i=y) \ \varepsilon^{*} \operatorname{Loss}, \text { if }(i \neq y)\end{array}\right. $$ a technique to make your model less overconfident.

Label smoothing is used when the loss function is cross entropy, and the model applies the softmax function to the penultimate layer’s logit vectors z to compute its output probabilities p. In this setting, the gradient of the cross entropy loss function with respect to the logits is simply

$$ ∇CE = p - y = softmax(z) - y $$

在分类问题中,我们的最后一层一般是全连接层,然后对应标签的one-hot编码,即把对应类别的值编码为1,其他为0。这种编码方式和通过降低交叉熵损失来调整参数的方式结合起来,会有一些问题。这种方式会鼓励模型对不同类别的输出分数差异非常大,或者说,模型过分相信它的判断。但是,对于一个由多人标注的数据集,不同人标注的准则可能不同,每个人的标注也可能会有一些错误。模型对标签的过分相信会导致过拟合。

标签平滑(Label-smoothing regularization,LSR)是应对该问题的有效方法之一,它的具体思想是降低我们对于标签的信任,例如我们可以将损失的目标值从1稍微降到0.9,或者将从0稍微升到0.1。标签平滑最早在inception-v2中被提出,它将真实的概率改造.

Label smoothing replaces one-hot encoded label vector y_hot with a mixture of y_hot and the uniform distribution:

使用 y_hot 和均匀分布 代替了原来的 y_hot

$$ y_{ls} = (1 - α) * y_{hot} + α / K $$

where K is the number of label classes, and α is a hyperparameter that determines the amount of smoothing.If α = 0, we obtain the original one-hot encoded y_hot. If α = 1, we get the uniform distribution.

一般来说 α =0.1是一个 good place to start

总的来说,LSR是一种通过在标签y中加入噪声,实现对模型约束,降低模型过拟合程度的一种正则化方法。

查看学习:https://towardsdatascience.com/what-is-label-smoothing-108debd7ef06

使用

1
2
3
4
5
6
7
8
import torch

inputs = torch.randn(3, 5, requires_grad=True)
targets = torch.empty(3, dtype=torch.long).random_(5)

from label_smothing_cross_entropy_loss import LabelSmoothCrossEntropyLoss
loss_function = LabelSmoothCrossEntropyLoss(smoothing=0.3)
loss = loss_function(inputs, targets)

实现的类来自:http://123.56.8.10:9988/jeng/image_classification

spatical attention (SAM)

这个是需要重点看的

Mosaic 混合了 4 张训练图像,而 CutMix 只混合了两张输入图像,具体见下图:

preview

BoF (bag of freebies)

指的是能够提高精度而不增加推理时间的技术

比如图像增强的方式:图像几何变换、cutout、grid mask

图像正则化的技术

类别不均衡的处理方式

损失函数的设计

BoS (bag of specials)

增加稍许推理代价,但可以提高模型精度的方法

  • 引入注意力机制 Squeeze-and-Excitation (SE) 、Spatial Attention Module (SAM)
  • 或者是后处理方法如soft NMS、DIoU NMS等
  • 改进的激活函数 Swish、Mish (比如之前使用 Relu 或者 leaky relu 这样的方式)

总结一下YOLOv4框架:

  • Backbone:CSPDarknet53
  • Neck:SPP,PAN
  • Head:YOLOv3

YOLOv4 = CSPDarknet53+SPP+PAN+YOLOv3

其中YOLOv4用到相当多的技巧:

  • 用于backbone的BoF:CutMix和Mosaic数据增强,DropBlock正则化,Class label smoothing
  • 用于backbone的BoS:Mish激活函数,CSP,MiWRC
  • 用于检测器的BoF:CIoU-loss,CmBN,DropBlock正则化,Mosaic数据增强,Self-Adversarial 训练,消除网格敏感性,对单个ground-truth使用多个anchor,Cosine annealing scheduler,最佳超参数,Random training shapes
  • 用于检测器的Bos:Mish激活函数,SPP,SAM,PAN,DIoU-NMS

参考文献

这个可以接着细看:

目标检测算法YOLOv4详解

YOLOv5

YOLOv5 的表现要优于谷歌开源的目标检测框架 EfficientDet

这次发布的 YOLOv5 包括五种不同尺寸的模型:YOLOv5s(最小)、YOLOv5m、YOLOv5l、YOLOv5x(最大)。这些模型的推理速度和平均精度均值(mean average precision,mAP)

改进点

  • 在Yolo算法中,针对不同的数据集,都会有初始设定长宽的锚框

在Yolov3、Yolov4中,训练不同的数据集时,计算初始锚框的值是通过单独的程序运行的。但Yolov5中将此功能嵌入到代码中,每次训练时,自适应的计算不同训练集中的最佳锚框值。

为什么yolov5可以达到这么快的速度,这边整理几个原因:

  • PyTorch支持半精度运算(32位到16位精度),可以优化显着的存储大小,可以加快推论,训练速度。

  • 自适应图片缩放

在COCO上比EfficientDet更好转换,不过没有直接引用与yolov4的比较:

img

最小的yolov5s仅27MB,跟yolov4 245MB差了9倍

img

yolov5s 网络最小,才7.5 M,速度最快,ap 精度也最低,但是如果以大目标为主,追求速度,也是挺好的,可以在嵌入式设备中使用。

yolov3、yolov4与yolov5对比

在这里插入图片描述

整体上来看 yolov4 最优,YOLOv5 灵活性,比较强。