YOLOV5学习笔记(一)——原理概述
目录
博主创建了一个科研互助群Q:772356582,欢迎大家加入讨论。
一、目标检测概述
1.1 数据集介绍
- PASCAL VOC
- MS COCO
1.2 性能指标
1.2.1 混淆矩阵
1.2.2 IOU(边界框回归)
IOU=1 是完全重叠
根据IOU设置的阈值来判断是TP还是FP ,比如重叠为0.5
1.2.3 AP&mAP
AP是衡量学习出来的模型在每个类别上的好坏
mAP是衡量学习出来的模型在所有类别上的好坏是AP的平均值
- 不同数据集对于AP和mAP的概念还是不同的
- AP计算
1.2.4 检测速度
1.3 YOLO发展史
1.3.1 算法思想
- yolov3框架图
先经过卷积神经网络得到特征图像,之后对图像进行网格划分,每个网格单独进行画框检测和类别的概率图,最终得到结果。
每个小框内包含了边界框坐标、目标得分和类别得分
- 多尺度融合
经过卷积神经网络可以得到不同大小的特征图,对不同大小的特征图进行融合利于小目标的检测。
图片卷积经过32倍下采样得到19*19的图片,每个网格都会单独预测和画锚框
预先设定一些边界框的大小 ,每个尺度都有若干个锚框
- 损失函数
1.3.2 YOLOv5网络架构
一个网络往往有主干网络(Backbone)+颈部(Neck)+头部(Head)组成
可视化
pip install onnx>=1.7.0 -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install coremltools==4.0 -i https://pypi.tuna.tsinghua.edu.cn/simple
python models/export.py --weights weights/yolov5s.pt --img 640 --batch 1
yaml文件
# YOLOv5 🚀 by Ultralytics, GPL-3.0 license
# Parameters
nc: 10 # number of classes
depth_multiple: 0.33 # model depth multiple 控制模型的深度用来控制模型的深度,仅在number≠1时启用。 如第一个c3层(c3具体是什么后续介绍)的参数设置为[-1, 3, c3, [128]],其中number=3,表示在v5s中含有1个c3(3*0.33)
width_multiple: 0.50 # layer channel multiple 用来控制模型的宽度,主要作用于args中的ch_out。如第一个conv层,ch_out=64,那么在v5s实际运算过程中,会将卷积过程中的卷积核设为64x0.5,所以会输出32通道的特征图。
#通过这两个参数可以不同的模型设计
#边界框的设置
anchors:
- [10,13, 16,30, 33,23] # P3/8
- [30,61, 62,45, 59,119] # P4/16
- [116,90, 156,198, 373,326] # P5/32
# YOLOv5 v6.0 backbone
backbone:
# [from, number, module, args]
#from:当前模块输入来自那一层的输出,-1代表从上一层获得
#number: 代表本模块重复的次数
#model:表示网络模块的名称,具体细节可以在./models/common.py查看,如conv、c3、sppf都是已经在common中定义好的模块
#args:表示向不同模块内传递的参数
[[-1, 1, Conv, [64, 6, 2, 2]], # 0-P1/2 #64代表通道数,3表示3*3的卷积核,2代表步长为2,2表示分两组卷积
#input:3x640x640
#[ch_out, kernel, stride, padding]=[64, 6, 2, 2]
#故新的通道数为64x0.5=32
#根据特征图计算公式:feature_new=(feature_old-kernel+2xpadding)/stride+1可得:
#新的特征图尺寸为:feature_new=(640-6+2x2)/2+1=320
[-1, 1, Conv, [128, 3, 2]], # 1-P2/4
[-1, 3, C3, [128]],
[-1, 1, Conv, [256, 3, 2]], # 3-P3/8
[-1, 6, C3, [256]],
[-1, 1, Conv, [512, 3, 2]], # 5-P4/16
[-1, 9, C3, [512]],
[-1, 1, Conv, [1024, 3, 2]], # 7-P5/32
[-1, 3, C3, [1024]],
[-1, 1, SPPF, [1024, 5]], # 9
]
#sspf模块将经过cbs的x、一次池化后的y1、两次池化后的y2和3次池化后的self.m(y2)先进行拼接,然后再cbs提取特征。 仔细观察不难发现,虽然sspf对特征图进行了多次池化,但是特征图尺寸并未发生变化,通道数更不会变化,所以后续的4个输出能够在channel维度进行融合。这一模块的主要作用是对高层特征进行提取并融合,在融合的过程中作者多次运用最大池化,尽可能多的去提取高层次的语义特征。
# YOLOv5 v6.0 head
head:
[[-1, 1, Conv, [512, 1, 1]],
[-1, 1, nn.Upsample, [None, 2, 'nearest']],
[[-1, 6], 1, Concat, [1]], # cat backbone P4
[-1, 3, C3, [512, False]], # 13
[-1, 1, Conv, [256, 1, 1]],
[-1, 1, nn.Upsample, [None, 2, 'nearest']],
[[-1, 4], 1, Concat, [1]], # cat backbone P3
[-1, 3, C3, [256, False]], # 17 (P3/8-small)
[-1, 1, Conv, [256, 3, 2]],
[[-1, 14], 1, Concat, [1]], # cat head P4
[-1, 3, C3, [512, False]], # 20 (P4/16-medium)
[-1, 1, Conv, [512, 3, 2]],
[[-1, 10], 1, Concat, [1]], # cat head P5
[-1, 3, C3, [1024, False]], # 23 (P5/32-large)
[[17, 20, 23], 1, Detect, [nc, anchors]], # Detect(P3, P4, P5)
]
通过底层源码理解YOLOv5的Backbone_Python_萬仟网
yolo的不同网络大小仅仅改变这两个参数