目标检测学习--yolo v5

yolo v5论文:没有

官方源码GitHub:GitHub - ultralytics/yolov5: YOLOv5 in PyTorch > ONNX > CoreML > TFLite

yolo v5算法在yolo v4的基础上添加了一些新的改进思路,使得其在精度变化不大的情况下,模型大小减少了很多,速度得到了极大的性能提升,具体改进如下包括:

  • input端的Mosaic数据增强、自适应锚框计算、自适应图片缩放操作;
  • Backbone端的Focus结构与CSP结构;
  • Neck端的SPP与FPN+PAN结构;
  • head(prediction)端的损失函数GIOU_Loss以及预测框筛选的DIOU_nms。

下表是官网贴出的关于不同大小模型以及输入尺度对应的mAP、推理速度、参数数量以及理论计算量FLOPs,可以看到模型大小很小、速度较快:

目标检测学习--yolo v5_第1张图片

下图为yolov5s的网络结构,它是yolov5系列中深度最小、特征图宽度最小的网络: 

在这里插入图片描述

CBL模块:由Conv+BN+Leaky_relu激活函数组成;Leaky_relu与relu很相似,仅在输入小于0的部分有差别,relu输入小于0的部分值都为0,而Leaky_relu输入小于0的部分,值为负,且有微小的梯度,在反向传播过程中,对于Leaky_relu激活函数输入小于0的部分,也可以计算得到梯度,从而解决神经元”死亡“问题;

Res unit模块:借鉴ResNet网络中的残差结构,用来构建深层网络,CBL是残差模块中的子模块;

CSP1_X模块:借鉴CSPNet网络结构,将原输入分成两个分支,分别进行卷积操作使得通道数减半,然后一个分支进行Bottleneck * N操作,然后concate两个分支,使得BottlenneckCSP的输入与输出是一样的大小,这样是为了让模型学习到更多的特征;CSP1_X模块由CBL模块、x个Res unint模块以及Conv、Concate、BN、Leaky_relu、CBL组成而成;CSP2_X模块:借鉴CSPNet网络结构,该模块由2 * x个CBL模块和Conv、Concate、BN、Leaky_relu、CBL组成而成;

Focus模块:首先将多个slice结果Concat起来,然后将其送入CBL模块中;

Focus模块在v5中是在图片进入backbone前对图片进行切片操作:具体操作是在一张图片中每隔一个像素拿到一个值,类似于邻近下采样,这样就拿到了四张图片,四张图片互补,将W、H信息就集中到了通道空间,输入通道扩充了4倍,即拼接起来的图片相对于原先的RGB三通道模式变成了12个通道,最后将得到的新图片再经过卷积操作,最终得到了没有信息丢失情况下的二倍下采样特征图:

在这里插入图片描述

如上图所示,将每个2x2的相邻像素划分为一个patch,然后将每个patch中相同位置(同一颜色)像素给拼在一起就得到了4个feature map,然后在接上一个3x3大小的卷积层。这和直接使用一个6x6大小的卷积层等效。 后来YOLOv5在v6.0版本后把网络的第一层(Focus模块)换成了一个6x6大小的卷积层,因为某些设备不支持focus操作,且不友好,开销很大,另外切片对不齐模型就崩了;

SPP模块:采用1×1、5×5、9×9和13×13的最大池化方式,进行多尺度特征融合;作者做了一些改动,SPP模块将输入并行通过多个不同大小的MaxPool,然后做进一步融合,能在一定程度上解决目标多尺度问题,SPP模块如下所示:

在这里插入图片描述

作者自行设计的SPPF结构是将输入串行通过多个5x5大小的MaxPool层,这里需要注意的是串行两个5x5大小的MaxPool层是和一个9x9大小的MaxPool层计算结果是一样的,串行三个5x5大小的MaxPool层是和一个13x13大小的MaxPool层计算结果是一样的:

在这里插入图片描述

两者的计算结果一模一样,但SPPFSPP计算速度快了不止两倍; 

input端

Mosaic数据增强:参考yolo v4

自适应锚框计算: 在YOLO系列算法中,针对不同的数据集,都需要设定特定长宽的锚框。在网络训练阶段,模型在初始锚点框的基础上输出对应的预测框,计算其与GT框之间的差距,并执行反向更新操作,从而更新整个网络的参数,因此设定初始锚点框也是比较关键的步骤;

自适应图片缩放:

针对不同的目标检测算法而言,我们通常需要执行图片缩放操作,即将原始的输入图片缩放到一个固定的尺寸,再将其送入检测网络中;常用的尺寸包括416*416,608 *608等尺寸;由于在实际的使用中的很多图片的长宽比不同,因此原始的缩放填充方法之后,两端的黑边大小都不相同,然而如果填充的过多,则会存在大量的信息冗余,从而影响整个算法的推理速度;为了进一步提升YOLOv5算法的推理速度,该算法提出一种方法能够自适应的添加最少的黑边到缩放之后的图片中;
根据原始图片大小与输入到网络图片大小计算缩放比例:

在这里插入图片描述

根据原始图片大小与缩放比例计算缩放后的图片大小: 

在这里插入图片描述

计算黑边填充数值: 

在这里插入图片描述

Neck端 

FPN+PAN结构:和yolo v4一样,YOLOv4的Neck结构中,采用的都是普通的卷积操作,而YOLOv5的Neck网络中,采用借鉴CSPnet设计的CSP2结构,从而加强网络特征融合能力;

目标检测学习--yolo v5_第2张图片

prediction端

Ciou_loss

YOLOv5的损失主要由三个部分组成:

Classes loss,分类损失,采用的是BCE loss,注意只计算正样本的分类损失;
Objectness loss,obj损失,采用的依然是BCE loss,注意这里的obj指的是网络预测的目标边界框与GT Box的CIoU,这里计算的是所有样本的obj损失;
Location loss,定位损失,采用的是CIoU loss,注意只计算正样本的定位损失;

Diou_NMS

参考文献

YOLOv5网络详解 

yolov5网络结构 

深入浅出Yolo系列之Yolov5核心基础知识完整讲解 

如何评价YOLOv5?

目标检测loss总结

仅为学习记录,侵删! 

你可能感兴趣的:(目标检测网络,目标检测,学习,深度学习)