yolo各版本学习笔记

yolov1

算法思路

简单来说,便是输入图片,模型处理后得到一些候选框作为预测结果,将可能为物体的候选框展示出来作为检测结果。

将原图片分为$7*7$的格子,每个格子产生两种候选框,代表以此格子为基准预测的物体。 在两种候选框中选择更优的一个。

预测结果

模型输入一个图片,然后输出预测结果。

预测结果为一个$7*7*30$的张量。

这里$7*7$为原图片的长与宽都为7个单位,预测结果的框的长度单位为1。

30个参数中,后20个为预测种类。前10个参数为$(x,y,w,h,c)*2$,其中 c 为 置信度 (confidence),代表此候选框为物体的可能性。

损失函数

位置误差

对每一个格子预测的两个候选框,选择效果更好的计算损失进行优化。

对于(w,h)两个参数,取根号是为了让参数在更小的时候能更敏感。

置信度误差

分类进行损失计算, 前景比背景更重要一些,背景的权重更小。

分类误差

同常见的分类损失。

NMS

非极大值抑制,即对预测同一物体的多个候选框,取置信度最高的展示。

问题

检测问题

小物体比较难检测到。

重合在一起,或位置较近的,很难同时检测出来。

分类问题

只能做简单的分类,难以对同类别物体进行更细致的分类或多标签识别。

yolov2

Batch Normalization

舍弃Dropout, 卷积后进行 Batch Normalization。

每一层输入都做归一化。

分辨率

v1训练使用 224*224, 测试使用 448*448。

v2额外进行了10次 448*448 训练的微调。

网络结构

使用DarkNet,中间没有FC层。

进行了5次池化。因此实际输入需要能被$2^5=32$整除。

实际输入为 416*416, 实际输出为 13*13。

使用 1*1 卷积核来节省参数。

聚类提取先验框

借鉴faster-rcnn 选择先验比例。

使用K-means对数据集的标注进行聚类(K=5),作为先验框的先验比例。这里K-means聚类中的距离为 $d(box,centroids)=1-IOU(box,centroids)$。

Anchor Box

增加预测的box数量。

mAP并没有提升,但recall值提升。意味着更多的小物体或重合部分被检测出来。

Directed Location Prediction

对结果进行微调。调整结果进行了限制,避免候选框大幅度摆动。

Fine-Grained Features

借鉴VGG的思路,采用小的卷积核。

融合之前的特征,避免小目标丢失。

Multi-Scale

多尺度,可以输入不同的图像尺寸。但是尺寸要能整除32.

yolov3

多scale

分为3个scale,每个scale设置3种候选框。

不再进行最后合并,对不同大小物体的检测各自进行。

scale变换经典方法

图像金字塔方法效率不高,不适合yolo。

用插值的上采样方法,将后面的特征图与前面的特征图融合。

残差连接

残差连接方法让堆叠更多层时效果至少不会变差。

网络设计为多个残差网络块。

网络结构

没有池化和全连接层,全部使用卷积。

下采样通过调整stride实现。

输出结果包括三种:13*13(26*26, 52*52)*3*(4+1+80)。

先验框设计

聚类得到9种,按照大小分到3个scale。每个特征图上的格子预测三种先验框。

softmax层替代

使用logistic激活函数完成,可以实现多标签预测。

yolov4

Bag of freebies(BOF)

只增加训练城堡,来明显提高精度,不影响推理速度。

包括数据增强,网络正则化,类别不平衡,损失函数设计等。

数据增强

对图片进行数据增强,包括 Mixup 、 Cutout、 CutMix等方法。

  • Mixup:将两张图片进行混合。
  • Cutout:将图片的一部分去除。
  • CutMix:将图片的一部分替换为另一张图片的相应部分。
  • Random Erase:用随机值或平均像素值替换图像部分区域。
  • Hide and Seek: 根据概率随机隐藏部分区域。
  • Self-adversarial-training(SAT): 引入噪音增加难度。

Mosaic data augmentation

yolov4使用了CutMix方法,将四张图像拼成一张进行训练。

可以间接增加BatchSize,降低训练所需资源。

此外,还使用了 Random Erase、 Hide and Seek、SAT等方法。

DropBlock

随机丢弃一个连续区域,来提高推理难度。

Label Smoothing

将标签平滑一些, 将标签 [0, 1] 修改为 [0.05, 0.95]