首页 > 其他分享 >m15

m15

时间:2022-10-12 23:55:08浏览次数:43  
标签:GT 置信度 卷积 损失 gt m15 anchor

一阶段模型(yolo系列)

【yolo1】

 

 

1、图像归一化为448x448x3,然后通过一堆卷积层,生成7x7x30的特征图:

7x7是把原图(448x448)划分为7x7的网格,30是一个网格对应1个30维度的向量,针对一个格子(1x1x30的向量)而言

产生2个长宽比不同的anchor,面积一样,中心是格子中心

每个 anchor 有5个数值(位置变换的值,是否检测到物体的置信度),2个anchor共10个值,如果物体的中心(GT的中心点)落在该网格内(yolo1假设网格内最多有1个物体中心),则该物体分别属于20个具体类别的概率

所以总共是5+5+20=30,即向量厚度

训练时:

anchor的置信度标签为:

在这里插入图片描述

若有个物体中心落到该网格里了,第一项为1,第二项为落进来的GT与该anchor的 IOU 值,所以若有物体,则置信度标签=iou(注意不是1),若没物体,置信度标签为0,2个anchor中与GT 的IOU最大的anchor独家的负责该物体(不管具体什么类别,1个GT只有1个anchor负责)

损失函数为

 

 

 

其中两个求和表示遍历所有网格的所有anchor,前两个损失是针对独家负责GT的回归损失(负责的系数是1,不负责的系数是0),回归损失中给宽度高度加根号是使得对小物体的检测更重视

第3个损失针对独家负责GT的置信度损失,第4个损失针对不负责GT的置信度损失,第5个损失针对网格里有落入物体的具体类别损失

2、测试

计算每个anchor的class-special confidence score:该anchor 的confidence  x  所在网格的最大具体类别概率,并定义该anchor检测到的物体(yolo1假设就1个物体)就属于最大具体类别,设置一个阈值,去掉得分低的anchor,再进行NMS

 【yolo2】

1、去掉全连接层,节省很多参数,防止过拟合 2、去掉dropout,每层卷积后加上BN,使得每层都归一化 3、将预训练分成两步:先用224*224的图片从头开始训练网络,大概160个epoch(表示将所有训练数据循环跑160次),然后再用 448*448的图片,再训练10个epoch。注意这两步都是在ImageNet数据集上操作,能让模型适应不同的分辨率图片 4、在新数据集上,用416*416归一的输入代替原来448*448,经过5次maxpooling之后得到13*13(416/32=13)大小的特征图,并以此特征图(网格划分从7x7变为13x13)采用卷积做预测:416的原因在于希望得到的特征图都有奇数大小的宽和高(13),奇数大小的宽和高会使得每个特征图在划分cell的时候就只有一个center cell(比如可以划分成7*7或9*9个cell,center cell只有一个,如果划分成8*8或10*10的,center cell就有4个)。为什么希望只有一个center cell呢?因为大的object一般会占据图像的中心,所以希望用一个center cell去预测,而不是4个center cell去预测。 5、采用很多3x3的小卷积:参数量少,感受野大 6、把1 * 1的卷积核置于3 * 3的卷积核之间,用于先压缩厚度再变长厚度,传递参数,同时减少参数量 7、对所有的GT进行聚类,两个GT框越重合则距离越小,距离定义为:

 设定聚类的 k 为5,最终得到 5 个GT框,就得到了 5 个长宽,此时每个格生成5个anchor,anchor 中心的格子的中心,anchor 长宽是这个5个长宽

8、为了使得预测的位置变换值不至于变的太远(训练初期容易变的离谱),把变换的anchor中心点,只局限于格子里面,位置变换公式做了修正:

先把GT框映射到特征图上作为蓝色框,GTx=GTx/32,GTy=GTy/32,GTw=GTw/32,GTh=GTh/32

黑色虚线框是预测的anchor(特征图的尺度),cx,cy是从左上角开始第几个格子了,x和y的预测值还要再经过 sigmoid,才能作为x和y方向的位置变换预测值,标签是GTx-cx,GTy-cy

w和h的标签=log(GTw/pw),log(GTh/ph)

 

 

 9、将大感受野和小感受野进行的特征融合

将前面的特征图拆成长宽都是13的几条,然后把这几条和最后的13x13x1024的拼在一起

 

 

 10、多尺度训练,使得模型学会适应不同的尺度:对于新数据集,每过一定的迭代次数,就 resize 成不同的大小{320...416...608},由于没有全连接层,输入大小可以不固定

【yolo3】

 

1、输入416x416大小的图片

2、Darknet53 去掉池化、全连接,采用卷积+残差模块,下采样用 stride=2 实现,分别得到原图像1/8(大小:52×52)、1/16(大小:16×26)、1/32(大小:13x13)的特征图

最上面的分支输出:13×13×255特征图,同时特征融合:给一个分支进行上采样,下中间的分支拼接,这是为了把一些全局信息传给下面的...

最后三个分支分别输出13×13×255(Y1)、26×26×255(Y2)、52×52×255(Y3)的特征图

3、生成 anchor

对 GT 聚类,k=9,最后按照面积大小降序排练,最大的三个框的长宽作为13x13特征图每个像素的anchor长宽,此时对原图划分为13x13的网络,以格子中心作为anchor的中心,按照3种长宽生成三个anchor,此时每个格子就生成了3个anchor

13x13x255的255 = 3个anchor x (5+80),即每个anchor有85维度向量

训练时,GT在3个特征图提供的所有anchor中找到离自己IOU最大的anchor,该 anchor 负责该GT,anchor向量的前4维度的标签是该anchor与GT的位置偏移值,计算一个MSE损失loss1

该anchor向量的第5维值的标签 = 1* 该anchor与该GT的IOU值,计算一个MSE损失作为loss2,该anchor向量的最后80维度的值表示检测到的物体属于80个类别概率,实现的是多标签的分类,这个概率不是用softmax算的,而是对每个类单独用sigmoid算的,如果GT标的类是:{狗,斑点狗},则标签则是{0,0,1,0,1},2个对应地方的 -log 加起来作为loss3(基于交叉熵)

对于没有负责GT的 anchor,意味着检测到的是背景,只计算第5维度的损失,第5维度的标签是0,损失就是 -log(1-预测值),作为 loss4(基于交叉熵)

总loss就是=loss1+loss2+loss3+loss4

4、预测

把每个anchor第5维度的值降序排列,去掉值小的,剩下的按照前四维度做位置修正,然后根据80个类别预测值,设置一个阈值,有多少类别预测值比阈值大,就预测该物体同时具有这几个类别,最后NMS

 

【yolov5】

yolov5 和下图的 yolov4 结构差不多

 

改进的点:

1、输入端

Mosaic数据增强:假定图像输入大小是640*640*3,随便选3张图片和当前图片组成4张小图,小图都进行放缩,在1280*1280的大图中心点附近随便取一点做中心点,然后把4个小图凑到中心点处,重新调整小图的标签检测框的位置,超出边界的检测框让它边界置零,对大图和它的标签随机旋转、平移、缩放、裁剪,最后再放缩回 640*640*3,新图就有了很多小目标,因此大大丰富了小目标的数据集,让网络的鲁棒性更好

SAT数据增强:给图像添加随机噪声

dropblock :使用一个矩形随机遮住图像的一块(数据增强的作用)以及后续的所有特征图上(正则化作用,因为在全连接层上效果很好的Dropout在卷积层上效果并不好,卷积层仍然可以从相邻的激活单元学习到相同的信息。)

2、网络结构

以yolov5n为例,分为 backbone 和 head,head 类似于 yolov4 的head + prediction,它们主要由下面的模块组成

cbl:类似于yolov4的CBM,卷积+bn+SILU激活函数,SiLU 的一个吸引人的特点是它具有自稳定特性:

Bottleneck:是一个残差模块,输入经过2个cbs,再加上输入

C3:类似于yolov4的CSP,上面通过 cbs+n 个 Bottleneck,下面通过1个cbs,两者通过Concate合并,最后再通过 1个csb

SPPF:类似于yolov4的SPP,先通过cbs,然后并行4个最大池化(未池化,池化1次,池化2次,池化3次),四者通过Concate合并,最后再通过 1个csb,目的是分离不同的感受野。

上下采样操作:为了特征图融合

 Focus:将输入进行划分,使得长宽变小,厚度边大,然后通过一个卷积层,目的是加速计算

 Detect :类似于 yolov4 的 prediction ,并行三条线,分别通过3个卷积层,输出3个不同wh的特征图

 

3、损失

模型最后生成(假如1个图片):3个特征图80*80,40*40,20*20,对于80*80特征图,每个格子生成3个anchor(检测框),每个anchor对应 7 个数=(5+2个类别)

处理 gt 和 anchor的配对:假设一张图片的真实gt有20个,先后放缩到3个特征图上,每个特征图都有20个gt,针对其中一个特征图,gt 复制3份,此时每个 gt 中心的所属格的anchor 负责该 gt

把和anchor的宽高比相差很大的gt去掉,对于剩下的gt,再复制三份,假如该 gt 中心在格子中偏向左上,那么这三份 gt 的3个负责anchor是:一份是原先负责的 anchor,一份是上一个格子的同比例anchor,一份是下一个格子的同比例anchor,gt 和 anchor 的中心坐标是以 anchor 所在格子的左上角为原点来表示的,这个操作目的是用3个anchor(分别来自于3个格子)对同一个gt进行拟合

gt 和 负责它的anchor要计算三个损失:回归损失、类别交叉熵损失(1个anchor可能分别预测了多个类,每个类的概率个算个的,加起来不一定是1,即1个 gt 可以有多个类,然后损失就是每个类的交叉熵损失的平均值)、置信度损失(anchor的预测置信度 与 anchor和gt的ciou 做交叉熵),然后把这三个损失按照权重加起来作为该 gt 的综合损失,最后3个特征图的所有 gt 的综合损失加起来作为总损失

其中一个 gt 和 负责它的anchor 的回归损失计算方法:

将 anchor 预测的 cx,cy 通过 pxy.sigmoid() * 2 - 0.5 映射到[-0.5,1.5]区间内,这是因为gt的中心坐标值就在这个区间内

将 anchor 预测的 w,h 通过 (pwh.sigmoid() * 2) ** 2 * anchors 映射到[0,4]区间内再乘以anchor大小,这是对预测的负数能进行处理,加速收敛

采用CIOU代替 yolo3 的 MSE的位置损失,它能考虑:重叠面积、中心点距离、长宽比,公式:

 

其中,w、h和w(gt)、h(gt)分别代表预测框的高宽和真实框的高宽,p(A,B)是两个框中心点的欧氏距离,c是两个框的最小包裹框(同时包含两个框且最小)的对角线距离 

4、预测

读取图片im0s,经过pad,resize,HWC to CHW, BGR to RGB 到 n*640(n比640小就行,或者 640*n)大小(网络卷积不要求固定输入),归一化 :0 - 255 to 0.0 - 1.0;视频的话是遍历处理每一帧,然后一帧一帧地写到同一个视频文件中

对1个图片而言,得到预测的 17640个检测框,每个检测框对应 85=80(类别概率)+5(置信度,回归值)

先根据检测框的置信度是否大于conf_thres=0.25过滤掉检测框,取检测框概率最大的类别,如果类别概率大于conf_thres=0.25,则该检测框保留,最后用 NMS 得到 剩余的检测框,每行是一个检测框,对应 4个位置,预测的类概率,预测的类编号

此处的 nms 变为DIOU_nms(在测试过程中,并没有groundtruth的信息,不用考虑影响因子,因此直接用DIOU_nms即可,不需要CIOU_nms):把IOU换成如下公式,不仅能考虑IOU,还能考虑中心点的距离

 将相对于 n*640(n比640小就行,或者 640*n)的检测框还原到原始图片大小,在原图上画上检测框,标上类和概率
5、map 指标

[email protected]: 将IoU阈值设为0.5时,计算每一类的AP(pr曲线下的面积),然后所有类别求平均,即mAP,iou 阈值越大,预测的正确的东西越少,map越低

计算每一类的AP:

TP:检测器输出的结果中正确的个数

FP:检测器输出的结果中错误的个数

FN:ground truth中未被找出的个数

FN = ground truth总数 - TP

正确的意思:检测框与某个 gt 的 iou >iou阈值  且  检测框的置信度大于该类的置信度阈值

不同 置信度阈值 对应不同的pr点,连起来形成 pr 曲线 ,求该曲线下的面积

 

【yolov6】

yolov6 和 yolov5 整体结构类似,模型的具体模块不同:CBL,REP-I,REP-II(两个都属于RepVGGBlock),RVB1_X,RVB2_X,RVB3_X,SPPF,Head-Detect,网络结构上最大改进是Head-Detect,将anchor 的置信度,4个回归值,分类概率解耦为3个部分,以提高收敛速度。

 

【yolo7】

基本结构类似5版本,具体组件不同,backbone主要是使用ELAN和 MP 结构,MP同时使用了max pooling 和 stride=2的conv,neck & head采用 SPPCSPC,ELAN-W,mp,rep

 

 

 

标签:GT,置信度,卷积,损失,gt,m15,anchor
From: https://www.cnblogs.com/pjishu/p/16786586.html

相关文章