目标检测yolov5:模型构建解析(代码片段)

zstar-_ zstar-_     2022-10-21     293

关键词:

前言

最近在看一些目标检测的最新论文和代码,大多数都是在YOLOv5的基础上进行魔改。
改的最多的基本是原版本的网络结构,这篇博文就从源码角度来解析YOLOv5中,模型是如何构建出来的。
本文使用的是YOLOv5-5.0版本。

模型的深度和宽度

在YOLOv5中,模型结构基本是写在了.yaml中,5.0版本的YOLOv5共有yolov5s,yolov5m,yolov5l和yolov5x四个版本,这四个版本的模型结构一模一样,不同的是两个参数depth_multiplewidth_multiple,分别表示模型的深度因子和宽度因子。

yolo.py中,parse_model函数下的这行代码将深度因子和宽度因子进行读取和赋值。

anchors, nc, gd, gw = d['anchors'], d['nc'], d['depth_multiple'], d['width_multiple']

depth_multiple

首先看深度因子,深度因子参与运算的是这行代码:

n = max(round(n * gd), 1) if n > 1 else n  # depth gain

这里的n表示结构的个数,也就是说,n是个>=1的整数(起码得有一个,否则不存在),depth_multiple越大,那么模型结构的个数也越多,因此网络就更”深“。

width_multiple

再看宽度因子,宽度因子参与运算的是这行代码:

c2 = make_divisible(c2 * gw, 8)

这个c2代表当前层的输出的通道(channel)数,也就是说,width_multiple越大,那么模型结构的通道数越多,因此看起来就更”宽“。

网络构建

下面到了最核心的网络构建部分,从YOLOv3开始,YOLO系列的网络结构都分成骨干(backbone),颈部(neck)和头部(head),但是在代码中,颈部和头部被统一写在了head之中。

backbone

以yolov5s为例:
首先来看backbone部分,backbone的代码如下:

backbone:
  # [from, number, module, args]
  # from表示当前模块的输入来自那一层的输出,-1表示来自上一层的输出
  # number表示本模块重复的次数,1表示只有一个,3表示重复3次
  # module: 模块名
  [[-1, 1, Focus, [64, 3]],          # 0-P1/2   [3, 32, 3]
   [-1, 1, Conv, [128, 3, 2]],       # 1-P2/4   [32, 64, 3, 2]
   [-1, 3, C3, [128]],               # 2        [64, 64, 1]
   [-1, 1, Conv, [256, 3, 2]],       # 3-P3/8   [64, 128, 3, 2]
   [-1, 9, C3, [256]],               # 4        [128, 128, 3]
   [-1, 1, Conv, [512, 3, 2]],       # 5-P4/16  [128, 256, 3, 2]
   [-1, 9, C3, [512]],               # 6        [256, 256, 3]
   [-1, 1, Conv, [1024, 3, 2]],      # 7-P5/32  [256, 512, 3, 2]
   [-1, 1, SPP, [1024, [5, 9, 13]]], # 8        [512, 512, [5, 9, 13]]
   [-1, 3, C3, [1024, False]],       # 9        [512, 512, 1, False]
  ]

这里拿【YOLOV5-5.x 源码解读】yolov5s.yaml这个博主绘制的网络结构图进行对比。


图中的四个参数(例如[1,3,640,640])分别表示一个batch中的样本数、通道数、图像长宽。
以第一个卷积层为例,它的参数是这样算的:
输入[1,32,320,320],卷积层参数是128个out_channel,3像素的kernel_size,2像素的stride
卷积计算公式如下:

out_size = (in_size - K + 2P)/ S +1

那么,输出特征图的长宽为round((320-3)/2 + 1)=160,因此输出特征图尺寸为160x160,这里初看可能会产生疑惑的是卷积层定义的out_channel明明是128,为什么输出channel却变成了64?其实,这就是前面提到宽度因子在起作用。yolov5s的宽度因子为0.5,这就导致真实的out_channel = 128x0.5 = 64。
因此,输入结果就变成了(1,64,160,160)

其它模块的计算方式类似。
第一个"-1“表示,输入来自上一个模块,这里全都是-1,即模块是一溜子的顺序下来,和图对比可以一一对应上。

head

首先来看head部分,head的代码如下:

head:
  [[-1, 1, Conv, [512, 1, 1]], # 10                 [512, 256, 1, 1]
   [-1, 1, nn.Upsample, [None, 2, 'nearest']], # 11 [None, 2, 'nearest']
   [[-1, 6], 1, Concat, [1]],  # 12 cat backbone P4 [1]
   [-1, 3, C3, [512, False]],  # 13                 [512, 256, 1, False]

   [-1, 1, Conv, [256, 1, 1]], # 14                 [256, 128, 1, 1]
   [-1, 1, nn.Upsample, [None, 2, 'nearest']], #15  [None, 2, 'nearest']
   [[-1, 4], 1, Concat, [1]],  # 16 cat backbone P3 [1]
   [-1, 3, C3, [256, False]],  # 17 (P3/8-small)    [256, 128, 1, False]

   [-1, 1, Conv, [256, 3, 2]], # 18                 [128, 128, 3, 2]
   [[-1, 14], 1, Concat, [1]], # 19 cat head P4     [1]
   [-1, 3, C3, [512, False]],  # 20 (P4/16-medium)  [256, 256, 1, False]

   [-1, 1, Conv, [512, 3, 2]], # 21                 [256, 256, 3, 2]
   [[-1, 10], 1, Concat, [1]], # 22 cat head P5     [1]
   [-1, 3, C3, [1024, False]], # 23 (P5/32-large)   [512, 512, 1, False]

   [[17, 20, 23], 1, Detect, [nc, anchors]],  # 24  Detect(P3, P4, P5)
  ]

我在图中标了序号,对照代码看应该比较清楚。


注,每一个检测头使用1x1的卷积核来调整维度,这个卷积核不包括在.yaml文件中。
最后一行输出17,20,23,即使用这三个卷积层输出的特征图进行检测,按照论文的说法即是对应大目标,中目标和小目标。

目标识别yolov5针对小目标检测的改进模型/添加帧率检测(代码片段)

...下采样。对于一些分辨率很高的遥感/无人机图片,小目标难以被训练识别。本篇博文就来尝试这篇博文YOLOV5模型和代码修改——针对小目标识别所提到的一种改进方案。我所使用的是YOLOv5-5.0版本,数据集采用VisDrone数据... 查看详情

机器学习笔记-在vehicles数据集上训练yolov5目标检测器(代码片段)

一、yolov5源码下载 https://github.com/ultralytics/yolov5https://github.com/ultralytics/yolov5     下图显示了五种YOLOv5变体,从为在移动和嵌入式设备上运行而构建的最微型YOLOv5nano模型开始,到另一端的YOLOv5XLarge。我们这里将使用基... 查看详情

睿智的目标检测56——pytorch搭建yolov5目标检测平台(代码片段)

睿智的目标检测56——Pytorch搭建YoloV5目标检测平台学习前言源码下载YoloV5改进的部分(不完全)YoloV5实现思路一、整体结构解析二、网络结构解析1、主干网络Backbone介绍2、构建FPN特征金字塔进行加强特征提取3、利用YoloHe... 查看详情

睿智的目标检测55——keras搭建yolov5目标检测平台(代码片段)

睿智的目标检测55——Keras搭建YoloV5目标检测平台学习前言源码下载YoloV5改进的部分(不完全)YoloV5实现思路一、整体结构解析二、网络结构解析1、主干网络Backbone介绍2、构建FPN特征金字塔进行加强特征提取3、利用YoloHead... 查看详情

目标检测yolov5遇上知识蒸馏(代码片段)

前言模型压缩方法主要4种:网络剪枝(Networkpruning)稀疏表示(Sparserepresentation)模型量化(Modelquantification)知识蒸馏(Konwledgedistillation)本文主要来研究知识蒸馏的相关知识,并尝试用知识蒸馏的方法对YOLOv5进行改进。知识蒸馏理... 查看详情

yolov5解析|第一篇:快速部署yolov5模型(代码片段)

...,我是『K同学啊』!拖了好久,终于要开始目标检测系列了。自己想过好几次,想尽快出几期目标检测算法的博客教程,但是一直苦于不知道如何写,才能让大家轻松、快速、高效的入门目标检测算法。... 查看详情

笔记2:yolov5训练自己的目标检测模型_创建并划分数据集(代码片段)

 目标检测---数据集格式转化及训练集和验证集划分_didiaopao的博客-CSDN博客1、 我们经常从网上获取一些目标检测的数据集资源标签的格式都是VOC(xml格式)的,而yolov5训练所需要的文件格式是yolo(txt格式)的,这里就需要对x... 查看详情

深度学习和目标检测系列教程17-300:3个类别面罩检测类别数据集训练yolov5s模型(代码片段)

@Author:RunsenYOLO是目前最火爆的的计算机视觉算法之一,今天使用的数据集来源:https://www.kaggle.com/andrewmvd/face-mask-detection这是数据集可以创建一个模型来检测戴口罩、不戴口罩或不正确戴口罩的人。该数据集包含... 查看详情

改进yolov5系列:增加swin-transformer小目标检测头(代码片段)

...一使用YOLOv5代码框架,结合不同模块来构建不同的YOLO目标检测模型。🌟本项目包含大量的改进方式,降低改进难度,改进点包含【Backbone特征主干】、【Neck特征融合】、【Head检测头】、【注意力机制】、【IoU损失函数】、... 查看详情

深度学习和目标检测系列教程17-300:3个类别面罩检测类别数据集训练yolov5s模型(代码片段)

@Author:RunsenYOLO是目前最火爆的的计算机视觉算法之一,今天使用的数据集来源:https://www.kaggle.com/andrewmvd/face-mask-detection这是数据集可以创建一个模型来检测戴口罩、不戴口罩或不正确戴口罩的人。该数据集包含... 查看详情

深度学习目标检测:yolov5实现车辆检测(含车辆检测数据集+训练代码)(代码片段)

深度学习目标检测:YOLOv5实现车辆检测(含车辆检测数据集+训练代码) 目录YOLOv5实现车辆检测(含车辆检测数据集+训练代码)1.前言2.车辆检测数据集说明(1)车辆检测数据集(2)自定义数据集3.基于YOLOv5... 查看详情

深度学习目标检测:yolov5实现车辆检测(含车辆检测数据集+训练代码)(代码片段)

深度学习目标检测:YOLOv5实现车辆检测(含车辆检测数据集+训练代码) 目录YOLOv5实现车辆检测(含车辆检测数据集+训练代码)1.前言2.车辆检测数据集说明(1)车辆检测数据集(2)自定义数据集3.基于YOLOv5... 查看详情

快速入门yolov5目标检测算法(代码片段)

文章目录一、YOLOv5简介二、网络结构1、Input2、Backbone3、Neck4、Head三、改进方法1、自适应锚框计算2、自适应灰度填充四、性能表现五、YOLOv5入门实战一、YOLOv5简介YOLOv5是一个在COCO数据集上预训练的物体检测架构和模型系列,... 查看详情

手把手教你使用yolov5训练自己的目标检测模型-口罩检测-视频教程(代码片段)

手把手教你使用YOLOV5训练自己的目标检测模型大家好,这里是肆十二(dejahu),好几个月没有更新了,这两天看了一下关注量,突然多了1k多个朋友关注,想必都是大作业系列教程来的小伙伴。既然有... 查看详情

手把手教你使用yolov5训练自己的目标检测模型-口罩检测-视频教程(代码片段)

手把手教你使用YOLOV5训练自己的目标检测模型大家好,这里是肆十二(dejahu),好几个月没有更新了,这两天看了一下关注量,突然多了1k多个朋友关注,想必都是大作业系列教程来的小伙伴。既然有... 查看详情

深度学习目标检测---使用yolov5训练自己的数据集模型(windows系统)(代码片段)

...看一些视频教程和一些前辈的博客,实现了深度学习目标检测--使用yolov5网络训练自己的数据集并实现了对目标的识别。这篇博客我也是参考别人的博客教程,复现了使用yolov5训练自己的数据集,我呢主要是想记录下... 查看详情

目标检测yolov5-7.0:加入实例分割(代码片段)

...言前段时间,YOLOv5推出7.0版本,主要更新点是在目标检测的同时引入了实例分割。目前,YOLOv5团队已经转向了YOLOv8的更新,因此,7.0版本大概率是YOLOv5的最终稳定版。更新信息官方公告中给出了YOLOv5-7.0的更新... 查看详情

目标检测及目标定位(代码片段)

一、概述本文是关于目标检测后根据物体的坐标来确定物体所处的区域,适用于需要根据物体在图像中的位置来分别判断的情况,而且对应的是YOLOv5模型。YOLOv5目标检测的内容可以看看我之前的一篇文章YOLOv5训练自己的... 查看详情