YOLOV5学习笔记(一)——原理概述

目录

一、目标检测概述

1.1 数据集介绍

1.2 性能指标 

1.2.1 混淆矩阵

1.2.2 IOU(边界框回归)

1.2.3 AP&mAP

1.2.4 检测速度

1.3 YOLO发展史

​1.3.1 算法思想

1.3.2  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的不同网络大小仅仅改变这两个参数