title: yolov3算法理解
date: 2021-11-21 14:45:42
tags:
toc: True
本贴记录自己学习完yolov3算法的后的个人理解
首先我们来了解一下yolov3算法物体检测的具体流程:
- 前向传播:
- 对数据集图片进行处理,padding成为大小形状相同的图片,并对数据进行增强操作(注意:处理完后需要对label中的(tx,ty,tw,th)进行相应的修改,且在label中增加置信度初始化为0)
- 将图片放入darknet53网络,输出三个不同规格的特征图依次为(1313),(2626),(52*52)分别用来检测大,中,小三个尺寸的物体。
- 将特征图中的数据转化为Tensor,计算sigmoid函数得到tx,ty,tw,th,confidence,cls
- 通过偏移量计算公式:
计算得出pre_x,pre_y,pre_w,pre_h.(为了计算iou)
- loss的计算:
- 将label转换成为tx,ty,tw,th,confidence,cls相同的格式(为了能计算loss),并通过gt得出obj_mask,noobj_mask数组,(有物体的grid_cell,obj_mask为1,没有物体的grid_cell,[noobj_mask]为1)
- 通过pre_x,pre_y,pre_w,Pre_h和gt_bbox计算iou,将没有物体但是iou大于thresh的grid_cell重新设置为1,(即:即使该grid_cell中没有物体,但是产生的预测框还可以,则让他接着回归计算loss)
- loss = 位置误差+分类误差+obj置信度误差+noobj置信度误差(对与obj_mask=0的grid_cell不计算位置误差)
- 反向传播,优化模型权重参数。
yolov3主要改进
-
- 使用了darknet53骨干网络,有更好的特征提取能力,增强了对于小物体的检测能力
-
- 设置了三种不同规格的anchor,三种scale,每种分配三种不同尺度的anchor
-
- 使用了不同特征融合,融合不同尺度的特征,增加模型对不同尺度物体的检测
-
- 对于softmax进行改进,将多分类任务分解为多个二分类进行判断(sigmoid)
1.Darknet53主干网络
在yolov3中使用了darknet53骨干网络,相比与v2中的darknet19增加了残差链接
模块,并使用3*3,strid=2,padding=1的卷积层代替了原有的MAXPOOL层,采用全卷积层搭建网络。将13*13的feature map进行两倍上采样和26*26的进行拼接,26*26的featuremap上采样和52*52的进行拼接,将浅层网络的细粒度像素结构信息和深层网络的抽象化语义信息进行融合。增强模型对于物体的检测。
注意:使用11卷积减少训练参数,最后输出的feature map通道数为(3(80+5)) = 255
这里附上一张别人的流程图 地址
2. 偏移量的计算
这里sigmoid函数的作用:将预测框中心锁定在真实框内部,加快网络在前期的收敛速度。
后面计算loss的时候,通过对该公式反向推导,得出tx,ty,tw,th的值和网络输出的x,y,w,h计算损失。
3.使用k-means聚类得出anchor
yolov3在coco数据集上沿用了v2的k-means聚类得出9中不同的anchor,将其分为三组,分别用来预测大中小三种不同规格的物体。
4.loss计算
对于有物体的grid_cell计算位置误差,对于没有物体的grid_cell仅计算置信度误差
注:yolov3中仅将真实物体中心所在的grid_cell视作有该物体,其余的都认为没有。且当一个grid_cell恰好有多个形状近似的物体时,yolov3默认覆盖掉前一个物体的信息。
对于位置误差使用使用MSE损失函数,并乘以(2-w*h)项增加了模型对小框的惩罚力度,对于置信度和分类误差使用BCE损失函数,两两计算然后求和得出
好啦,yolov3差不多就结束了,如果有地方有错误的麻烦帮忙提出来一下,谢谢
版权声明:本文为CSDN博主「shier_smile」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/m0_57459724/article/details/121457234
暂无评论