目录
IOU=1 是完全重叠
根据IOU设置的阈值来判断是TP还是FP ,比如重叠为0.5
AP是衡量学习出来的模型在每个类别上的好坏
mAP是衡量学习出来的模型在所有类别上的好坏是AP的平均值
先经过卷积神经网络得到特征图像,之后对图像进行网格划分,每个网格单独进行画框检测和类别的概率图,最终得到结果。
每个小框内包含了边界框坐标、目标得分和类别得分
经过卷积神经网络可以得到不同大小的特征图,对不同大小的特征图进行融合利于小目标的检测。
图片卷积经过32倍下采样得到19*19的图片,每个网格都会单独预测和画锚框
预先设定一些边界框的大小 ,每个尺度都有若干个锚框
一个网络往往有主干网络(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的不同网络大小仅仅改变这两个参数