yolov1-yolov5(未完待续)
1、yolov1
网络结构(24层卷积层+2层全连接层)

训练技巧
(1)预训练分类模型
采用前20个卷积层+一个平均池化层+1个全连接层的分类器(224 × 224 input image)在ImageNet 1000类数据上进行预训练
(2)将分类模型转为检测模型
根据Ren等人的研究结论,添加了四个卷积层和两个具有随机初始化权重的完全连接层。
因为检测通常需要细粒度的视觉信息,将网络的输入分辨率从224×224提高到448×448。
最后一层用于预测边界框和类别概率。
最后一层使用线性激活函数,所有其他层使用leaky矫正线性激活,leaky激活函数如下

生成标签
x,y:将边界框x和y坐标参数化为特定网格单元位置的偏移量,以便它们也在0和1之间边界。因为yolov1中规定只有包含物体中心点的网格cell的最大iou预测框才有“responsible”预测边界框box
***每个网格有B个(原文中B=2)预测框,只取与gt的IOU最大的预测器用于计算边界框坐标loss
w,h:通过图像宽度和高度对边界框的宽度和高度进行规格化,使其介于0和1之间。即w‘ = w/W
预测输出。
confidence: 在线更新(因为需要计算预测框与gt的IOU)。如果网格中存在目标,则confidence等于预测框与gt_box的IOU,如果网格中不存在目标,则confidence等于0
*这里原文中写的是,如果cell中不存在目标,则confidence为0,否则希望confidence等于IOU。但是在一些开源代码中,对于存在目标的cell,有序列表这个cell上iou小那个预测框的confidence也为0,也就是采用和x,y,w,h一样的object_mask。
类别:假设一共有n类,则这部分为n为向量,真实类别对应的位置为1,其余为0
损失函数

- 只有当某个网格中有object的时候才对classification error进行惩罚。
- 只有当某个box predictor对某个ground truth box负责的时候,才会对box的coordinate error进行惩罚
- 无论是否包含object,都需要对confidence error进行惩罚。包含object的confidence目标是预测框和gtbox的iou,不包含object的confidence目标是0。
- 为什么对w和h开方?
- 为什么各部分损失的权重不一样?权重超参数如何设置?
因为localization error是8维,classification error是20维,权重一样显然是不合理的;另一方面,一张图片中很可能出现不含object的网格远比含object的网格多的情况(因为yolo只将包含object中心点的网格算作包含object的网格),网络会将不含object网格中的box的confidence push到0,这种做法是overpowering的,这会导致网络不稳定甚至发散。
因此作者设置了不一样的权重: 1)更重视8维的坐标预测,给这些损失前面赋予更大的loss weight, 在pascal VOC训练中取5; 2)对没有object的bbox的confidence loss,赋予小的loss weight,在pascal VOC训练中取0.5; 3)有object的bbox的confidence loss和类别的loss 的loss weight正常取1。
yolov1的局限性 :难以处理成群的小对象,例如鸟群
作者的解释:由于我们的模型从数据中学习预测边界框,它很难推广到具有新的或不寻常的纵横比或配置的对象。我们的模型还使用相对粗糙的特征来预测边界框,因为我们的架构具有来自输入图像的多个下采样层。最后,当我们训练一个接近检测性能的损失函数时,我们的损失函数在小边界框和大边界框中处理错误的方式是相同的。大盒子中的小错误通常是良性的,但小盒子中的小错误对IOU的影响要大得多。我们的主要错误源是不正确的定位。
个人分析:每个格子只能预测一个类别,对于两个物体相隔很近尤其是中心点落在一个格子的情况,效果不好。
2、yolov2
网络结构
使用Darknet-19网络作为backbone,YOLO2网络中第0-22层是Darknet-19网络,后面第23层开始,是添加的检测网络。

参考[图解 YoloV2_wenxueliu的博客-博客_yolov2网络结构]( "图解 YoloV2_wenxueliu的博客-博客_yolov2网络结构")

参考[YOLO v2网络结构分析_zhw864680355的博客-博客_yolov2网络结构]( "YOLO v2网络结构分析_zhw864680355的博客-博客_yolov2网络结构")
相比于YOLOv1的改动和创新:
batch normalization :加入BN层,取消dropout。 BN能够给模型收敛带来显著地提升,作者在每层卷积层的后面加入BN后,在mAP上提升了2%。BN也有助于正则化模型,因此去掉了dropout。
high resolution classifier :采用更高分辨率的分类器,yolov1中分类器的分辨率是224224,然后在检测器中使用448×448分辨率,不利于finetune。在yolo v2中,先用 输入为224x224的分类器在ImageNet1000上训练160 epoch(lr=0.1);然后调整输出为448x448,再在ImageNet上Fine Tune 10个epoch 上 (lr=0.001),最后把更高分辨率的分类网络(448448)用到detection上,mAP提升了4% 。
Convolutional With Anchor Boxes :Faster R-CNN的RPN机制,将图像输入改为416(缩小32倍后输出为13,奇数),mAP稍微下降,但是召回率提升。最终的模型中没有使用Convolutional With Anchor Boxes,而是采用更优的Dimension Clusters
Dimension Clusters: 作者发现anchor机制的prior(预设框)尺寸是手工设置的,虽然box的尺寸会通过坐标线性回归调整,但如果一开始就选用更合适的prior的话,可以使网络学习更轻松一些。yolov2中利用训练集的box进行k-means聚类来自动找到prior,考虑到模型复杂度和召回率之间的平衡,最终折中选择k=5。
Direct location prediction : 当在YOLO中使用anchor boxes机制的时候,会出现模型不稳定问题。因为RPN中网络预测了值tx和ty以及(x, y)坐标,但没有对tx和ty加限制条件,即tx和ty可能大于-1或小于-1,导致预测的anchor box可能偏移到图像任意的位置上,需要很长时间才能产生可靠的偏移量。因此作者延续了YOLOv1的方法:预测(x,y)对于网格单元左上角的相对位置。 使用聚类搭配直接位置预测法的操作,使模型上升了5个百分点。

Fine-Grained Features: 细粒度特征,13*13对于大物体已经够了,但是对于更小的物体,则需要更细粒度的特征,因此作者添加了一个passthrough层 ,利用了26x26的特征图。
passthrough很有趣,有点类似resnet结构,将Darknet-19第16层的输出特征图2626512经过11卷积输出262664,然后按照以下方式转变为1313*256。

以上图片来源于目标检测|YOLOv2原理与实现(附YOLOv3) - 知乎 (zhihu.com)
multi-scale training: 用多种分辨率的输入图片进行训练。
5、yolov5
相比于yolov3的改进
Focus模块,图片进入backbone前,对图片进行切片操作,将一张图片分为四张。示例图如下:

以yolov5s为例,原始的640 × 640 × 3的图像输入Focus结构,采用切片操作,先变成320 × 320 × 12的特征图,再经过一次卷积操作,最终变成320 × 320 × 32的特征图。
Focus结构的作用是提速!!

yolov5将yolov3的layer0~3替换成了focus结构,减少了运算量,提速明显
yolov3 是4个卷积层(33,32,sride=1)(33,64,sride=2)(11,32,sride=1)(33,64,sride=1),后两层是resnet结构。假设输入为6406404,输出为32032064
FLOPS = 33332640640+333264320320+116432320320+333264320320
Focus结构,同样假设输入为6406403,slice后为32032012,想要输出32032064,则
FLOPS = 331264320*320
