YOLO-V5 算法和代码解析系列 —— 学习路线规划综述

news2024/11/24 11:26:52

目录标题

    • 为什么学习 YOLO-V5 ?
    • 博客文章列表
    • 面向对象
    • 开源项目学习方法
    • 预备知识
    • 项目目录结构

为什么学习 YOLO-V5 ?

  1. 算法性能:与YOLO系列(V1,V2,V3,V4)相比,YOLO-V5效果最好,速度最快。
  2. 项目质量:自项目开源,作者一直精心维护,优化,更新,目前已经更新到V7版本,项目整体质量非常高。
  3. 工业部署:在工业界,要能够部署到低性能设备,并且保证效果和速度。为此,模型不能太大、不能有特别复杂、奇怪的网络模块,速度和效果不能受影响太大,芯片设计的支持(很多NPU厂商均将YOLO-V5作为测试Demo)。YOLO-V5满足所有这些需求,所以非常适合工业界部署和落地。
  4. 适合学习:该项目一直在维护,作者会回答【git issue】上提出的任何问题。参与开发和使用的人很多,所以相关学习资源非常丰富,适合新手或者一定工作经验的同学长期学习。

博客文章列表

  本系列教程,使用【YOLO-V5,V6.1】版本进行算法和代码的讲解。下面是该教程的文章更新列表,

  1. YOLO-V5 算法和代码解析系列(一)—— 快速开始(待更新)
  2. YOLO-V5 算法和代码解析系列(二)—— 数据加载(待更新)
  3. YOLO-V5 算法和代码解析系列(三)—— 网络结构(待更新)
  4. YOLO-V5 算法和代码解析系列(四)—— 损失函数(待更新)
  5. YOLO-V5 算法和代码解析系列(五)—— 并行训练(待更新)
  6. YOLO-V5 算法和代码解析系列(六)—— 指标评估(待更新)
  7. YOLO-V5 算法和代码解析系列(七)—— 自定义数据集(待更新)
  8. YOLO-V5 算法和代码解析系列(八)—— 训练自定义数据(待更新)
  9. YOLO-V5 算法和代码解析系列(九)—— 瑞芯微芯片部署(待更新)

面向对象

  (1)有一定深度学习、python基础,打算系统、深入学习 YOLO-V5;
  (2)有一定工作经验的同学,希望进一步提升自己,比如如何阅读开源项目,深入学习目标检测等;
  (3)工作过程中,需要在低性能设备端部署目标检测模型,特别是部署芯片为瑞芯微;

开源项目学习方法

  在个人学习开源项目过程中,通过不断尝试、探索、思考和总结,归纳出开源项目学习的一般方法(仅仅针对深度学习类项目)。学习过程中,可以结合自己的实际情况进行调整。具体学习流程如下,

  1. 运行 Demo
    在接触任何一个开源项目之前,必然是将项目成功运行起来,先睹(可视化效果)为快。在当前步骤的学习中,应该达到如下的【目标】,

    (1)参考开源项目的【README.md】,配置项目的运行环境;
    (2)运行demo示例,能够得到可视化结果,比如运行 detect.py,inference.py 等代码文件;

  2. 简单训练一次
    按照开源项目的训练教程,自己训练一次,并计算性能指标。具体完成内容如下,

    (1)准备训练所需数据集;
    (2)调试训练代码,保证可以正常运行;
    (3)运行 train.py,训练模型,与作者的结果进行比对,误差在【2%】左右,可以接受;

  3. 第一次阅读代码
    完成【1.,2.】后,说明开源代码基本没有大问题,可以进一步深入学习。此时可以开始阅读代码,遇到的任何问题均需要记录(要做记录,要做记录,要做记录),并且要达到如下的【目标】:

    (1)理清训练代码(注意,不是预测代码)的整体运行逻辑,彼此之间的调用关系;
    (2)核心模块的代码位置:主运行模块,数据加载和数据增强模块,网络结构模块,损失函数模块;
    (3)阅读过程中,一定要做好【记录】,问题点大致分为如下几类:
         疑问点(阅读过程中,自己产生的任何问题,均需要记录,带着问题学习很重要,后续也可以反复看看);
         典型知识点(可以理解清楚,但是需要系统总结的知识点);
         困惑点(比较难以理解,感觉理解了,有时又感觉没有理解清楚);
         困难点(反复研究,仍无法理解的算法或者代码实现逻辑);

  4. 第二次阅读代码
    完成【3.】后,对项目整体的逻辑和结构,不理解的问题点有了大致的了解,但是对各个模块的实现细节不清楚。接下来,需要逐个模块研究,各个击破。注意,此时要着重解决【3.】中记录的【困惑点、困难点】问题,并在文档中记录解决的方法。该步骤需要达到的目标,具体如下:

    (1)数据加载模块:数据加载是深度学习训练的重要部分,直接决定训练的效率;必须深入理解数据加载通道的每一个环节;
    (2)数据增强模块:基本是图像处理类算法,理解每类算法的精髓,调试出可视化结果;
    (3)网络结构模块:包含网络的构建过程,网络推理过程,最后手动完成网络结构绘制;
    (4)损失函数模块:理解损失函数的是如何构造的,作用,与网络输出是如何运算的;

  5. 第三次阅读代码
    完成【4.】后,基本对整体的逻辑,并且每一个模块的核心都基本理解,或许还会在某个模块的某个知识点不是很理解。在此次阅读代码过程中,应达到如下目的:

    (1)从更高层次,重点学习、理解开源项目的整体设计架构,汲取自己所需;
    (2)总结一些特殊的实现技巧,优化技巧等;
    (3)对还有疑惑的知识点,核心模块,可以进一步思考,理解,并更新之前的记录;

  6. 写博客
    如果有兴趣、有时间,可以写博客记录,进一步加深自己的理解,也能帮助其它小伙伴学习~~

预备知识

  1. 深度学习基础知识
  2. OpenCV基础知识
  3. Pytorch基础知识
  4. vscode、pycharm 基本调试方法

项目目录结构

  1. 项目的组织结构
    项目的一级目录如下图所示,每个目录具有各自的功能。一个开源项目的常见组织结构大致如此,

    【data/】:数据相关,比如数据下载,数据存放位置等
    【models/】:实现各种网络结构,定义网络的配置文件等
    【utils/】:辅助功能函数,比如数据增强,损失函数实现等
    【detect.py】:推理的脚本,输入可以是图片,视频等
    【export.py】:导出为其它格式的模型,比如ONNX,TensorRT,TFLite等
    【val.py】:评估模型的性能,计算相关的性能指标
    在这里插入图片描述

    一级目录【./data/】,包含内容如下:

    hyps/:定义网络训练的各种参数
    images/:测试图片
    scripts/:下载数据的 sh 脚本
    coco.yaml:训练数据的存放路径
    在这里插入图片描述

    一级目录【./models】的内容如下,

    hub/:其它模型结构的配置文件
    common.py,yolo.py:模型的构建脚本,基础网络模块的定义
    yolov5s.yaml:模型的配置文件
    在这里插入图片描述

    一级目录【./utils】的内容如下,

    augmentations.py:实现数据增强功能
    autoanchor.py:根据训练集,自动计算Anchor
    loss.py:损失函数的定义、计算

    在这里插入图片描述

  2. 核心模块
    下面的思维导图,大致展示了YOLO-V5的核心模块,以及核心模块相关的核心知识点。开始阅读代码时,应该优先研究核心模块,掌握该项目的核心算法(切勿一开始把精力浪费在边缘功能模块)。思维导图的最后一级对应着YOLO-V5的关键模块,要着重理解,
    在这里插入图片描述

  3. 学习的相关文档记录
    在学习该项目过程中,根据记录内容的不同,建立了相应的文件类型(比如,word,思维导图,PPT,流程图等)。所有的记录文档如下图所示,
    在这里插入图片描述
    在阅读开始时,文档【YOLOV5阅读记录.docx】就开始记录内容。学习过程中,逐步丰富内容,记录了很多问题点,知识点。随着每一次深度阅读代码,一些难点问题逐渐被攻克,并且记录了解决的方法(每一次阅读会逐步修正之前错误的理解,或者浅显的理解)。个人认为,这种学习方法非常有助于【真正透彻理解】一个完整的开源工程。文档截图展示如下(内容可能看不清,这不重要哈~~~),

    在这里插入图片描述

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

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

相关文章

【花雕动手做】有趣好玩的音乐可视化系列项目(33)---核酸托盘灯

偶然心血来潮,想要做一个音乐可视化的系列专题。这个专题的难度有点高,涉及面也比较广泛,相关的FFT和FHT等算法也相当复杂,不过还是打算从最简单的开始,实际动手做做试验,耐心尝试一下各种方案,…

RosonQt140——Qt Charts模块介绍和Qt绘制图表

Qt图表概述 Qt Charts能够创建时尚、互动、以数据为中心的用户界面。Qt Charts使用图形视图框架,便于集成。图表组件可以作为QWidget或QGraphicsWidget对象或QML类型使用。 QChart类管理不同类型的系列和其他图表相关对象的图形表示,如图例和坐标轴。QC…

33-Vue之ECharts高级-设置主题

ECharts高级-设置主题前言内置主题自定义主题前言 本篇来学习下ECharts中如何设置图表主题 内置主题 ECharts 中默认内置了两套主题: light dark var chart echarts.init(dom, light) var chart echarts.init(dom, dark)<!DOCTYPE html> <html lang"en&quo…

前缀树介绍,定义,图文详解分析——Java/Kotlin双版本代码

前缀树 前缀树&#xff0c;又称作字典树&#xff0c;用一个树状的数据结构储存字典中的所有单词。 列&#xff0c;一个包含can、cat、come、do、i、in、inn的前缀树如下图所示&#xff1a; 前缀树是一个多叉树&#xff0c;一个节点可能存在多个节点。除根节点外&#xff0c;每…

Spring5框架总结学习(从入门到进阶)

文章目录Spring51、如何创建一个Spring项目&#xff08;idea版&#xff09;2、 IOC容器1、XML解析工厂模式反射2、bean管理1、总述2、基于XML创建对象3、基于XML注入属性4、基于XML注入属性&#xff0c;属性值为空或特殊符号5、基于XML注入属性&#xff0c;外部bean6、基于XML注…

【第十二章 MVCC(多版本并发控制),隐藏字段,undolog(版本链),readview,原理分析(RC,RR)】

第十二章 MVCC&#xff08;多版本并发控制&#xff09;&#xff0c;隐藏字段&#xff0c;undolog&#xff08;版本链&#xff09;&#xff0c;readview&#xff0c;原理分析&#xff08;RC&#xff0c;RR&#xff09; 1.基本概念: &#xff08;1&#xff09; 当前读&#xff1…

hevc 基于均值的RDO模式删减

1 在获得粗略模式候选列表L4之后&#xff0c;对尺寸为4x4和8x8的PU保留8种预测模式&#xff0c; 对尺寸16x16&#xff0c;32x32, 64x64的PU保留3种预测模式&#xff0c;如果可以跳过部分模式的RDO计算&#xff0c;则可以进一步减少编码时间。 2 由于HCost计算是RDO计算的一种较…

springBoot+Cache(自定义有效时间配置)

一、背景 sprinbBoot的cache是不是支持动态设置缓存注解的&#xff0c;因此本次自己实现一个可以动态设置缓存时间的配置。 源码&#xff1a;示例地址 二、步骤 1、pom.xml添加依赖配置 <dependency><groupId>org.springframework.boot</groupId><arti…

Linux系统编程(续)

静态库制作及使用步骤&#xff1a; 1.将.c生成.o文件 gcc -c add.c -o add.o 2.使用ar工具制作静态库 ar rcs lib自定义库名.a 后面需要的.c文件 3.编译静态库到可执行文件中 gcc test.c 自制的库.a -o test 注意:如果程序中没有函数声明&#xff0c;编译器会自动给个隐式声明…

Java+MySQL基于SSM的在线投票系统

随着社会的发展,人们在处理一些问题的时候不同意见越来越多,这源于人们对思想的解放和对社会的认识。所以在处理同一问题上,为了征求不同人的意见在线投票系统诞生了。 基于SSM的在线投票系统以钦州学院为背景,运用在校所学习的软件开发原理,采用Spring&#xff1a;SpringMVC&a…

如何在网页画一个旋转的粉色圣诞树(含源代码)

0 效果 做法&#xff1a; 创建三个文件tree.html、tree.js、tree.css&#xff0c;放在同一个目录下按1、2、3小节填充这三个文件浏览器打开tree.html文件 1 .HTML-基本布局 搞一个.html文件&#xff0c;内容如下 <!DOCTYPE html> <html lang"en"><…

【OpenCV-Python】教程:7-1 理解 kNN (k-Nearest Neighbour)

OpenCV Python 理解kNN &#xff08;k-Nearest Neighbour&#xff09; 【目标】 理解 kNN 算法的基本概念 【理论】 kNN是监督学习中最简单的分类算法之一。其思想是在特征空间中搜索与测试数据最接近的匹配。我们将用下图来研究它。 在图像中&#xff0c;有两个"家族…

一文看懂 InnoDB 的内存淘汰逻辑(LRU)

InnoDB淘汰的逻辑是怎样的呢&#xff1f; InnoDB 内存管理用的是最近最少使用 (Least Recently Used, LRU) 算法&#xff0c;这个算法的核心就是淘汰最久未使用的数据。 下图是一个 LRU 算法的基本模型。 InnoDB 管理 Buffer Pool 的 LRU 算法&#xff0c;是用链表来实现的。…

Go项目实战:02-微服务micro services

1、微服务&#xff08;micro services&#xff09; 单体式架构服务 过往大家熟悉的服务器。 特性&#xff1a; 1、复杂性随着开发越来越高&#xff0c;遇到问题解决困难。2、技术债务逐渐上升。3、耦合度高&#xff0c;维护成本大。 - 1、出现bug&#xff0c;不容易排查 - 2…

[ 数据结构 -- 手撕排序算法第六篇 ] 快速排序

文章目录前言一、常见的排序算法二、快速排序的基本思想三、快速排序的不同实现1.hoare版本2. 挖坑法3. 前后指针法4.三种版本单趟排序结果5.快速排序三数取中优化6.小区间优化四、快速排序的特性总结前言 手撕排序算法第六篇&#xff1a;快速排序&#xff01; 从本篇文章开始…

JavaSE面试题(二)

1&#xff1a;说一说八大基本数据类型 2&#xff1a;面向对象 面向对象的核心&#xff0c;就是类和对象。Java中的面向对象的思想&#xff1a;万物皆对象。 类&#xff1a;是对一类事物的描述&#xff0c;是抽象的&#xff0c;看不见&#xff0c;摸不着。 对象&#xff1a;是实…

week 7 吴恩达 调参 ,batch norm,softmax

文章目录前言7.1调整参数的过程 Turing progress7.2、scale7.3 如果在实践中探寻超参数7.4 batch normalization 批量归一化7.5 将BN算法拟合到神经网络中7.6 为什么 BN有效&#xff1f;7.7测试时的BN7.8 7.9 softmax regression7.10深度学习的框架前言 7.1调整参数的过程 Turi…

CentOS 8:环境变量

环境变量 环境变量&#xff0c;就是放在当前环境中的变量 无论Linux &#xff0c;还是Windows&#xff0c;都有环境变量 比如&#xff0c;最常用的环境变量 PATH, JAVA_HOME 定义环境变量 export JAVA_HOME/opt/jdk1.8 显示环境变量 echo $JAVA_HOME 查看所有环境变量…

c语言位操作和变量存储类型

c语言位操作 c语言变量存储类型 格式[存储类型说明符] 数据类型说明符 变量名&#xff0c;例如&#xff0c;auto int a;但一般情况下auto是省略的 其他类型说明符还有&#xff1a;static 、extern、register auto最普通动态存储&#xff0c;但所在范围的函数程序结束后&#xf…

处理模型视图中的选择

有关在视图中选择的项的信息存储在QItemSelectionModel类中&#xff0c;这将维护单个模型中项的模型索引&#xff0c;并且独立于任何视图。由于一个模型可以有多个视图&#xff0c;因此可以在视图之间共享选择&#xff0c;从而允许应用程序以一致的方式显示多个视图 选择由选…