为什么学习 YOLO-V5 ?
- 算法性能:与YOLO系列(V1,V2,V3,V4)相比,YOLO-V5效果最好,速度最快。
- 项目质量:自项目开源,作者一直精心维护,优化,更新,目前已经更新到V7版本,项目整体质量非常高。
- 工业部署:在工业界,要能够部署到低性能设备,并且保证效果和速度。为此,模型不能太大、不能有特别复杂、奇怪的网络模块,速度和效果不能受影响太大,芯片设计的支持(很多NPU厂商均将YOLO-V5作为测试Demo)。YOLO-V5满足所有这些需求,所以非常适合工业界部署和落地。
- 适合学习:该项目一直在维护,作者会回答【git issue】上提出的任何问题。参与开发和使用的人很多,所以相关学习资源非常丰富,适合新手或者一定工作经验的同学长期学习。
博客文章列表
本系列教程,使用【YOLO-V5,V6.1】版本进行算法和代码的讲解。下面是该教程的文章更新列表,
- YOLO-V5 算法和代码解析系列(一)—— <快速开始(已更新)
- YOLO-V5 算法和代码解析系列(二)—— 【train.py】核心内容(已更新)
- YOLO-V5 算法和代码解析系列(三)—— 数据加载(已更新)
- YOLO-V5 算法和代码解析系列(四)—— 网络结构(已更新)
- YOLO-V5 算法和代码解析系列(五)—— 损失函数(已更新)
- YOLO-V5 系列算法和代码解析(六)—— 分布式训练(已更新)
- YOLO-V5 算法和代码解析系列(七)—— 指标评估(已更新)
- YOLO-V5 算法和代码解析系列(八)—— 自定义数据集(待更新)
- YOLO-V5 算法和代码解析系列(九)—— 训练自定义数据(待更新)
- YOLO-V5 算法和代码解析系列(十)—— 瑞芯微芯片部署(已更新)
面向对象
(1)有一定深度学习、python基础,打算系统、深入学习 YOLO-V5;
(2)有一定工作经验的同学,希望进一步提升自己,比如如何阅读开源项目,深入学习目标检测等;
(3)工作过程中,需要在低性能设备端部署目标检测模型,特别是部署芯片为瑞芯微;
开源项目学习方法
在个人学习开源项目过程中,通过不断尝试、探索、思考和总结,归纳出开源项目学习的一般方法(仅仅针对深度学习类项目)。学习过程中,可以结合自己的实际情况进行调整。具体学习流程如下,
-
运行 Demo
在接触任何一个开源项目之前,必然是将项目成功运行起来,先睹(可视化效果)为快。在当前步骤的学习中,应该达到如下的【目标】,(1)参考开源项目的【README.md】,配置项目的运行环境;
(2)运行demo示例,能够得到可视化结果,比如运行 detect.py,inference.py 等代码文件; -
简单训练一次
按照开源项目的训练教程,自己训练一次,并计算性能指标。具体完成内容如下,(1)准备训练所需数据集;
(2)调试训练代码,保证可以正常运行;
(3)运行 train.py,训练模型,与作者的结果进行比对,误差在【2%】左右,可以接受; -
第一次阅读代码
完成【1.,2.】后,说明开源代码基本没有大问题,可以进一步深入学习。此时可以开始阅读代码,遇到的任何问题均需要记录(要做记录,要做记录,要做记录),并且要达到如下的【目标】:(1)理清训练代码(注意,不是预测代码)的整体运行逻辑,彼此之间的调用关系;
(2)核心模块的代码位置:主运行模块,数据加载和数据增强模块,网络结构模块,损失函数模块;
(3)阅读过程中,一定要做好【记录】,问题点大致分为如下几类:
疑问点(阅读过程中,自己产生的任何问题,均需要记录,带着问题学习很重要,后续也可以反复看看);
典型知识点(可以理解清楚,但是需要系统总结的知识点);
困惑点(比较难以理解,感觉理解了,有时又感觉没有理解清楚);
困难点(反复研究,仍无法理解的算法或者代码实现逻辑); -
第二次阅读代码
完成【3.】后,对项目整体的逻辑和结构,不理解的问题点有了大致的了解,但是对各个模块的实现细节不清楚。接下来,需要逐个模块研究,各个击破。注意,此时要着重解决【3.】中记录的【困惑点、困难点】问题,并在文档中记录解决的方法。该步骤需要达到的目标,具体如下:(1)数据加载模块:数据加载是深度学习训练的重要部分,直接决定训练的效率;必须深入理解数据加载通道的每一个环节;
(2)数据增强模块:基本是图像处理类算法,理解每类算法的精髓,调试出可视化结果;
(3)网络结构模块:包含网络的构建过程,网络推理过程,最后手动完成网络结构绘制;
(4)损失函数模块:理解损失函数的是如何构造的,作用,与网络输出是如何运算的; -
第三次阅读代码
完成【4.】后,基本对整体的逻辑,并且每一个模块的核心都基本理解,或许还会在某个模块的某个知识点不是很理解。在此次阅读代码过程中,应达到如下目的:(1)从更高层次,重点学习、理解开源项目的整体设计架构,汲取自己所需;
(2)总结一些特殊的实现技巧,优化技巧等;
(3)对还有疑惑的知识点,核心模块,可以进一步思考,理解,并更新之前的记录; -
写博客
如果有兴趣、有时间,可以写博客记录,进一步加深自己的理解,也能帮助其它小伙伴学习~~
预备知识
- 深度学习基础知识
- OpenCV基础知识
- Pytorch基础知识
- vscode、pycharm 基本调试方法
项目目录结构
-
项目的组织结构
项目的一级目录如下图所示,每个目录具有各自的功能。一个开源项目的常见组织结构大致如此,【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:损失函数的定义、计算 -
核心模块
下面的思维导图,大致展示了YOLO-V5的核心模块,以及核心模块相关的核心知识点。开始阅读代码时,应该优先研究核心模块,掌握该项目的核心算法(切勿一开始把精力浪费在边缘功能模块)。思维导图的最后一级对应着YOLO-V5的关键模块,要着重理解,
-
学习的相关文档记录
在学习该项目过程中,根据记录内容的不同,建立了相应的文件类型(比如,word,思维导图,PPT,流程图等)。所有的记录文档如下图所示,
在阅读开始时,文档【YOLOV5阅读记录.docx】就开始记录内容。学习过程中,逐步丰富内容,记录了很多问题点,知识点。随着每一次深度阅读代码,一些难点问题逐渐被攻克,并且记录了解决的方法(每一次阅读会逐步修正之前错误的理解,或者浅显的理解)。个人认为,这种学习方法非常有助于【真正透彻理解】一个完整的开源工程。文档截图展示如下(内容可能看不清,这不重要哈~~~),