Yolo系列总结-创新互联
以下资料由本人观看up主霹雳吧啦Wz的讲解视频总结而来,总结定有不足之处,可移步观看up主本人的视频讲解,讲的很好(给我导打个广告)
创新互联于2013年成立,先为萨尔图等服务建站,萨尔图等地企业,进行企业商务咨询服务。为萨尔图企业网站制作PC+手机+微官网三网同步一站式服务解决您的所有建站问题。文章目录- 目标检测数据集
- 目标检测常见指标
- yolov1
- 论文思想
- 网络结构
- 损失函数
- bounding box损失
- confidence损失
- classes损失
- yolov1的局限性
- yolov2
- yolov2中的尝试
- Batch Normalization
- Hign Resolution Classifier(高分辨率图像)‘
- Convolutional With Anchor Boxes(采用锚框的预测方式)
- Dimension Cluters
- Direct location prediction
- Fine-Grained Featuires
- PassThrough Layer实现此目的
- Multi-Scale Training(多尺度训练方法)
- 骨干网络
- BackBone:Darknet-19
- 模型框架
- yolov3
- 骨干网络
- BackBone:Darknet-53
- 模型框架
- 目标边界框的预测
- 正负样本匹配准则
- 损失计算
- 置信度损失
- 分类损失
- 定位损失
- yolov3-spp
- Mosaic图像增强
- SPP模块
- 模型框架
- 损失函数
- IoU Loss
- GIoU Loss
- DIoU Loss
- CIoU Loss
- Focal Loss
- 引入
- 使用Focal Loss的原因
- Focal Loss的定义
- 损失对比
- yolov4(2020 CVPR)
- 介绍
- 网络结构
- CSPDarknet53
- CSP结构
- Darknet53
- SSP(同yolov3)
- PAN结构--Path Aggregation Network
- yolov4整体网络结构
- 优化策略
- Eliminate grid sensitivity--消除grid网格的敏感程度
- Mosaic data augmentation(同yolov3)
- IoU threshold(match positive sample)--匹配正样本的IoU阈值
- Optimizered Anchors--优化锚框
- CIoU损失函数(同yolov3 SPP)
- yolov5(v6.1版本)
- 前言
- 网络结构(以yolov5-l为例)
- Back Bone:New CSP-Darknet53
- Neck:SPPF,New CSP-PAN
- Head:yolov3 Head
- Focus模块
- SPP与SPPF
- 数据增强
- mosaic(同上)
- Copy paste
- Random affine--随机仿射变换
- Mix Up
- Albumentations
- Augment HSV(Hue, Saturation,Value)
- Random horizontal flip
- 训练策略
- Multi-scale training 多尺度训练(0.5~1.5x)
- AutoAnchor(For training custom data)
- Warmup and Cosine LR scheduler
- EMA(Exponential Moving Average)
- Mixed precision
- Evolve hyper-parameters
- 其他
- 损失计算
- 平衡不同尺度损失
- 消除grid敏感度
- 匹配正样本(Bulid targets)
- yolox
- 前言
- 网络结构(以yolox-l为例)
- Anchor-Free
- 损失计算
- 正负样本匹配SimOTA
每行表示一个物体,属性有图片文件名,物体类别,边缘框,有6个值
COCO数据集,目标检测的经典数据集,80个类别,330k图片,1.5m物体
目标检测常见指标TP(True Positive): IoU>0.5的检测框数量(同一Ground Truth只计算一次)
FP(False Positive): IoU<=0.5的检测框(或者是检测到同一个GT的多余检测框的数量)
FN(False Negative): 没有检测到的GT的数量
Precision: TP / (TP + FP) 模型预测的所有目标中,预测正确的比例
Recall: TP / (TP + FN) 所有真实目标中,模型预测正确的目标比例
AP: P-R曲线下面积
P-R曲线: Precision-Recall曲线
mAP: mean Average Precision, 即各类别AP的平均值
yolov1 论文思想1.将一幅图像分成SxS个网格(grid cell), 如果某个object的中心 落在这个网格 中,则这个网格就负责预测这个object。
2.每个网格要预测B个bounding box,每个bounding box,除了要预测位置的四个参数之外,还要附带预测一个confidence值,共5个。 每个网格还要预测C个类别的分数。B一般取2
每个bounding box要预测五个值,有位置参数,confidence值(置信度)yolo独有参数,每个网格预测C个类别的分数
以上图为例,yolov1最终会得到一个7x7x30的tensor。
解释:对于一个7x7的网格来说,每个网格预测2个budding box,每个budding box包括位置信息(x,y,w,h)及confidence,再加上网格的C个类别分数,因此加起来为30
其中x,y表示预测目标框的中心坐标,范围在0-1之间,坐标相对于预测目标框,w,h表示预测目标框的坐标,相对于整个网格,范围同上
confidence定义为预测目标的budding box与真实目标budding box的交并比*Pr(object),后者取0或1,取零表示网格中不存在当前目标,取1表示网格存在当前目标。yolo中无anchor的概念,直接预测位置信息,与SSD,Fast-Rcnn的区别
最终得到的目标概率如上,既包括类别的概率,也包括预测目标框与真实目标框的交并比
网络结构未标s,默认步距为1
损失函数 bounding box损失计算损失采用的都是误差平方和的方法sum-squared error
如图,在相同偏移的情况下,无论大目标还是小目标,误差都是一样的,但对于小目标预测而言,误差很不理想,大目标却很合适,所以改用采用y=sqrt(x)的方法求误差平方和,在相同偏移的情况下这样能够使小目标的损失大于大目标的损失,从而更去关注小目标的损失,对小目标更为敏感
confidence损失classes损失将上述三个损失函数相加,得到最终的损失函数
yolov1的局限性对群体性的小目标检测结果不理想,比如一群鸟
当目标出现新的尺寸或比例时,效果不理想
主要错误原因来自于定位不准确,没有采用之前的锚框方法
从yolov2开始采取基于锚框的回归预测
yolov2 yolov2中的尝试 Batch Normalization添加BN层,能够达到将近%2的mAP提升,有利于训练收敛,起到对模型的正则化作用,可以不再使用dropout层
Hign Resolution Classifier(高分辨率图像)‘采用448x448的输入,能够带来将近%4的mAP提升
Convolutional With Anchor Boxes(采用锚框的预测方式)基于锚框的偏移使得网络更易学习,简化yolov1中的问题,对于mAP会有轻微我的下降,但召回率提升很大,说明网络有很大的提升空间
Dimension Cluters采用k-means聚类方法获取anchor
Direct location prediction让每个anchor去负责预测目标中心落在某个grid cell(网格单元)区域内的目标 ,限制在感受野内
Fine-Grained Featuires通过passthrough layer使相对底层的特征图和高层的特征图进行融合,从而提升小目标的检测效果
PassThrough Layer实现此目的例子:4x4变成4通道的2x2
Multi-Scale Training(多尺度训练方法)在迭代若干次后,将网络输入的图片随机修改成其他尺寸
原论文中采用的是加32的整数倍来改编输入尺寸
骨干网络 BackBone:Darknet-1919代表有19个卷积层
模型框架Filters:卷积核个数 Size:卷积核大小 无标注默认步距为1
Convolution中的Conv2d无偏置
最后的conv2d就是单纯卷积,没有BN,没有激活函数
x5表示一个目标会生成5个anchor,每个anchor有位置参数和类别分数
yolov3 骨干网络 BackBone:Darknet-53有53个卷积层,每个框是一个残差结构,没有大池化层,下采样基本都是卷积层来实现的,卷积层替代大池化下采样提升的原因是卷积层的参数是可以学习的
每个Convolutional由如下部分组成:
无偏置参数
在coco数据集上训练,由于会选取三个不同尺寸的anchor模板,因此会输出三个尺度的tensor,每个tensor有85个参数,4个位置参数,一个confidence,80个类别分数
模型框架从Dark-net53中输出进入以下结果
concatenate均是在通道维进行拼接
共产生三个输出,预测输出1是13x13的,预测相对较大我的目标;
预测输出2是26x26的,预测相对中等的目标;
预测输出3是52x52的,预测相对较小的目标;
目标边界框的预测目标中心点的参数并不是相对于anchor的,而是相对于当前整个cell的左上角点,虚线框表示实际的目标框,蓝色框表示预测的目标框,当卷积操作到红色标出的cell中,就产生如下计算,其他cell亦然
bx,by的范围都是在cell之内的,预测的目标框的中心点限制在当前cell中
这样做,可以加快网络的收敛
正负样本匹配准则GT中心点所在的那个cell的AT2被预测为正样本
当三个anchor的模板IoU均大于设定的阈值(上图是0.3)时,会将该cell的三个AT均归纳为正样本,扩充正样本的数量
损失计算置信度损失对于每个bounding box的目标分数使用逻辑回归计算,采用二值交叉熵损失
pytorch当中的有nn.BCE函数
分类损失同样采用二值交叉熵损失计算,并用sigmoid激活函数输出,得到的概率是相互独立的
定位损失采用的是预测值与真实值的差值再平方的计算方法,类似MSE,在后续的yolo网络中并不是这个损失函数
BN层用于计算每一个特征层的均值和方差,batch_size越大,得到的均值和方差就更接近整个数据集的均值和方差,但受限于硬件,batch_size是有增长局限的。因此,将多张图片拼接在一起输入网络,可变相地增加了输入网络的batch_size,更好的接近整个数据集的均值与方差
SPP模块输入一共分成了四个分支,一个直接接到输出,一个进行5x5的大池化,一个进行9x9大池化。一个进行13x13的大池化,步距均为1,池化之前会对特征矩阵做padding填充,经过上述操作后各个分支的高宽和通道数都不变,最后作拼接,得到通道数x4的特征矩阵
SSP模块3个和1个的比较,随着输入尺寸越来越大,3个SPP模块的效果要更好一些,但是推理时间相应地会增加
模型框架与yolov3的区别在于在第一个预测输出之前加了SPP模块
该网络输入图像是512x512的RGB图像
右上角第三种的交并比最高,效果最好,且三者L2损失一样
IoU损失函数红框所示,或者是1-IoU
相比L2 Loss,用IoU Loss可以更好反映重合程度,具有尺度不变性,即无论矩形框是大是小,重合程度与矩形框的尺寸是无关的
缺点就是两个框不相交时IoU为0,IoU Loss会趋向于无穷大
GIoU Loss绿框表示真实的目标框,红色表示网络预测的目标框,蓝色框表示能涵盖绿框和红框并集的最小框,Ac表示蓝框的大小,u表示绿框和红框的并集大小,当绿框和红框重合程度越大,IoU越趋近于1,后面分式越趋近于0,GIoU越趋近于1;相反,绿框和红框距离无限拉远,IoU越趋近于0,分式越接近1,GIoU越趋近于-1
缺点:在高宽比相同以及两框处于水平、垂直的位置关系时,会退化成IoU
改进原因:IoU Loss收敛太慢;GIoU回归不准确
绿框是真实框,黑色表示一个初始的训练框,蓝框表示基于黑框不断迭代接近真实框的预测框
DIoU在更少的迭代次数下,拟合更准确,右侧表示的三种情况,前两种IoU已经无法反映三者之间的差别了,但DIoU可以
b表示预测框的中心点坐标,bgt表示真实框的中心点坐标,d是这两个中心点的欧氏距离,c表示两框最小外接矩形的对角线长度
CIoU Loss在DIoU基础上加上长(高)宽比
原论文提到使用Focal Loss反而mAP降2个百分点
Focal Loss都是针对One-stage object detection model的,如SSD,yolo,但会出现Class Imbalance,即正负样本不匹配的问题
一张图像中能够匹配到目标的候选框(正样本)个数一般只有十几个或几十个,而没匹配到的候选框(负样本)大概有10的4次幂-105次幂个,在这10的4次幂-10的5次幂个未匹配到目标的候选框中大部分都是简单易分的负样本(对训练网络起不到什么 作用,但由于数量太多会淹没掉少量但有助于训练的样本)
例如下图的红色框和黄色框的数量比较
通过hard negative mining的方法筛选正负样本,寻找Loss较大的负样本,但是效果没有使用Focal Loss的效果好
使用Focal Loss的原因当为正样本时,α取1,负样本时α取-1,α用于平衡正负样本的权重
Focal Loss的定义α无法区分哪些是容易的样本,哪些是困难的样本,因此提出损失函数,降低简单样本的权重,聚焦去训练难以分辨的样本,引入1-Pt的γ次幂
1-Pt的γ次幂可以降低易分样本的损失贡献
最终公式:
γ是超参数,α是平衡因子,γ、α分别取2,0.25时,mAP最高
损失对比p–预测概率 y–取1表示正样本,取0表示负样本, CE–交叉熵损失 FL–论文提出的损失
rate–两种损失的比值
α=0.25,γ=2的情况下
蓝色两行表示易分类的正样本;红色两行表示易分类的负样本;采用FL确实降低易分样本的权重
后两行表示难学习的正负样本,FL可以更好的学习难学习的样本
缺点:调参的影响大,训练集要标注准确,易受噪音干扰
yolov4(2020 CVPR) 介绍网络结构 CSPDarknet53 CSP结构CSP结构作用:增强CNN的学习能力;移除计算瓶颈;降低显存使用
part1和part2通道数均减半,part2经过两个ResBlock再接ConvBNMish,然后拼接输出,如上图所示
Darknet53Mish激活函数:Mish=x * tanh(ln(1+e^x))
Mish激活函数无边界(即正值可以达到任何高度)避免了由于封顶而导致的饱和。理论上对负值的轻微允许允许更好的梯度流,而不是像ReLU中那样的硬零边界。
mish函数具有以下几个特点:1、无上限,但是有下限;2、光滑;3、非单调
与其他激活函数比较
ConvBNMish结构由一个卷积层,一个BN层,一个Mish激活函数组成
ResBlock主分支是一个1x1、步距为1的ConvBNMish加上一个3x3、步距为1的ConvBNMish,
然后在输出端与输入端进行通道维的拼接
在DownSample1中的CSP结构中,两分支的通道数并未减半,之后的DownSample才开始减半
SSP(同yolov3) PAN结构–Path Aggregation NetworkFPN模块:将高层的语义信息与低层的融合
在此基础上加上一个模块,该模块是将低层的语义信息与高层的融合,就是PAN模块
另外不同的是,原始PANNet中,特征层与特征层的融合采用的是相加的方法,而yolov4采用的是通道维相加的方法
yolov4整体网络结构优化策略 Eliminate grid sensitivity–消除grid网格的敏感程度上图会有极端情况,即gt box的中心点落在grid的顶点时,我们希望网络预测的tx,ty是0,
但sigmoid函数在x趋向于负无穷时才会到0,这种数值网络一般无法达到
下图引入缩放因子来解决这个问题,但会导致预测中心点出框的问题(未解释)
最后两行是yolov5中的公式,y取到的范围更广,y对x更加敏感了
Mosaic data augmentation(同yolov3) IoU threshold(match positive sample)–匹配正样本的IoU阈值通过之前的消除grid网格敏感度,可以得到更多的正样本数量,上图所示三个网格的AT2都会对应成正样本,根据上面提到的右下角公式可以推断左上角的网格不在内,因为左上角点与黑点的x,y偏移量是超过公式提供的值域的,因此不算在内
右下角极端情况,x,y偏移量分别刚好等于0.5,1.5,这时只采用刚好落入该grid cell的anchor框,yolov5中这种cell的扩散都是上下左右方向的,不会有斜对角
Optimizered Anchors–优化锚框CIoU损失函数(同yolov3 SPP)yolov5(v6.1版本) 前言右上角主要针对输入分辨率是640x640的图片,下采样倍率大达到32倍,与之前的一样,预测特征层也有三层
左下角主要针对输入1280x1280的图片,更高分辨率,下采样倍率大达到64倍,预测特征层有四层
性能对比
输入的特征层每2x2大小化成一个patch,然后标注四个位置,然后画出若干个这样的patch,然后将每个patch中位置一样的块拼成新的特征层,如此一来,原来的输入特征层高宽减半,通道方向翻了4倍,再接上一个3x3的卷积层
池化部分并行改串行,每一个串行都等价于一个并行模块,采用更小的卷积核,计算量也会更小
数据增强 mosaic(同上) Copy paste不同图像的目标复制粘贴,前提是数据集中必须要有每个目标的实例分割标签
Random affine–随机仿射变换包括旋转、平移、缩放、错切
Mix Up将两张图片按一定透明程度混合成新图片
滤波,直方图均衡化,改变图片质量,源代码默认不使用
Augment HSV(Hue, Saturation,Value)调节色度,饱和度,明度
Random horizontal flip水平随机翻转
训练策略 Multi-scale training 多尺度训练(0.5~1.5x)比如训练输入图片是640x640,那么实际训练图片大小是在0.5x640到1.5x640之间的,随机取值,且取32的整数倍(受下采样的倍率影响)
AutoAnchor(For training custom data)一般自己数据集启用,数据集的目标大小与常见的数据集目标差异过大时,建议采用,他会自动生成新的anchor,迁移学习时该方法不可用
Warmup and Cosine LR scheduler以cos函数的形式改变学习率
EMA(Exponential Moving Average)相当于给学习的变量增加动量,更新参数会更加平滑
Mixed precision混合精度训练,可减少GPU显存占用,理论减半,加速两倍训练,适合非常大型网络模型的训练,需要GPU支持该方法
Evolve hyper-parameters炼丹,建议采用官方的超参数
其他 损失计算λ是超参数,平衡因子
平衡不同尺度损失对每个目标的权重设置
P3–小目标
P4–中等目标
P5–大目标
消除grid敏感度tx,ty – 网络预测的目标中心点相对于当前grid cell左上角的偏移参数
cx,cy – 当前grid cell左上角的坐标
问题仍然是目标中心点落在grid cell边界上时所产生的正无穷和负无穷的问题
解决方法引入缩放因子,同yolov4
另外的变换,对高宽进行改进
修改原因:https://github.com/ultralytics/yolov5/issues/471
th,tw过大会出现指数爆炸,训练不稳定的情况,改用之后,限制在0~4之间
匹配正样本(Bulid targets)先计算gt与每个anchor的高度和宽度比值
然后求rw-max和rh-max,计算gt与anchor在高度和宽度方向的差异,差异越小,这两个数据越接近于1
最后计算在高度和宽度方向差异大的比例
设立阈值anchor-t,若r-max小于anchor-t,则匹配成功,anchor-t的取值是跟上面的缩放后的值域有关
后续步骤与yolov4一致
通过之前的消除grid网格敏感度,可以得到更多的正样本数量,上图所示三个网格的AT2都会对应成正样本,根据上面提到的右下角公式可以推断左上角的网格不在内,因为左上角点与黑点的x,y偏移量是超过公式提供的值域的,因此不算在内
右下角极端情况,x,y偏移量分别刚好等于0.5,1.5,这时只采用刚好落入该grid cell的anchor框,yolov5中这种cell的扩散都是上下左右方向的,不会有斜对角
yoloxAnchor-Free思想(Fcos网络用过)
decoupled detection head–解耦检测头
advanced label assigning strategy(SimOTA)–更好的正负样本匹配的策略
前言网络结构(以yolox-l为例)它是基于YOLO v5构建的,所以Backbone以及PAN部分和YOLO v5是一模一样的,注意这里说的YOLO v5是对应tag:v5.0
版本的(开头有focus模块,中间用的是SPP结构),而我们之前讲的YOLO v5文章中是tag:v6.1
版本,所以在Backbone部分有些细微区别
除了右边的三个检测头,剩下的部分都是yolov5-l
采用解耦和耦合的检测头的对比,新的检测头参数是不共享的,Focus中是共享的
乘4代表只预测四回参数,不需要再乘以anchor模板个数,anchor-free的网络特点
Anchor-Free与yolov4、v5相比,四个参数的计算去除了anchor的高宽参数,凸显anchor-free思想
不考虑anchor
损失计算检测头有三个分支,分类分支Cls,回归分支Reg,以及Obj分支(正样本gt标签为1,负样本gt标签为0)
Anchor-Point—由于是anchor-free方法,这指的是特征图中的每一个grid-cell,Npos代表的就是被分为正样本的grid-cell个数
正负样本匹配SimOTASimOTA是由OTA(Optimal Transport Assignment)简化得到的,OTA也是旷视科技
同年出的一篇文章,论文名称叫做《Optimal transport assignment for object detection》
目的是将匹配正负样本的过程看成一个最优传输问题。
消融实验均基于yolov3比较
计算cost时需要进行预筛选,否则计算成本会很高
fixed center area–通过计算得到这个区域框,该区域框与GT box的重合部分的anchor-point(图中黄色√) 右侧公式除了类别损失和回归损失之外,还加了一项
对交集区域取反,也就是图中黑色√的anchor point,在其前乘以一个很大的参数,这里是10万
这样在最小化cost的过程中,就会逼迫优先选择交集之内的anchor point,不够时再选取黑色的部分
表1:将每个anchor point与gt计算cost,得到一个cost矩阵
IoU是每个anchor point预测的目标边界框和每个gt之间的IoU,这个数值在计算回归损失时会得到
n_candidate_k = min(10, ious_in_boxes_matrix.size(1)) 在10和anchor point个数之间取最小,上图得到的是6,根据IoU选取前六个anchor point得到表2
dynamic_ks = torch.clamp(topk_ious.sum(1).int(), min=1)
针对每个gt所分配的正样本个数是不一样的,是动态计算得到的
对每一行求和再去整(向下取整),也就是说对gt1,有三个anchor point与之对应,gt2同理,
计算得到每个gt的dynamic_ks之后,根据dynamic_ks以及cost分配对应的Anchor point,根据最小化cost原则,选取cost表(表1)中三个最小的cost值所对应的anchor point
以上图为例,gt1选取A1 A2 A5, gt2选取A3 A4 A5,进而得到anchor point分配矩阵,如下图
这里A5对gt1和gt2都是正样本,为了消除歧义,此时需对比一开始计算的cost矩阵,将anchor point分配给cost较小的那个gt,上图gt2更小,因此A5的真实标签就是gt2,得到下图
此时,就已经找到了所有的正样本,也就是将gt分配给了对应的anchor point,其他均为负样本
正负样本匹配完之后,便可计算损失
你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧
文章题目:Yolo系列总结-创新互联
文章地址:http://ybzwz.com/article/hghod.html