目录
目标检测
定义:目标检测包括目标分类和目标定位2个任务,目标定位一般是用一个矩形的边界框来框出物体所在的位置,关于边界框的回归策略。
一阶段和二阶段目标检测方法
一阶段检测算法(YOLO、SSD),直接在网络输出时同时预测类别和边界框的位置,没有生成候选区域过程。二阶段检测算法(Faster R-CNN),首先利用区域提议网络(Region Proposal Network, RPN)生成一系列候选区域,然后对这些区域进行分类和边界框回归。这种方法分为两个明显的阶段:第一阶段提取感兴趣的区域,第二阶段进行分类和定位。
二阶段检测算法在准确率上表现更好,但在处理速度上较慢;而一阶段检测算法则在速度上具有优势,但可能牺牲一定的准确率。在选择适合的目标检测算法时,需要根据具体的应用场景和性能要求来做出决策。
yolov5算法简介
Yolov5是一种基于anchor的单阶段目标检测算法,通过卷积神经网络对图片进行特征提取,然后对图片进行密集预测,输出目标的类别和位置信息,从而将目标检测任务变成分类和回归任务。Yolov5将整张图像划分为若干个网格,每个网格负责预测落在该网格内物体的种类和位置信息,预测信息:各类别的概率分数,边界框包含目标的置信度和实际框相对于预设框的偏移量。通过数据训练来优化模型的分类和边界框回归,实现目标检测任务。通过对模型输出解码和NMS非极大值抑制得到最终的检测结果。
网络结构
主要分为Backbone、Neck和Head三部分。
主干网络
Yolov5的主干网络使用CSPDarknet,图片由CSPDarknet进行特征提取,得到三个有效特征层(1/8、1/16和1/32下采样特征图)。主干网络主要有如下特点:
1、使用Focus网络结构作用stream。具体操作是在一张图片中每隔一个像素拿到一个值,这个时候获得了四个独立的特征层,然后将四个独立的特征层进行堆叠,此时宽高信息就集中到了通道信息,输入通道扩充了四倍。拼接起来的特征层相对于原先的三通道变成了十二个通道,下图很好的展示了Focus结构,一看就能明白。
2、使用CSPnet网络结构,CSPnet结构并不算复杂,就是将原来的残差块的堆叠进行了一个拆分,拆成左右两部分:主干部分继续进行原来的残差块的堆叠;另一部分则像一个残差边一样,经过少量处理直接连接到最后。因此可以认为CSP中存在一个大的残差边(yolov5在主干和Neck中都是用该结构)。
3、使用了SiLU激活函数,SiLU是Sigmoid和ReLU的改进版。SiLU具备无上界有下界、平滑、非单调的特性。SiLU在深层模型上的效果优于 ReLU。可以看做是平滑的ReLU激活函数。
4、使用了SPP结构,通过不同池化核大小的最大池化进行特征提取,提高网络的感受野。在YoloV4中,SPP是用在FPN里面的,在YoloV5中,SPP模块被用在了主干特征提取网络中。(池化核大小5, 9, 13)
Neck
使用FPN+PANet对主干输出的三个特征层进行多尺度融合,结合不同尺度的特征信息。先进行上采样实现特征融合,然后再次进行下采样实现特征融合。(融合过程加入CPSNet结构)
输出层yolo Head:
Neck网络有三个给不同的尺度特征输出:8倍下采样(预测小目标)、16倍下采样和32倍下采样(预测大目标)。通过1*1卷积将特征图通道数调整为(nc+4+1),完成预测。
假设输入为(1,3,640,640),模型类别数为80,则输出层分别为(1,255,20,20),(1,255,40,40),(1,255,80,80),其中开头的1表示batch_size,(20,20)、(40,40)、(80,80)分别为3个特征层的形状大小,255=3*(80+4+1),3表示每个特征点对应的3个先验框,80为one-hot后的各类别概率,4为先验框的回归参数,1为先验框是否包含物体的概率大小。25200=3*(20*20+40*40+80*80),即一共有25200个先验框。有时模型经过转换后,输出结果为(1,2142000),其中2142000=25200*85。
预测解码
(1):模型输出的结果解码(主要包括置信度过滤,坐标、和类别)
模型预测一共25200个目标框信息,每个框包括:边界框预测的4个offsets:,
,
,
,包含物体置信度box_conf 和每个类别的置信度cls_conf。根据物体置信度box_conf过滤不包含物体的框;边界框预测需要如下解码公式得到预测框的位置以及宽高。其中cx、cy、Pw、Ph分别当前特征点坐标和宽高。(注:有时模型输出是经过位置解码,则该步骤可跳过);获取最大类别概率,可以得到边框类别。经过解码后可以得到:n个预测框的信息(x,y,w,h,box_conf,max_cls_conf)
(2):NMS
主要是对同一区域同一类别重复的框进行过滤,筛选出一定区域内属于同一种类得分最大的框。NMS对同一类别框进行操作,主要流程:
1)对所有框的置信度由大到小排序
2)取出得分最大的框做为结果集,计算其与其它所有预测框的重合程度,重合程度过大的剔除。
3)剩余框重复1)2)步骤,直到候选集为0
(3):预测框比例还原
经过(2)筛选得到就是最终的预测框,但是这些预测框的位置和尺寸是相对于模输入型的(比如640*640大小)。通常实际输入图片比模型输入图像要大,因此需要下采样到模型输入大小,一般采用letterbox操作,即将图像按最小尺度比缩放后在周围补上灰边以填充到模型输入大小,这样如果想得到实际图像上的预测框,需要对模型的预测结果进一步校正,将预测框的位置和宽高还原到实际图片。
损失计算
损失函数
Yolov5损失包含三部分:1)classification loss 分类损失2)localization loss 定位损失(预测框和真实框之间的误差confidence loss)3)置信度损失,框的目标性总损失函数为三者的和也可以在三个损失前乘上不同的权重系数,已达到不同比重的结果。在yolov5中的置信度损失和分类损失用的是二元交叉熵来做的,而定位损失是用的CIOU Loss来做的。Yolov4使用的边界框回归损失是DIOU
正样本框匹配
正样本匹配,就是寻找哪些先验框被认为有对应的真实框,并且负责这个真实框的预测。Yolov5中首先使用宽高比来确定哪些尺寸的预设框可以作为正样本,然后再进行特征点匹配。
匹配先验框:在YoloV5网络中,一共设计了9个不同大小的先验框。每个输出的特征层对应3个先验框。对于任何一个真实框gt,YoloV5直接采用高宽比进行匹配,即使用真实框和9个不同大小的先验框计算宽高比。如果真实框与某个先验框的宽高比例大于设定阈值,则说明该真实框和该先验框匹配度不够,将该先验框认为是负样本。
特征点匹配:在过去的Yolo系列中,每个真实框由其中心点所在的网格内的左上角特征点来负责预测。对于被选中的特征层,首先计算真实框落在哪个网格内,此时该网格左上角特征点便是一个负责预测的特征点。同时利用四舍五入规则,找出最近的两个网格,将这三个网格都认为是负责预测该真实框的。
损失计算
1、Reg部分,计算真实框和对应的先验框CIOU损失,作为Reg部分的Loss组成。
2、Obj部分,由第2部分可知道每个真实框对应的先验框,所有真实框对应的先验框都是正样本,剩余的先验框均为负样本,根据正负样本和特征点的是否包含物体的预测结果计算交叉熵损失,作为Obj部分的Loss组成。
3、Cls部分,真实框的种类和对应先验框的种类预测结果计算交叉熵损失,作为Cls部分的Loss组成。
注:Reg和Cls损失只使用gt和与其匹配的先验框进行计算(正样本),Obj损失计算所有先验框的(不会有负样本过多的问题吗?)。
原文链接:https://blog.youkuaiyun.com/weixin_44791964/article/details/121626848
训练改进:多正样本匹配:在之前的Yolo系列里面,在训练时每一个真实框对应一个正样本,即在训练时,每一个真实框仅由一个先验框负责预测。YoloV5中为了加快模型的训练效率,增加了正样本的数量,在训练时,每一个真实框可以由多个先验框负责预测。
参考:
损失计算详细参考:yolov5源码解析--损失计算与anchor_yolov5-6.0版本损失函数-优快云博客
Yolov5模型解读参考:Bubbliiiing博客: 睿智的目标检测56——Pytorch搭建YoloV5目标检测平台-优快云博客
Bubbliiiing视频: Pytorch 搭建自己的YoloV5目标检测平台(Bubbliiiing 源码详解 训练 预测)-主干网络介绍_哔哩哔哩_bilibili