道路车流监测(2):目标检测模型解释

道路车流监测(2):目标检测模型解释

  • 前言
  • 一、模型选择
  • 二、yolov5s
    • 模型概览
    • 输入端========================================
    • Mosaic数据增强
    • 自适应锚框计算
    • 自适应图片缩放
    • 基准网络============================================
    • Focus结构
    • CSP结构
    • Neck网络============================================
    • SPP
    • FPN+PAN
    • 输出端============================
    • 损失函数
      • IoU Loss
      • GIoU Loss
      • DIoU Loss
      • DIoU Loss
    • nms非极大值抑制
  • 三、总结与分析
  • 四、参考

前言

啊啊啊,最近实习真的太累(lan)了,拖了好久才出第二章,leader一直鞭策(pua),但是mentor对我很好,所以还想再继续学下去,毕竟我也很难保证秋招能找到更好的公司,祈福.jpg。

一、模型选择

首先,明确自己要解决的问题,具体分析业务场景。从业务的角度出发选择适合的模型。毕竟没有最好的模型,只有最合适的模型。
解决的问题:检测道路中的车辆模型。需要目标检测模型来检测视频中的车辆。
业务场景分析:
1)检测目标:视频中的车辆目标属于中目标或者大目标检测,并且该类目标样本之间变化不大,不存在细粒度问题,并且我们的目标只需要检测车辆,对模型的分类能力要求不高,一般的目标检测模型都能够起到一个较好的检测结果
2)检测背景:检测目标背景简单, 一般的视频数据都是通过道路上的摄像头采集的,单一摄像头的场景不会有变动,同时摄像头捕获的也是道路数据,多个摄像头捕获的视频数据的场景变动也不大。因此也降低了车辆检测的难度。并且项目做的是车流检测,要的是统计车流数据,假设一个钟头内少检测了一辆车,导致计数的时候有所缺失,目前想来是可以接受的。
3)检测速度:由于应用场景是针对道路中摄像头中实时捕获的数据进行处理,因此对模型的速度,实时性要求比较高,并且最好能够做到分布式实时处理视频,在终端只返回处理后的结果给服务器,因此模型的大小也是考虑的一个方面。
总结:综上所述,在模型选择的时候重点关注模型的处理速度,大小,并且保证检测正确率不要太低即可。因此选用单阶段模型来保证处理速度较为合适。而在众多单阶段模型中yolo系列非常出名,我也有yolov3的基础,所以本次模型选择新一代yolov5作为目标检测模型,在yolov5系列中选用体量最小的yolov5s作为最终模型。各个模型之间比较结果如下。
道路车流监测(2):目标检测模型解释_第1张图片
道路车流监测(2):目标检测模型解释_第2张图片
Yolov5s网络最小,速度最少,AP精度也最低。但如果检测的以大目标为主,追求速度,倒也是个不错的选择。
其他的三种网络,在此基础上,不断加深加宽网络,AP精度也不断提升,但速度的消耗也在不断增加。
目前使用下来,yolov5s的模型十几M大小,速度很快,线上生产效果可观,嵌入式设备可以使用。
(这一段如果写论文的话可以扩展开,多选择几个不同的模型,单阶段双阶段,都拿来测试和比较)

二、yolov5s

模型概览

通过netron可以直观查看网络结构,对网络的架构会有更清晰的认识。
道路车流监测(2):目标检测模型解释_第3张图片

  • 输入端: 表示输入的图片。该网络的输入图像大小为608*608,该阶段通常包含一个图像预处理阶段,即将输入图像缩放到网络的输入大小,并进行归一化等操作。在网络训练阶段,YOLOv5使用Mosaic数据增强操作提升模型的训练速度和网络的精度;并提出了一种自适应锚框计算与自适应图片缩放方法
  • 基准网络: 通常是一些性能优异的分类器种的网络,该模块用来提取一些通用的特征表示。YOLOv5中不仅使用了CSPDarknet53结构,而且使用了Focus结构作为基准网络。
  • Neck网络: 通常位于基准网络和头网络的中间位置,利用它可以进一步提升特征的多样性及鲁棒性。虽然YOLOv5同样用到了SPP、FPN和PAN模块,但是实现的细节有些不同。
  • Head输出端: Head用来完成目标检测结果的输出。针对不同的检测算法,输出端的分支个数不尽相同,通常包含一个分类分支和一个回归分支。YOLOv5利用GIOU_Loss来代替Smooth L1 Loss函数,以及预测框筛选的DIOU_nms,从而进一步提升算法的检测精度。

输入端========================================

Mosaic数据增强

YOLOv5中在训练模型阶段仍然使用了Mosaic数据增强方法,该算法是在CutMix数据增强方法的基础上改进而来的。CutMix仅仅利用了两张图片进行拼接,而Mosaic数据增强方法则采用了4张图片,并且按照随机缩放、随机裁剪和随机排布的方式进行拼接而成,具体的效果如下图所示。这种增强方法可以将几张图片组合成一张,这样不仅可以丰富数据集的同时极大的提升网络的训练速度,而且可以降低模型的内存需求。

自适应锚框计算

yolo系列使用的anchors都是在配置文件中预先定义的,原先都是通过手动另外再跑一个kmeans算法,计算出当前数据集的anchors,然后通过手动修改配置文件的方法完成。现在yolov5将这两个步骤完成了整合。
yolov5s初始设定的anchor
道路车流监测(2):目标检测模型解释_第4张图片
Yolov5中将此功能嵌入到代码中,每次训练时,自适应的计算不同训练集中的最佳锚框值。
当然,如果觉得计算的锚框效果不是很好,也可以在代码中将自动计算锚框功能关闭。

parser.add_argument('--noautoanchor', action='store_true', help='disable autoanchor check')

train.py中上面一行代码,设置成False,每次训练时,不会自动计算。

自适应图片缩放

针对不同的目标检测算法而言,我们通常需要执行图片缩放操作,即将原始的输入图片缩放到一个固定的尺寸,再将其送入检测网络中。YOLO系列算法中常用的尺寸包括416*416,608 *608等尺寸。原始的缩放方法存在着一些问题,由于在实际的使用中的很多图片的长宽比不同,因此缩放填充之后,两端的黑边大小都不相同,然而如果填充的过多,则会存在大量的信息冗余,从而影响整个算法的推理速度。为了进一步提升YOLOv5算法的推理速度,该算法提出一种方法能够自适应的添加最少的黑边到缩放之后的图片中。具体的实现步骤如下所述。
步骤1-根据原始图片大小与输入到网络图片大小计算缩放比例。
道路车流监测(2):目标检测模型解释_第5张图片
步骤2-根据原始图片大小与缩放比例计算缩放后的图片大小。

步骤3-计算黑边填充数值。

如上图所示,416表示YOLOv5网络所要求的图片宽度,312表示缩放后图片的宽度。首先执行相减操作来获得需要填充的黑边长度104;然后对该数值执行取余操作,即104%32=8,使用32是因为整个YOLOv5网络执行了5次下采样操作,即2^5=32;最后对该数值除以2,即将填充的区域分散到两边。这样将416 * 416大小的图片缩小到416 * 320大小,通过这种简单的改进,推理速度得到了37%的提升,可以说效果很明显。
需要注意的是:

  • 该操作仅在模型推理阶段执行,模型训练阶段仍然和传统的方法相同,将原始图片裁剪到416*416大小
  • YOLOv3与YOLOv4中默认填充的数值是(0,0,0),而YOLOv5中默认填充的数值是(114,114,114)
  • 该操作仅仅针对原始图片的短边而言,仍然将长边裁剪到416

基准网络============================================

Focus结构

Focus是Yolov5新增的操作,该结构的主要思想是通过slice操作来对输入图片进行裁剪。如下图所示,原始输入图片大小为608 * 608 * 3,采用切片操作,先变成304 * 304 * 12的特征图,再经过一次32个卷积核的卷积操作,最终变成304 * 304 * 32的特征图。
需要注意的是:Yolov5s的Focus结构最后使用了32个卷积核,而其他三种结构,使用的数量有所增加。
道路车流监测(2):目标检测模型解释_第6张图片

CSP结构

Yolov5中设计了两种CSP结构,以Yolov5s网络为例,CSP1_X结构应用于Backbone主干网络,另一种CSP2_X结构则应用于Neck中。
道路车流监测(2):目标检测模型解释_第7张图片
CSPNet(Cross Stage Partial Network):跨阶段局部网络,以缓解以前需要大量推理计算的问题。

  • 增强了CNN的学习能力,能够在轻量化的同时保持准确性
  • 降低计算瓶颈
  • 降低内存成本

CSPNet通过将梯度的变化从头到尾地集成到特征图中,在减少了计算量的同时可以保证准确率。
CSPNet和PRN都是一个思想,将feature map拆成两个部分,一部分进行卷积操作,另一部分和上一部分卷积操作的结果进行concate。

Neck网络============================================

SPP

SPP(Spatial Pyramid Pooling): 空间金字塔池化,由何凯明提出(大佬真的太强了,respect!),使用多个窗口(pooling window) 可以统一图像不同尺寸(scale)作为输入, 得到同样长度的池化特征。

最初提出应用在双阶段检测器中,最后的分类层是由全连接组成,这就导致训练时图片的输入尺寸不能改变,推理时输入尺寸要和训练时一致。图片的变形拉伸和裁剪会导致图片失真和信息丢失。因此在当时的环境下,凯明提出了SPP,主要解决两个问题:

  • 有效避免了对图像区域剪裁、缩放操作导致的图像失真等问题
  • 解决了卷积神经网络对图像重复特征提取的问题,大大提高了产生候选框的速度,且节省了计算成本

如图所示,任何输入尺寸的图片,都会得到16+4+1=21长度的输出,channel数量仍为256不变
道路车流监测(2):目标检测模型解释_第8张图片
由论文《Spatial Pyramid Pooling in Deep ConvolutionalNetworks for Visual Recognition》可知由于对输入图像的不同纵横比和不同尺寸,SPP同样可以处理,所以提高了图像的尺度不变和降低了过拟合,且实验表明训练图像尺寸的多样性比单一尺寸的训练图像更容易使得网络收敛,SPP 对于特定的CNN网络设计和结构是独立的。(也就是说,只要把SPP放在最后一层卷积层后面,对网络的结构是没有影响的, 它只是替换了原来的pooling层);而且其不仅可以用于图像分类还可以用来目标检测。

但是在YOLOV3~V5中,SPP作用不同于前。YOLO中的SPP module由四个并行的分支构成,分别是kernel size为 5×5, 9×9, 13×13的最大池化和一个跳跃连接。如下图所示,以YOLOv3-SPP为例,作者检测头前面的第5和第6卷积层之间集成SPP模块来获得,而在随后的YOLOV4/V5中,SPP都被借鉴,用在最小的特征输出层。在Feature Map经过SPP module池化后的特征图重新cat起来传到下一层侦测网络中。此部分SPP最主要的作用就是融合了局部与全局特征。YOLOV3-SPP相比YOLOV3提升了好几个点。

在yolov5中的位置
道路车流监测(2):目标检测模型解释_第9张图片

FPN+PAN

FPN(feature pyramid networks): 特征金字塔网络,通过将主干网络的不同层的语义特征进行融合,提高各输出层所包含的语义特征。
PAN(Path Aggregation Network): 路径聚合网络,通过自下而上的将各FPN得到的新的网络分支进行特征融合,缩短了较低层和最顶层功能之间的信息路径。可以更加有效利用底层语义信息的定位信息便于精确分割(略微扯淡了,没有FPN帮他先一步完成了网络分支的构建,那PAN就啥也不是,竟然还反过来说FPN跨层太多,信息流通慢,属实过河拆桥了。个人认为可尝试去掉PAN训练一下网络,在COCO2017下与原先的模型的检测指标进行对比。当然作为2018年的CVPR肯定有独到之处。)

高层语义信息响应的是物体的整体信息,语义特征丰富;底层信息响应局部和问题信息,语义特征较少。

Yolov5的Neck和Yolov4中一样,都采用FPN+PAN的结构
道路车流监测(2):目标检测模型解释_第10张图片
Yolov4的Neck结构中,采用的都是普通的卷积操作。而Yolov5的Neck结构中,采用借鉴CSPnet设计的CSP2结构,加强网络特征融合的能力。道路车流监测(2):目标检测模型解释_第11张图片

输出端============================

损失函数

Yolov5中采用其中的GIOU_Loss做Bounding box的损失函数。
但是这并不是一个好的选择,因此本文从目标检测的损失函数发展史回溯,详细介绍各损失函数的优缺点。
目标检测任务的损失函数一般由分类损失函数和回归损失函数两部分构成,回归损失函数的发展过程主要包括:最原始的Smooth L1 Loss函数、2016年提出的IoU Loss、2019年提出的GIoU Loss、2020年提出的DIoU Loss和最新的CIoU Loss函数。
在这里插入图片描述

IoU Loss

所谓的IoU Loss,即预测框与GT框之间的交集/预测框与GT框之间的并集。
道路车流监测(2):目标检测模型解释_第12张图片

这种损失会存在一些问题,具体的问题如下图所示.

  • 如状态1所示,当预测框和GT框不相交时,即IOU=0,此时无法反映两个框之间的距离,此时该
    损失函数不可导,即IOU_Loss无法优化两个框不相交的情况
  • 如状态2与状态3所示,当两个预测框大小相同时,那么这两个IOU也相同,IOU_Loss无法区分两者相交这种情况
    道路车流监测(2):目标检测模型解释_第13张图片

GIoU Loss

Yolov5中采用其中的GIOU_Loss做Bounding box的损失函数。GIOU_Loss 为了解决以上的问题,GIOU损失应运而生。GIOU_Loss中增加了相交尺度的衡量方式,缓解了单纯IOU_Loss时存在的一些问题。

道路车流监测(2):目标检测模型解释_第14张图片

但是这种方法并不能完全解决这种问题,仍然存在着其它的问题。具体的问题如下所示,状态1、2、3都是预测框在GT框内部且预测框大小一致的情况,这时预测框和GT框的差集都是相同的,因此这三种状态的GIOU值也都是相同的,这时GIOU退化成了IOU,无法区分相对位置关系。
道路车流监测(2):目标检测模型解释_第15张图片

DIoU Loss

DIoU要比GIou更加符合目标框回归的机制,将目标与anchor之间的距离,重叠率以及尺度都考虑进去,使得目标框回归变得更加稳定,不会像IoU和GIoU一样出现训练过程中发散等问题。
道路车流监测(2):目标检测模型解释_第16张图片
如下图所示,当GT框包裹预测框时,此时预测框的中心点的位置都是一样的,因此按照DIOU_Loss的计算公式,三者的值都是相同的。为了解决这个问题,CIOU_Loss应运而生。
道路车流监测(2):目标检测模型解释_第17张图片
优点:

  • 与GIoU loss类似,DIoU loss在与目标框不重叠时,仍然可以为边界框提供移动方向。
  • DIoU loss可以直接最小化两个目标框的距离,因此比GIoU loss收敛快得多。
  • 对于包含两个框在水平方向和垂直方向上这种情况,DIoU损失可以使回归非常快,而GIoU损失几乎退化为IoU损失。
  • DIoU还可以替换普通的IoU评价策略,应用于NMS中,使得NMS得到的结果更加合理和有效

DIoU Loss

CIOU_Loss在DIOU_Loss的基础上增加了一个影响因子,将预测框和GT框的长宽比也考虑了进来。具体的计算方法如下式所示,即CIOU_Loss将GT框的重叠面积、中心点距离和长宽比全都考虑进来了。
在这里插入图片描述
在这里插入图片描述
总而言之:
IOU_Loss主要考虑了检测框和GT框之间的重叠面积;
GIOU_Loss在IOU的基础上,解决边界框不重合时出现的问题;
DIOU_Loss在IOU和GIOU的基础上,同时考虑了边界框中心点距离信息;
CIOU_Loss在DIOU的基础上,又考虑了边界框宽高比的尺度信息。

nms非极大值抑制

在目标检测的后处理过程中,针对很多目标框的筛选,通常需要nms操作。

因为CIOU_Loss中包含影响因子v,涉及groudtruth的信息,而测试推理时,是没有groundtruth的。

所以Yolov4在DIOU_Loss的基础上采用DIOU_nms的方式,而Yolov5中采用加权nms的方式。

不同的nms,会有不同的效果,采用了DIOU_nms的方式,在同样的参数情况下,将nms中IOU修改成DIOU_nms。对于一些遮挡重叠的目标,确实会有一些改进。

比如下面黄色箭头部分,原本两个人重叠的部分,在参数和普通IOU_nms一致的情况下,修改成DIOU_nms,可以将两个目标检出。虽然大多数状态下效果差不多,但在不增加计算成本的情况下,有稍微的改进也是好的。
道路车流监测(2):目标检测模型解释_第18张图片

三、总结与分析

YOLOv5是一种单阶段目标检测算法,该算法在YOLOv4的基础上添加了一些新的改进思路,使得其速度与精度都得到了极大的性能提升,具体包括:输入端的Mosaic数据增强、自适应锚框计算、自适应图片缩放操作;基准端的Focus结构与CSP结构;Neck端的SPP与FPN+PAN结构;输出端的损失函数GIOU_Loss以及预测框筛选的DIOU_nms。除此之外,YOLOv5中的各种改进思路仍然可以应用到其它的目标检测算法中。

四、参考

【1】https://blog.csdn.net/weixin_38842821/article/details/108544609
【2】https://blog.csdn.net/WZZ18191171661/article/details/113765995
【3】https://blog.csdn.net/WZZ18191171661/article/details/113789486

你可能感兴趣的:(目标检测,计算机视觉)