YOLOv5复现(论文复现)

news2024/12/28 3:57:22

YOLOv5复现(论文复现)

本文所涉及所有资源均在传知代码平台可获取

文章目录

    • YOLOv5复现(论文复现)
        • 概述
        • 模型结构
        • 正负样本匹配策略
        • 损失计算
        • 数据增强
        • 使用方式
          • 训练
          • 测试
          • 验证
          • Demo

概述

YOLOv5是由Ultralytics公司于2020年6月开源的目标检测模型,具有轻量化、易用性和高性能等特点,在不同的硬件平台上提供了很好的速度和性能平衡,凭借其优秀的实时性和准确性在工业、安防、无人驾驶和许多其他领域都有广泛的应用。YOLOv5是YOLO系列中最受欢迎的工作之一,但就其整体架构而言,YOLOv5可以看作是YOLOv4的“精心调教”版,通过对YOLOv4的网络结构、优化器超参、数据预处理超参、损失函数超参等多个超参数调优,使得YOLOv5的性能要远远优于YOLOv4,但整体架构仍旧延续了YOLOv4的Backbone+SPP+PaFPN+Head的结构,并无较大的改动。从结构上来看,YOLOv5仍采用了YOLOv4的CSPDarkNet结构,设计了width因子和depth因子来对模型做缩放,从而构建出了N/S/M/L/X等不同的模型尺度;从标签分配角度来看,YOLOv5依旧是anchor-based路线,且沿用了YOLOv3以来的anchor box参数,但将YOLOv4还在用的IoU-based匹配策略修改为shape-based匹配策略(长宽比阈值),可以为每个目标分配更多的正样本;从损失函数角度来看,还是objectness+classification+regression三部分损失,且损失函数与YOLOv4是一致的。从使用角度来看,YOLOv5相比YOLOv4有了很大的进步,采用了更加流行的pytorch框架,使得上手难度大大降低,并提供了更加完善的文档和更加丰富的预训练权重

模型结构

YOLOv5的结构可以大体上分为“主干网络backbone+SPP颈部网络+PaFPN特征金字塔+检测头”,如下图所示,图的上半部分为模型总览;下半部分为具体网络结构

在这里插入图片描述

首先是主干网络,和YOLOv4 的主干网络相同,都采用了基于CSP结构的CSPDarkNet网络,CSPNet是一种增强CNN学习能力的跨阶段局部网络。CSPNet全称是Cross Stage Partial Network,主要从网络结构设计的角度来解决以往工作在推理过程中需要很大计算量的问题,其能够在降低20%计算量的情况下保持甚至提高CNN的能力。不同的是,在YOLOv4中,CSPDarkNet遵循“12884”的设计来得到CSPDarkNet-53,而YOLOv5则进一步将其修改为“3993”的结构,以便后续在模型深度的层面上做缩放。相较于YOLOv4 的“12884”,YOLOv5则在模型的第一阶段中不加入CSP模块,仅仅使用一个kernel较大的卷积来做第一次的降采样,随后才使用CSP模块。整体上来看,和YOLOv4的CSPDarkNet-53的框架是一样的,没有本质区别,不过是在深度和宽度上做了一些调整,且第一阶段的结构不大相同:YOLOv4的第一阶段使用了CSP模块(深度为1),而YOLOv5的第一阶段仅使用一个大核卷积。为了调控YOLOv5的模型规模,一共设计了5套尺度因子,如下表所示,其中 depth 控制网络结构深度,主要作用在CSP模块中来调整其中的残差块的数量,进而调整了网络的深度;width 控制网络结构宽度,即模块输出特征图的通道数

模型尺度宽度因子width深度因子depth
N0.250.34
S0.500.34
M0.750.67
L1.01.0
X1.251.34

CSPDarkNet实现代码如下

# CSPDarkNet
class CSPDarkNet(nn.Module):
    def __init__(self, depth=1.0, width=1.0, act_type='silu', norm_type='BN', depthwise=False):
        super(CSPDarkNet, self).__init__()
        self.feat_dims = [round(64 * width), round(128 * width), round(256 * width), round(512 * width), round(1024 * width)]
        # P1/2
        self.layer_1 = Conv(3, self.feat_dims[0], k=6, p=2, s=2, act_type=act_type, norm_type=norm_type, depthwise=depthwise)
        # P2/4
        self.layer_2 = nn.Sequential(
            Conv(self.feat_dims[0], self.feat_dims[1], k=3, p=1, s=2, act_type=act_type, norm_type=norm_type, depthwise=depthwise),
            CSPBlock(in_dim       = self.feat_dims[1],
                     out_dim      = self.feat_dims[1],
                     expand_ratio = 0.5,
                     nblocks      = round(3*depth),
                     shortcut     = True,
                     act_type     = act_type,
                     norm_type    = norm_type,
                     depthwise    = depthwise)
        )
        # P3/8
        self.layer_3 = nn.Sequential(
            Conv(self.feat_dims[1], self.feat_dims[2], k=3, p=1, s=2, act_type=act_type, norm_type=norm_type, depthwise=depthwise),
            CSPBlock(in_dim       = self.feat_dims[2],
                     out_dim      = self.feat_dims[2],
                     expand_ratio = 0.5,
                     nblocks      = round(9*depth),
                     shortcut     = True,
                     act_type     = act_type,
                     norm_type    = norm_type,
                     depthwise    = depthwise)
        )
        # P4/16
        self.layer_4 = nn.Sequential(
            Conv(self.feat_dims[2], self.feat_dims[3], k=3, p=1, s=2, act_type=act_type, norm_type=norm_type, depthwise=depthwise),
            CSPBlock(in_dim       = self.feat_dims[3],
                     out_dim      = self.feat_dims[3],
                     expand_ratio = 0.5,
                     nblocks      = round(9*depth),
                     shortcut     = True,
                     act_type     = act_type,
                     norm_type    = norm_type,
                     depthwise    = depthwise)
        )
        # P5/32
        self.layer_5 = nn.Sequential(
            Conv(self.feat_dims[3], self.feat_dims[4], k=3, p=1, s=2, act_type=act_type, norm_type=norm_type, depthwise=depthwise),
            SPPF(self.feat_dims[4], self.feat_dims[4], expand_ratio=0.5),
            CSPBlock(in_dim       = self.feat_dims[4],
                     out_dim      = self.feat_dims[4],
                     expand_ratio = 0.5,
                     nblocks      = round(3*depth),
                     shortcut     = True,
                     act_type     = act_type,
                     norm_type    = norm_type,
                     depthwise    = depthwise)
        )

    def forward(self, x):
        c1 = self.layer_1(x)
        c2 = self.layer_2(c1)
        c3 = self.layer_3(c2)
        c4 = self.layer_4(c3)
        c5 = self.layer_5(c4)

        outputs = [c3, c4, c5]

        return outputs

对于颈部网络,yolov5使用了和YOLOv4中类似的SPP模块。SPP(Spatial Pyramid Pooling)利用不同的池化核尺寸提取特征的方式可以获得丰富的特征信息,有利于提高网络的识别精度。对每个特征图,使用三种不同尺寸的池化核进行最大池化,分别得到预设的特征图尺寸,最后将所有特征图展开为特征向量并融合,确保输入预定义全连接层的feature vector(特征向量)是固定尺寸。

对于特征金字塔,yolov5使用了PaFPN结构,将FPN(Feature pyramid network)和PANet(Path Aggregation Network)结合起来,通过Bottom-Up和Top-down结构充分融合高层特征和底层特征。相较于YOLOv4,YOLOv5在PaFPN中添加了CSP模块,取代了早期的包含5层卷积的简单模块,同时也加入了depth因子来调整PaFPN的深度。

对于检测头,输出objectness+classification+regression。采用的是解耦检测头,将检测头的类别特征分支的输出去做classification,将检测头的位置特征分支的输出去做regression和objectness

正负样本匹配策略

正负样本匹配策略的核心是确定预测特征图的所有位置中哪些位置应该是正样本,哪些是负样本,甚至有些是忽略样本。 匹配策略是目标检测算法的核心,一个好的匹配策略可以显著提升算法性能。采用了 anchor 和 gt_bbox 的 shape 匹配度作为划分规则,同时引入跨邻域网格策略来增加正样本。对于任何一个输出层,抛弃了常用的基于 IoU 匹配的规则,而是直接采用 shape 规则匹配,也就是该 GT Bbox 和当前层的 Anchor 计算宽高比,如果宽高比例大于设定阈值,则说明该 GT Bbox 和 Anchor 匹配度不够,将该 GT Bbox 暂时丢掉,在该层预测中该GT Bbox 对应的网格内的预测位置认为是负样本。接下来, 只需要确定这些anchor box都是来自于哪个特征金字塔等级,从而去计算目标框在相应的特征金字塔等级上的中心点坐标

损失计算

YOLOv5 中总共包含 3 个 Loss,分别为:

  • classification loss:使用的是 BCE loss
  • Objectness loss:使用的是 BCE loss
  • Regression loss:使用的是 CIoU loss

三个 loss 按照一定比例汇总,对Objectness 和classification 分别设置为1.0,对于Regression 则设置为5.0

数据增强

YOLOv5 中使用的数据增强比较多,包括:

  • Mosaic 马赛克
  • RandomAffine 随机仿射变换
  • MixUp
  • 图像模糊等采用Python的 albumentations库实现的变换
  • HSV 颜色空间增强
  • 随机水平翻转

其中 Mosaic 数据增强概率为 1,表示一定会触发,而对于 small 和 nano 两个版本的模型不使用 MixUp,其他的 l/m/x 系列模型则采用了 0.1 的概率触发 MixUp。小模型能力有限,一般不会采用 MixUp 等强数据增强策略。当四张640×640的图像被拼接成1280×1280的马赛克图像后,会再使用随机仿射变换从中截取出新的640×640图像,作为最终用于训练的马赛克增强

使用方式

创建python虚拟环境

conda create -n yolov5 python=3.8
conda activate yolov5

安装相关依赖

pip install -r requirents.txt

准备数据集(如果需要从头训练YOLOv5模型,则需要下载数据集,如果只是使用YOLOv5进行目标检测则可以不用下载,可以使用自己的数据进行测试)官网下载COCO数据集,如下图红色框所示

在这里插入图片描述

下载完成并解压后后目录如下:

F:\datasets
|___COCO2017
	|___annotations
		|____instances_train2017.json
		|____instances_val2017.json
		...
	|___train2017
		|____000000000009.jpg
		...
	|___val2017
		|____000000000139.jpg
		...

2.清洗COCO数据集,会在annotations目录下生成instances_train2017_clean.json和instances_val2017_clean.json

cd tools/
python clean_coco.py --root path/to/coco --image_set train
python clean_coco.py --root path/to/coco --image_set val

3.检查COCO数据集

python dataset/coco.py

下面的实验都以yolov5_s模型为例,如需换成其他模型,将命令中的参数-m yolov5_s换成其他模型即可,如-m yolov5_l

训练

使用COCO数据集从头开始训练YOLOv5模型(将下面的F:\datasets\换成自己数据集路径)

python train.py --cuda -d coco --root F:\datasets\ -m yolov5_s -bs 1 --max_epoch 300 --wp_epoch 1 --eval_epoch 10 --fp16 --ema --multi_scale
测试

使用COCO2017val数据集测试训练好的模型,会依次看到检测结果的可视化图像(将yolov5_s_coco_adamw.pth换成自己模型权重的路径)

python test.py -d coco --cuda -m yolov5_s --img_size 640 --weight yolov5_s_coco_adamw.pth --root F:\datasets\ --no_multi_labels --show
验证

使用COCO2017val数据集验证训练好的模型,会看到COCO风格的AP结果输出

python eval.py -d coco --cuda -m yolov5_s --img_size 640 --weight yolov5_s_coco_adamw.pth --root F:\datasets\
Average Precision (AP) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.444
Average Precision (AP) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.519
Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets= 1 ] = 0.324
Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets= 10 ] = 0.544
Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets=100 ] = 0.612
Average Recall (AR) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.432
Average Recall (AR) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.685
Average Recall (AR) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.766
ap50_95 : 0.3912800741053746
ap50 : 0.5693696831091651
Demo

使用自己的数据测试训练好的模型,需将下面的path_to_img和path_to_vid换成图片或视频的路径,将weight换成YOLOv5模型权重的路径.

图片

python demo.py --mode image --path_to_img dataset\demo\images --cuda --img_size 640 --model yolov5_s --weight yolov5_s_coco_adamw.pth --dataset coco --num_classes 80 --show

视频

python demo.py --mode video --path_to_vid dataset\demo\videos\01.mp4 --cuda --img_size 640 -m yolov5_s --weight yolov5_s_coco_adamw.pth --show --gif

文章代码资源点击附件获取

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2197101.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

uniapp顶部提示栏实现

效果: 用途:用于展示较短系统通知 实现逻辑: 1.通过请求获取该显示的通知内容,目前所考虑的字段有: {id: 200, // 通知标识,后续会用其阻止用户关闭后无休止开启message: "请勿以系统规定的其它…

与ZoomEye功能类似的搜索引擎还有哪些?(渗透课作业)

与ZoomEye功能类似的搜索引擎有: Shodan:被誉为“物联网的搜索引擎”,专注于扫描和索引连接到互联网的各种设备,如智能家居设备、工业控制系统、摄像头、数据库等。它提供全球互联网设备的可视化视图,帮助用户了解网络…

ssm图书管理系统的设计与实现

系统包含:源码论文 所用技术:SpringBootVueSSMMybatisMysql 免费提供给大家参考或者学习,获取源码请私聊我 需要定制请私聊 目 录 摘 要 I Abstract II 第1章 绪论 1 1.1 课题研究背景 1 1.2课题研究现状 1 1.3课题实现目的和意义 …

【C++】模拟实现hash_table(哈希表)

🦄个人主页:修修修也 🎏所属专栏:实战项目集 ⚙️操作环境:Visual Studio 2022 目录 一.了解项目功能 二.逐步实现项目功能模块及其逻辑详解 📌实现HashNode类模板 🎏构造HashNode类成员变量 🎏实现HashNode类构造函数…

高效研究:Zotero的7个插件让你事半功倍

还在为海量文献管理头疼吗?还在为找不到合适的插件犯愁吗?别急,今天我就要带你解锁Zotero的终极武器 - 那些让你爱不释手的必备插件! 作为一个从小白到文献管理达人的过来人,我可以负责任地说:没有这些插件,你的Zotero只能发挥一半功力!安装了这些插件,你的效率绝对能飙升! …

字典树(单词查找树、Trie树)

题目 代码 #include <bits/stdc.h> using namespace std; const int N 1e510; int f[N][26], idx, cnt[N]; void insert(char str[]) {int p 0;for(int i 0; str[i]; i){int u str[i] - a;if(!f[p][u]) f[p][u] idx;p f[p][u];}cnt[p]; } int query(char str[]) …

相亲交友系统的商业模式探讨

在撰写关于相亲交友系统的商业模式探讨时&#xff0c;附带示例代码可能不太合适&#xff0c;因为软文通常是面向非技术读者&#xff0c;讲述商业模式、用户体验等方面的内容。不过&#xff0c;为了满足您的需求&#xff0c;我可以尝试结合一些简单的伪代码&#xff08;模拟代码…

CSS 3D转换

在 CSS 中&#xff0c;除了可以对页面中的元素进行 2D 转换外&#xff0c;您也可以对象元素进行 3D转换&#xff08;将页面看作是一个三维空间来对页面中的元素进行移动、旋转、缩放和倾斜等操作&#xff09;。与 2D 转换相同&#xff0c;3D 转换同样不会影响周围的元素&#x…

Cursor编辑器:10秒生成完美Git提交信息!

Cursor编辑器&#xff1a;10秒生成完美Git提交信息&#xff01; 亲爱的开发者们&#xff0c;是否还在为编写规范的Git提交信息而头疼&#xff1f;今天&#xff0c;就让我们一起揭开Cursor编辑器的神秘面纱&#xff0c;探索如何一键生成专业的Git Commit Message&#xff0c;让…

Android 电源管理各个版本的变动和限制

由于Android设备的电池容量有限&#xff0c;而用户在使用过程中会进行各种高耗电操作&#xff0c;如网络连接、屏幕亮度调节、后台程序运行等&#xff0c;因此需要通过各种省电措施来优化电池使用‌&#xff0c;延长电池续航时间&#xff0c;提高用户体验&#xff0c;并减少因电…

数据结构-八大排序之堆排序

堆排序 1.1 基础知识 原理&#xff1a; 1. 利用完全二叉树构建大顶堆 2. 堆顶元素和堆底元素进行交换&#xff0c;除堆底元素之外其余元素继续构建大顶堆 3. 重复2&#xff0c;直到所有元素都不参与构建 整个数组排序完成 完全二叉树&#xff1a; 数据从上到下&#x…

八大排序--05堆排序

假设数组 arr[] {5,7,4,2,0,3,1,6},请通过插入排序的方式&#xff0c;实现从小到大排列&#xff1a; 方法&#xff1a;①利用完全二叉树构建大顶堆&#xff1b; ②对顶元素和堆底元素进行交换&#xff0c;除堆底元素之外其余元素继续构造大顶堆&#xff1b; ③重复步骤②&…

2k1000LA iso 镜像的制作

问题: 已经有了buildroot ,内核也调试好了,但是没有loongnix 镜像。 首先是网上下载镜像,看看能不能用 首先是现在 网上的 iso 镜像进行烧写测试。 安装 7z 解压软件 进行U盘的烧写。 进行系统安装测试: <

视频剪辑软件推荐电脑版:这5款剪辑软件不容错过!

在视频剪辑领域&#xff0c;选择合适的软件至关重要。不同的软件各有千秋&#xff0c;有的简单易用&#xff0c;适合新手快速上手&#xff1b;有的功能强大&#xff0c;适合专业团队进行深度编辑。以下是一些电脑版视频剪辑软件的推荐&#xff0c;涵盖了从新手到专业级别的不同…

【RAG】HiQA:一种用于多文档问答的层次化上下文增强RAG

前言 文档领域的RAG&#xff0c;之前的工作如ChatPDF等很多的RAG框架&#xff0c;文档数量一旦增加&#xff0c;将导致响应准确性下降&#xff0c;如下图&#xff1b;现有RAG方法在处理具有相似内容&#xff08;在面对大量难以区分的文档时&#xff09;和结构的文档时表现不佳…

人才画像系统是什么?有哪些功能和作用?

人才画像系统是一种先进的人力资源管理工具&#xff0c;它运用大数据和人工智能技术对员工的多方面特征进行深度分析。系统通过汇聚个人的教育背景、工作经验、技能掌握、性格特质及行为数据等信息&#xff0c;结合数据挖掘和机器学习算法&#xff0c;构建出每位员工的数字化“…

openEuler 22.03 (LTS-SP3)上安装mysql8单机版

一、目标 在openEuler 22.03 (LTS-SP3) 上安装 mysql 8.0.23 单机版 二、安装 1、下载二进制包 MySQL :: Download MySQL Community Server (Archived Versions) 下载页面 下载链接 https://downloads.mysql.com/archives/get/p/23/file/mysql-8.0.23-linux-glibc2.12-x86…

新生培训 day1 C语言基础 顺序 分支 循环 数组 字符串 函数

比赛地址 b牛客竞赛_ACM/NOI/CSP/CCPC/ICPC算法编程高难度练习赛_牛客竞赛OJ C语言数据类型 字符 整型数 int 2e9 long long 9e18 浮点数 代码示例 /** Author: Dduo * Date: 2024-10-8* Description: 新生培训day1 */ #include <stdio.h>int main() {// 定义变量in…

【2024.10.8练习】宝石组合

题目描述 题目分析 由于是求最值&#xff0c;原本考虑贪心&#xff0c;但由于算式过于复杂&#xff0c;首先考虑对算式化简。 进行质因数分解&#xff1a; 因此: 不妨设对于每个&#xff0c;&#xff0c;则上式可化简为&#xff1a; 即 用Vene图也可以求出同样结果。 可是以…

DepthB2R靶机打靶记录

一、靶机介绍 下载地址&#xff1a;https://download.vulnhub.com/depth/DepthB2R.ova 二、信息收集 根据靶机主页显示&#xff0c;确认靶机ip为192.168.242.132 端口扫描 nmap -p- -A 192.168.242.132 发现只开放了8080端口 用dirsearch扫个目录 apt-get update apt-get …