YOLOv1-YOLOv5的简单学习记录

YOLOv1(2016)

  1. 首次将目标检测转化为回归问题,边框回归直接预测(x,y,w,h)
  2. VGG16为backbone,7*7网格负责预测,每个网格预测2个bbox,输出7x7x30
  3. 损失包括:坐标预测损失、置信度预测损失、类别预测损失(都是误差平方和SSE损失?损失权重不一致而已,总方误差相加
    注意和MSE并不是一样的,有点区别)
  4. 优缺点:简单、快、小目标检测不佳、召回率低、定位不准(是由于损失函数的设计?),致命缺陷:7x7网格,每一个只预测一类,多个类也只预测一个。
    (YOLO对相互靠近的物体,以及很小的群体检测效果不好,这是因为一个网格只预测了2个框,并且都只属于同一类。)
    在这里插入图片描述

YOLOv2(2017)

重点解决YOLOv1召回率和定位精度方面的不足
5. Darknet19为backbone,13x13网格,输出13x13x125,每个格子预测5个框(添加了BN、1x1卷积降维、global average pooling代替全连接;大多数检测网络框架都是以VGG-16作为基础特征提取器,它功能强大,准确率高,但是计算复杂度较大,所以速度会相对较慢。因此YOLOv2的网络结构将从这方面进行改进)
6. 首次引入anchor(借鉴faster-rcnn),K-Means聚类添加先验框(anchor)
(有代表性先验框Anchors,使得网络在训练时更容易收敛,同时具有较高的定位准确率,相当于多了一个先验信息,提高了召回率为什么选择聚类?:按经验设定的,不具有很好的代表性。若一开始就选择了更好的、更有代表性的先验框Anchor Boxes,那么网络就更容易学到准确的预测位置)
7. 边框回归先预测Offset偏移量,Sigmoid约束offset,边框回归公式求解边界框相对于图片的大小位置(通过预测偏移量而不是坐标值能够简化问题,让神经网络学习起来更容易,tx和ty经过sigmoid函数处理后范围在0到1之间,这样的归一化处理也使得模型训练更加稳定)
8. 检测层采用passthrough层(类似googlenet的Inception结构?YOLOv5也使用了类似的);全卷积结构,无全连接层,v1有(就是融合不同尺度的特征,类似于resnet)
9. 多尺度训练(让网络能适应不同的分辨率,增强模型的鲁棒性)
passthrough层:YOLO采用了一种称为 passthrough 的不同方法。 它将28 × 28 × 512 层重整形为14 × 14 × 2048,然后将其与原始的14×14×1024输出层concat连接。 在新的14 × 14 × 3072 层上应用卷积来进行预测(融合浅层和深层特征,更好的检测小目标)
YOLO v2算法详解
YOLO v2详解

YOLOv3(2018)

  1. 主要改进了backbone,-Darknet53:卷积单元(conv+BN+Leak relu)、残差单元(Add)、darknet-53的中间层和后面的某一层的上采样进行张量拼接,达到多尺度特征融合的目的(concat)、采用步长为2的卷积层进行下采样代替池化层(主要引入了resnet残差的思想对Darknet19改进,每个卷积层之后加入了一个BN层和一个Leaky ReLU、多尺度特征融合)
  2. 三种不同的尺度,一共9种不同大小的Anchors,实现多尺度预测
  3. 位置损失总方误差SSE(坐标x,y使用交叉熵,w,h使用SSE),置信度损失和类别预测:交叉熵(为什么使用交叉熵?交叉熵本来就是用来分类的)
  4. 多标签分类(其实我打的广东电网就是这样任务将YOLOv2中用于分类的softmax层修改为逻辑分类器,逻辑分类器主要用到了sigmoid函数,它可以把输出约束在0到1,如果某一特征图的输出经过该函数处理后的值大于设定阈值,那么就认定该目标框所对应的目标属于该类)
  5. 边框回归采用逻辑回归(类似RPN中的线性回归,logistic回归用于对anchor包围的部分进行一个目标性评分(objectness score),即这块位置是目标的可能性有多大。这一步是在predict之前进行的,可以去掉不必要anchor,可以减少计算量。如果模板框不是最佳的即使它超过我们设定的阈值,我们还是不会对它进行predict。
    不同于faster R-CNN的是,yolo_v3只会对1个prior进行操作,也就是那个最佳prior。而logistic回归就是用来从9个anchor priors中找到objectness score(目标存在可能性得分)最高的那一个)

为什么使用步长为2的卷积层进行下采样代替池化层
池化层是一种先验的下采样方式,即人为的确定好下采样的规则;而对于步长为2的卷积层来说,其参数是通过学习得到的,采样的规则是不确定的。cnn的每一层卷积都在编码空间相关性,浅层特征编码短距离相关性,更深的卷积层编码更远距离的空间相关性,而到了某一层,再也没有统计意义上的空间相关性了(这取决于有意义的物体在图像中的尺寸),到这一层就可以用GAP聚合空间特征了
对于池化层和步长为2的卷积层的一些思考
yolo系列之yolo v3【深度解析】

YOLOv4(2020.03)

  1. 第一次总结:backbone、Neck、Head的概念!
  2. 提出 免费包”(Bag of freebies):在不增加推理成本的前提下获得更好的精度,而只改变训练策略或只增加训练成本的方法:数据增强、边界框回归的目标函数、标签的设计:标签平滑等。 “特价包”(Bag of specials):只增加少量推理成本但能显著提高目标检测精度的插件模块后处理方法:(插件模块:提升感受野SPP系列、注意力模块、特征融合模块FPN系列、激活函数;后处理方法:NMS系列)
  3. CSPDarknet53为backbone,新添加了CSP结构(能够实现更丰富的梯度组合,加强CNN的学习能力、减少内存消耗,减少计算瓶颈,现在的网络大多计算代价昂贵,不利于工业的落地。)
  4. Neck:目标检测网络在BackBone和最后的输出层之间往往会插入一些层,Yolov4中的SPP模块、PAN结构(SPP模块极大提高了感受野,能够分离出最重要的上下文特征而且没有降低网络运行的速度,在我的另一篇博客里有它们的解释-YOLOv5网络结构的思考
  5. 输入端改进:Mosaic数据增强、cmBN、SAT自对抗训练(cmBN:CBN的改进,收集了一个批次中的mini-batches之间的统计数据来更新BN层参数,CBN: “前几次迭代训练的BN(LN/GN应该都可以)参数” + 当前batch数据计算的BN(LN/GN)参数 来计算得出当前次训练iteration真正的CBN参数;Mosaic是一种新型的数据增广的算法,它混合了四张训练图片。因此有四种不同的上下文进行融合,然而CutMix仅仅将两张图片进行融合。此外,batch normalization在每个网络层中计算四张不同图片的激活统计。这极大减少了一个大的mini-batch尺寸的需求,不仅使图片能丰富检测目标的背景,而且能够提高小目标的检测效果?why???)
  6. Prediction:输出层的锚框(anchor)机制和Yolov3相同,主要改进的是训练时的损失函数CIOU_Loss,以及预测框筛选的nms变为DIOU_nms
  7. 修改过的SAM、修改过的PAN(SAM空间注意力:修改后的SAM直接使用一个卷积层作用于输入特征,得到输出特征,然后再使用一个Sigmoid 函数来创建注意力;PAN:使用张量连接(concat)代替了原来的快捷连接)
    YOLOv4原文翻译 - v4它终于来了!

YOLOv5(2020.05)

  1. 输入端:Mosaic数据增强、自适应锚框计算、自适应图片缩放(前两项其实在V4就有了,自适应图片缩放:缩放填充后,两端的黑边大小都不同,而如果填充的比较多,则存在信息冗余,影响推理速度,v5对原始图像自适应的添加最少的黑边;训练时没有采用缩减黑边的方式,还是采用传统填充的方式,即缩放到416×416大小,只是在测试,使用模型推理时,才采用缩减黑边的方式,提高目标检测,推理的速度
  2. Backbone:Focus结构,CSP结构(CSP结构与v4略有不同,Focus:相当于对图像的原始特征进行了重排,但是信息并没有丢失,同时感受野提升
  3. Neck:PAN结构
  4. Prediction:GIOU_Loss,nms
  5. 通过上面的两个参数来控制网络的深度和宽度,比较灵活

YOLOX(2021)

创新点:
(1) 将 anchor free 方法引入到YOLO系列,性能超越了基于anchor based方法的yolov5;(将YOLO切换为anchor-free方式非常简单。我们将每个位置的预测从3个减少到1个,并使它们直接预测4个值,即网格左上角的两个偏移量,以及预测框的高度和宽度,应该不需要置信度预测了,也不用每个位置预测3个anchor)

(2) 采用了 decoupled head(检测头解耦)、simOTA(标签分配-正负样本划分)Multi positives等方法,值得借鉴。
为什么使用decoupled head?
如果使用coupled head,输出channel将分类任务和回归任务放在一起,这2个任务存在冲突性,分类和定位的关注点不同!分类更关注目标的纹理内容!定位更关注目标的边缘信息!通过实验发现替换为Decoupled Head后,不仅是模型精度上会提高,同时 网络的收敛速度也加快。(在目标检测中,分类任务与回归任务之间的冲突是一个众所周知的问题,所以其实有很多检测器已经做过解耦)
为什么使用Multi positives?
Yolox使用FCOS中的
center sampling
方法,将目标中心3x3的区域内的像素点都作为 target(正样本)。如果只指定一个点作为positive(正样本),很多其他高质量的预测如果不纳入来计算loss,这不利于训练

使用simOTA的优势?(这种全局最优的标签分配策略有点难理解)
simOTA:将匹配正负样本的过程看成一个最优传输问题,正负样本匹配过程中以最低的成本(cost)将GT分配给对应的样本,成本cost由分类损失和回归损失两部分组成,并且网络预测的类别越准确cost越小,网络预测的目标边界框越准确cost越小。那么最小化cost可以理解为让网络以最小的学习成本学习到有用的知识。再用FCOS的理论去扩展正负样本,左后根据cost去进行正负样本的匹配。
simOTA是OTA的近似版本。传统的使用人工规则的分配方法,无法考虑尺寸、形状或边界遮挡的差异性,虽然有一些改进工作,如ATSS动态分配方法,可以为每个目标动态的选择正样本。但是上述方法都一个缺陷:没有全局性的考虑,比如当处理模糊标签时 (一个anchor可能对应多个目标),对其分配任何一个标签都可能对网络学习产生负面影响。
YOLOX网络结构详解
YOLOX论文翻译
目标检测: 一文读懂 YOLOX
视觉目标检测及分割任务中使用解耦头的好处

YOLOv6(2022)

YOLOv6大致是RepVGG、YOLOv5、YOLOX的结合

  • Backbone不再使用CSPdarknet,而是转为比Rep更高效的EfficientRep(基于RepVGG的RepVGG block设计的)
  • Neck也是基于Rep和PAN搭建了Rep-PAN(替换PAN中的CSP-Block为RepBlock)
  • Head则和YOLOX一样,进行了解耦
  • 数据增强和YOLOv5保持一致,标签分配上和YOLOX一样采用了simOTA
  • 引入了新的边框回归损失SIOU(2022年5月提出,在CIOU的基础上引入了所需回归之间的向量角度,重新定义了距离损失,有效降低了回归的自由度,从而加速网络的收敛,进一步提升回归的准确性)
    【yolov6系列一】深度解析网络架构
    YOLO系列梳理(九)初尝新鲜出炉的YOLOv6

YOLOv7(2022)

核心trick:ELAN设计思想、MP降维组件、Rep结构的思考、正负样本匹配策略、辅助训练头
YOLOv7-详解

YOLOv8(2023)

YOLOv8 算法的核心特性和改动可以归结为如下:

  • 提供了一个全新的 SOTA 模型,包括 P5 640 和 P6 1280 分辨率的目标检测网络和基于 YOLACT 的实例分割模型。和 YOLOv5 一样,基于缩放系数也提供了 N/S/M/L/X 尺度的不同大小模型,用于满足不同场景需求
  • 骨干网络和 Neck 部分可能参考了 YOLOv7 ELAN 设计思想,将 YOLOv5 的 C3 结构换成了梯度流更丰富的 C2f 结构,并对不同尺度模型调整了不同的通道数,属于对模型结构精心微调,不再是无脑一套参数应用所有模型,大幅提升了模型性能。不过这个 C2f 模块中存在 Split 等操作对特定硬件部署没有之前那么友好了
  • Head 部分相比 YOLOv5 改动较大,换成了目前主流的解耦头结构,将分类和检测头分离,同时也从 Anchor-Based 换成了 Anchor-Free
    Loss 计算方面采用了 TaskAlignedAssigner 正样本分配策略,并引入了 Distribution Focal Loss

参考资料

YOLOV5网络结构设计的思考
深入浅出Yolo系列之Yolov3&Yolov4&Yolov5&Yolox核心基础知识完整讲解
深入浅出Yolo系列之Yolov5核心基础知识完整讲解
YOLO系列算法精讲:从yolov1至yolov5的进阶之路(2万字超全整理)

  • 4
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值