什么是目标检测?github项目解析(持续更新中)

温馨提示文章内容完整但是过长,由于前后内容有关联,读者学习可以多开几个浏览器分屏有助于定位

目录

目标检测理论部分

1.目标检测介绍

2.YOLOv5的检测原理

3.目标检测的意义

4.目标检测的应用场景

5.先行知识储备

        (1)NMS非极大值抑制

        (2)网络爬虫

        (3)streamlit

        (4)损失函数

        (5)各评估指标

        (6)开源数据集介绍

        (7)深度学习框架的理解

        (8)混淆矩阵、mr曲线

        (9)标签文件理解

        (10)labelimg数据分析

        (11)Requirements.txt指导模块

        (12)fun-turing

        (13)Fusing layers...

        (14)F1曲线

6.目标检测相关论文

7.网络结构

目标检测实操部分

1.GitHub介绍

2.为什么要用官方开源的项目来实现任务而不自己实现?

3.yolov5项目阅读理解(GitHub)

        运行脚本参数解析数据曲线分析模型分析等

4.任务流程

        (0)确定任务

        (1)理解原理

        (2)选择算法

        (3)研究论文

        (1)数据采集+数据标注+数据预处理

        (2)训练、验证及数据分析

        (3)测试、评估

                模型转换代码使用

        (5)部署

5.本人说明

6.永久源码地址

7.如何修改成自己的项目

        (1)数据集文件夹

        (2)两个yaml文件

        (3)爬虫脚本

        (4)批量图片重命名脚本

        (5)streamlit命令里的参数

        (6)命令行

9.个人心得体会


目标检测理论部分

1.目标检测介绍(哪些算法,趋势)

                目标检测(Object Detection)的任务是找出图像中所有感兴趣的目标(物体),确定它们的类别和位置,是计算机视觉领域的核心问题之一。由于各类物体有不同的外观、形状和姿态,加上成像时光照、遮挡等因素的干扰,目标检测一直是计算机视觉领域最具有挑战性的问题。

                什么是物体(物体的定义):
图像(或者视频)中存在的对象,但是能检测哪些物体会受到人为设定限制。
目标检测中能检测出来的物体取决于当前任务(数据集)需要检测的物体有哪些。假设我们的目标检测模型定位是检测动物(例如,牛、羊、猪、狗、猫五种),那么模型对任何一张图片输出结果不会输出鸭子、鹅、人等其他类型结果。

                什么是位置(位置的定义):
                目标检测的位置信息一般有2种格式(以图片左上角为原点(0,0)):

                极坐标表示:(xmin,ymin,xmax,ymax)
                xmin,ymin:x,y坐标的最小值
                xmax,ymax:x,y坐标的最大值

                中心点坐标:(x_center,y_center,w,h)
                x_center,y_center:目标检测框的中心点坐标
                w,h:目标检测框的宽,高

        (原文链接:https://blog.csdn.net/AugustMe/article/details/107778518)

        例:
        假设一张图片是100*800,所有这些坐标都是构建在像素层面上:

在这里插入图片描述
中心点坐标结果为:
在这里插入图片描述

                        计算机视觉中关于图像识别有四大类任务:

                (1)分类-Classification:解决“是什么?”的问题,即给定一张图片或一段视频判断里面包含什么类别的目标。

                (2)定位-Location:解决“在哪里?”的问题,即定位出这个目标的的位置。

                (3)检测-Detection:解决“在哪里?是什么?”的问题,即定位出这个目标的位置并且知道目标物是什么。

                (4)分割-Segmentation:分为实例的分割(Instance-level)和场景分割(Scene-level),解决“每一个像素属于哪个目标物或场景”的问题。

                所以,目标检测是一个分类、回归问题的叠加。

2.YOLOv5的检测原理

YOLO算法原理讲解(通俗易懂版)_哔哩哔哩_bilibili

3.目标检测的意义

        目标检测是计算机视觉领域的一个重要任务,其主要目的是从图像或视频中自动识别和定位出感兴趣的物体。目标检测在很多领域都有着广泛的应用和意义,例如: 自动驾驶:无人驾驶汽车需要快速准确地检测和识别道路上的各种交通标志、车辆、行人等物体信息,以实现智能导航和自主避障。 安防监控:通过对安防摄像头拍摄到的图像进行目标检测,可以及时发现并报警处理异常情况,提高安全性能。 工业制造:利用目标检测技术可以对生产流程中的产品、设备、零部件等进行质量检测和异常监测,提高生产效率。 医学影像:医学图像中包含丰富的信息,通过目标检测技术可以快速准确地定位和识别病变区域,为医生提供更精细的诊断和治疗指导。 无人机巡检:无人机配备目标检测技术可以对建筑、设施、线路等进行智能化巡检和维护,提高效率和安全性。因此,目标检测技术在实际应用中具有重要的意义和价值,可以帮助我们更好地理解场景信息,从而提高生产效率、减少安全风险、改善生活质量等方面发挥作用。    因此,目标检测技术在实际应用中具有重要的意义和价值,可以帮助我们更好地理解场景信息,从而提高生产效率、减少安全风险、改善生活质量等方面发挥作用。

4.目标检测的应用场景

      ​编辑

5.先行知识储备

        (1)NMS非极大值抑制

        (2)网络爬虫

        (3)streamlit

        (4)损失函数

        (5)各评估指标

        (6)开源数据集介绍

1. PASCAL VOC

VOC数据集是目标检测经常用的一个数据集,自2005年起每年举办一次比赛,最开始只有4类,到2007年扩充为20个类,共有两个常用的版本:2007和2012。学术界常用5k的train/val 2007和16k的train/val 2012作为训练集,test 2007作为测试集,用10k的train/val 2007+test 2007和16k的train/val 2012作为训练集,test2012作为测试集,分别汇报结果。

2. MS COCO

COCO数据集是微软团队发布的一个可以用来图像recognition+segmentation+captioning 数据集,该数据集收集了大量包含常见物体的日常场景图片,并提供像素级的实例标注以更精确地评估检测和分割算法的效果,致力于推动场景理解的研究进展。依托这一数据集,每年举办一次比赛,现已涵盖检测、分割、关键点识别、注释等机器视觉的中心任务,是继ImageNet Challenge以来最有影响力的学术竞赛之一。

相比ImageNet,COCO更加偏好目标与其场景共同出现的图片,即non-iconic images。这样的图片能够反映视觉上的语义,更符合图像理解的任务要求。而相对的iconic images则更适合浅语义的图像分类等任务。

COCO的检测任务共含有80个类,在2014年发布的数据规模分train/val/test分别为80k/40k/40k,学术界较为通用的划分是使用train和35k的val子集作为训练集(trainval35k),使用剩余的val作为测试集(minival),同时向官方的evaluation server提交结果(test-dev)。除此之外,COCO官方也保留一部分test数据作为比赛的评测集。

3. Google Open Image

Open Image是谷歌团队发布的数据集。最新发布的Open Images V4包含190万图像、600个种类,1540万个bounding-box标注,是当前最大的带物体位置标注信息的数据集。这些边界框大部分都是由专业注释人员手动绘制的,确保了它们的准确性和一致性。另外,这些图像是非常多样化的,并且通常包含有多个对象的复杂场景(平均每个图像 8 个)。

4. ImageNet

ImageNet是一个计算机视觉系统识别项目, 是目前世界上图像识别最大的数据库。ImageNet是美国斯坦福的计算机科学家,模拟人类的识别系统建立的。能够从图片识别物体。ImageNet数据集文档详细,有专门的团队维护,使用非常方便,在计算机视觉领域研究论文中应用非常广,几乎成为了目前深度学习图像领域算法性能检验的“标准”数据集。ImageNet数据集有1400多万幅图片,涵盖2万多个类别;其中有超过百万的图片有明确的类别标注和图像中物体位置的标注。

五、常用图像标注工具

        (7)深度学习框架的理解

        (8)混淆矩阵、mr曲线

        (9)标签文件理解

        (10)labelimg数据分析

https://download.csdn.net/download/weixin_46412999/87708379

        (11)Requirements.txt指导模块

        (12)fun-turing

        (13)Fusing layers...

        (14)F1曲线

                        横轴是模型对于预测结果的置信度(confidence),纵轴是F1分数的曲线表明在不同的置信度阈值下,模型的分类性能如何。通过分析该曲线,可以选择一个合适的置信度阈值来平衡模型的召回率和精确率,并达到最佳的F1分数。当置信度阈值较高时,模型仅会保留它非常自信的预测结果,这意味着模型会过滤掉一些真实的正例(false negatives),从而导致召回率下降,同时精确率可能会提高。反之,当置信度阈值较低时,模型会更多地接受不太自信的预测结果,包括那些错误的预测结果(false positives),这样精确率就会降低,但召回率可能会提高。因此,对于曲线上的某个点,我们可以根据任务需求选择相应的置信度阈值,以获得较好的F1分数。如果任务需要准确识别所有正例,则应选择较低的置信度阈值;如果任务需要高精度的检测结果,则应选择较高的置信度阈值。

        (15)如何链接远程摄像头

https://download.csdn.net/download/weixin_46412999/87708406

6.目标检测论文

在这里插入图片描述

目前官方没有发布YOLOv5论文,技术原理参考YOLOv1-4

  1. YOLOv1: "You Only Look Once: Unified, Real-Time Object Detection" 论文链接:https://arxiv.org/abs/1506.02640

  2. YOLOv2: "YOLO9000: Better, Faster, Stronger" 论文链接:https://arxiv.org/abs/1612.08242

  3. YOLOv3: "YOLOv3: An Incremental Improvement" 论文链接:https://arxiv.org/abs/1804.02767

  4. YOLOv4: "YOLOv4: Optimal Speed and Accuracy of Object Detection" 论文链接:https://arxiv.org/abs/2004.10934

7.网络结构

参考链接:

第六篇—YOLOv5网络结构(YOLOv5专题) - 哔哩哔哩

  • BackboneNew CSP-Darknet53
  • NeckSPPFNew CSP-PAN
  • HeadYOLOv3 Head

YOLOv5需要经过Backbone、Neck、Head这三个组成部分是因为:

  1. Backbone:负责提取图像特征,将输入图片转化为高维特征表示。在YOLOv5中使用的是CSPDarknet53作为骨干网络(backbone),其可以有效地提取图像特征。

  2. Neck:负责进一步处理从骨干网络输出的特征,以便于后续的目标检测。在YOLOv5中使用的是FPN(Faster R-CNN)的变体,即PAN(Path Aggregation Network)。

  3. Head:负责生成最终的目标检测结果,包括目标的位置和类别等信息。在YOLOv5中使用的是YOLOv4 head的改进版SPP(Spatial Pyramid Pooling) head。

Backbone骨干网络

                        Backbone骨干网络主要作用是提取图片的特征,并不断缩小特征图,Backbone包含了CBL模块、Focus模块、CSP模块和SPP模块。

                (1)CBL模块

                        CBL为标准卷积模块,包括普通卷积层Conv、批量归一化层BN和LeakyReLU激活函数层,如下图所示:

                (2)Focus模块

                        Focus模块是对图片进行切片操作,具体操作是在一张图片中每隔一个像素取一个值,类似于邻近下采样,可以得到四张采样图片,四张图片互补,图片内容差不多,但是整体操作没有信息丢失。Focus将图片H*W空间维度的信息转换到了Channel通道维度,H和W均减为原来一半,Channel扩充为原来四倍,然后将新图片经过一次卷积操作,得到没有信息丢失情况下的二倍下采样特征图,切片操作如下图所示:

                                                                    切片操作

                                Focus模块如下图所示:

                                                                    Focus模块

        (3)CSP模块

                        CSP模块包括CSP1_X模块和CSP2_X模块,两者都借鉴了CSPNet网络结构,CSP1_X模块和CSP2_X模块如下图所示: 

                                                                    CSP1_X模块

                                                                    CSP2_X模块

                        可见,ResUnit模块的shortcut参数设置为True,就是CSP1_X模块的组件;设置成False,就是CSP2_X模块的组件

        (4)SPP模块

                        SPP(Spatial Pyramid Pooling)模块称为空间金字塔池化模块,通过引入不同的池化核来提取特征图中不同大小目标的特征,SPP模块如下图所示:

Neck颈部结构

                        Neck颈部结构主要实现浅层图形特征和深层语义特征的融合。在卷积神经网络的浅层,网络提取的是一些像颜色、轮廓、纹理和形状等简单的特征,属于图形特征;随着网络的不断加深,神经网络会将这些特征不断融合、升维,产生新的特征,属于语义特征。总之,图形特征来自卷积神经网络浅层,只是简单的图形,语义信息较少;而语义特征来自卷积神经网络的深层,语义信息丰富,但却缺少局部细节特征信息。Neck包含了自顶向下的FPN模块和自底向上的PAN模块,其中,FPN是自顶向下,将深层的语义特征传递到浅层,增强了语义信息,不过对浅层的定位信息没有传递;PAN是对FPN的补充,在FPN的后面添加了一个自底向上的金字塔结构,将浅层的强定位特征传递到深层,FPN和PAN又被称为“双塔战术”,FPN如下图(a)所示,PAN如下图(b)所示。 

YOLOv5的FPN和PAN结构: 

                                                                     YOLOv5的FPN和PAN结构

Head头部结构

                                YOLOv5输出为255*H*W、255*2H*2W和255*4H*4W三个特征图,尺寸最小的255*H*W负责检测大目标,255*2H*2W负责检测中目标,尺寸最大的255*4H*4W负责检测小目标,通道数255=3*(5+80),其中,3表示3个Anchor,5表示四个位置信息(x,y,w,h)和一个置信度confidence(表示当前网格中可能存在物体的概率),80表示COCO数据集80个类别的概率,具体通道信息的表示如下图所示。

                        YOLOv5输出255*H*W、255*2H*2W和255*4H*4W三个特征图,每个特征图都有三个Anchor,一共有9个Anchor。其中,尺寸最小的255*H*W因为负责检测大目标,所以对应的Anchor相对较大;尺寸最大的255*4H*4W负责检测小目标,所以对应的Anchor相对较小,YOLOv5中的Anchor如下: 

                Anchor可视化: 

                                                                Anchor可视化 

目标检测实操部分

1.GitHub简介

        它不仅是个巨大的和世界性的Git仓库托管服务平台,还是团队协作或多人协作开发的好帮手。在这里,你能找到你感兴趣的项目代码仓库,从而解决你学习和工作的需求,另一方面,它还可以让你与世界各地的开发人员协同开发和交流你们所感兴趣的项目!
在这里,不只是GitHub的世界,还是一个追求社会化编程,开源思想的世界,能在从中不断学习和成长!

        总的来说,国内外的编程人员将项目编写完后就会公布在平台上,它收集了各种语言各种项目的代码供大家使用和分享。

2.为什么要用官方开源的项目来做目标检测?

使用官方开源项目进行目标检测有以下几个优势:

  1. 高效性:官方开源项目通常经过了大量的测试和优化,并且被广泛应用于实际场景中,因此能够保证高效、稳定地完成任务。

  2. 开发速度快:使用已有的开源项目可以大大缩短开发周期,从而快速实现目标检测功能。

  3. 学习成本低:在使用官方开源项目时,开发人员可以参考其文档、示例代码和社区支持等资源,从而更容易学习和理解相关技术知识。

  4. 社区支持强大:许多官方开源项目都有庞大的社区支持,这意味着开发人员可以获得来自社区的技术支持、问题解答和新功能推介等帮助。

  5. 可扩展性高:官方开源项目通常是模块化设计,以便开发人员可以添加自己的想法和创新。同时,由于是开源项目,也可以通过贡献代码来增强功能和性能。

自己编写的目标检测项目的劣势:

  1. 算法模型:自身精力有限,项目是一个团队合作的过程,特别是一个人编写,而官方开源项目通常会选择性能较好、经过大量验证的算法,或者是其改进版本。其次自身能力有限,官方的项目都是经过科学家,研究员研究出来的,而一般的程序编写者很难达到。

  2. 代码质量:官方开源项目通常由专业的团队或者是社区共同维护,代码质量和功能都经过了严格测试和优化;而自己编写的项目可能存在一些代码逻辑上的错误或者性能瓶颈。

  3. 开发周期:自己编写的项目需要从头开始搭建,并且需要处理各种问题和难点,所需的时间和精力都比较大;而使用官方开源项目可以节省大量的开发时间和精力,缩短开发周期。

  4. 社区支持:官方开源项目通常有着庞大的社区支持,用户可以得到来自社区的技术支持和问题解答等帮助;而自己编写的项目通常不会得到这样的帮助和支持。

因此,使用官方开源项目可以获得更好的算法模型、数据集以及代码质量,并且缩短开发周期,与此相比,使用官方开源项目可以更快、更便捷地实现目标检测,并且具有较高的稳定性和可扩展性。

2.解析YOLOv5的GitHub项目

项目地址:https://github.com/ultralytics/yolov5/tree/v6.2

        进入项目,对于YOLOv5,可以发现作者发布了10个版本的项目。项目的使用方法和项目介绍都可以通过作者发布的README.md文件去了解,这也是这个文件的主要功能。README.md文件一般在项目的根目录下,项目路径的其他文件夹下也会存在REAMD.md文件,这就是对项目中一些针对性的功能说明了。

        我们以6.2版本为例做出自己的目标检测任务。首先我们能通过网页看到6.2版本的

更新时间是在2022/8/17,整个项目用到的python语言占98.5%。

        进入README.md,开始了解并使用项目。

        下面我会对每个小节的知识点进行讲解:

 COCO数据集是什么,为什么作者要用它进行YOLOv5训练?

        COCO 数据集是一种广泛用于目标检测、分割和关键点检测等计算机视觉任务的大规模数据集,由微软亚洲研究院(Microsoft Research Asia)开发和维护。COCO 数据集收集了各类真实场景下的图像,并为图像中的目标提供了精确的边界框、分割掩码和关键点坐标等注释信息。

        COCO 数据集的特点包括:

  1. 规模大:包含超过 330,000 张图像和 2.5 万个类别。
  2. 多样性:包含多种类别的目标,如人、动物、交通工具等,以及多种不同场景和背景下的图像。
  3. 精度高:每个目标都有非常准确的注释,包括边界框、分割掩码和关键点信息。

        对于使用 YOLOv5 进行目标检测训练,COCO 数据集是一个非常好的选择。因为 YOLOv5 是一种基于单阶段检测器的目标检测算法,其在训练时需要大量且高质量的标注数据来训练目标检测网络,在这方面 COCO 数据集既具备了大规模数据集的优势,同时又能够提供较为精确的目标注释信息,因此,使用 COCO 数据集进行 YOLOv5 的训练可以获得更好的模型性能和泛化能力。

Install(安装): 

        首先我们需要安装虚拟环境,创建时指定python>=3.7,pytorch>=1.7.建议不要太高,太高也会报错,我最开始使用的torch1.13降低到1.7才能使用。关于如何安装环境请看上一篇语义分割安装环境模块详细讲解

        虚拟环境(Virtual Environment)是一种在单个计算机上创建多个独立的 Python 运行环境的技术。虚拟环境允许用户在不同的项目中使用不同版本的 Python 解释器和第三方库,以避免出现版本冲突和依赖问题。虚拟环境实际上是一种完全独立的 Python 运行环境,它与其他虚拟环境和全局 Python 环境相互隔离。在每个虚拟环境中,用户可以安装和使用不同版本的 Python 解释器和第三方库,并且这些库仅在当前环境中可见,不会影响其他虚拟环境或全局环境。进入虚拟环境后,用户可以使用 pip 命令安装所需的 Python 包和库。当用户完成当前项目的开发后,可以通过 deactivate 命令退出虚拟环境。总之,虚拟环境是一种非常有用的技术,它可以帮助 Python 开发者更好地管理和维护项目的依赖关系,以避免出现版本冲突和依赖问题。可以形象的理解为不同房间放不同物品,房间就是虚拟环境,物品就是项目。

git clone https://github.com/ultralytics/yolov5 

        Git是一种分布式版本控制系统,用于管理和跟踪软件开发过程中的代码版本和变更历史。Git可以帮助软件团队协同工作,保持代码的稳定性和可靠性,并方便地进行代码回滚、合并和分支等操作。该命令是git命令,是从github网址中下载该项目,一般电脑没有git模块,需要下载。一般也不需要特意下载git,我们通过主界面的右上角绿色的code按钮就能下载源码。

pip install -r requirements.txt  # 安装

        改命令是作者将项目所需要的所有环境模块封装到txt文本,我们只需要下载就行。下载前提是进入到该项目的环境中,并且进入到该文件的目录下。

Inference(推理): 

        推理即预测,使用训练好所得到的模型对未知数据进行推理预测(test测试集)。有两种推理方法:PyTorch Hub推理和使用detect.py推理。一般使用detect.py,即运行脚本推理。生成的结果保存在./runs/detect下

        它们的区别在于:

  1.  YOLOv5 PyTorch Hub推理是利用PyTorch Hub提供的模型进行推理,可以直接调用模型进行预测,detect.py则是通过运行源代码自己训练模型并进行推理。

  2. YOLOv5 PyTorch Hub推理不需要安装额外的依赖项或下载模型文件,可以直接在脚本中调用模型进行推理。而detect.py需要先下载模型文件,并安装相应的依赖项才能进行推理。

  3. 在使用YOLOv5 PyTorch Hub推理时,可以使用不同的模型版本(如不同的网络结构、预训练权重等),而detect.py则只能使用当前版本的模型进行推理。

        总之,两种方法都是使用YOLOv5模型进行目标检测推理的方式。但是PyTorch Hub推理更加方便快捷,而detect.py则可以更加灵活地控制模型和参数。--source指定参数值,其他参数依次类推。

python detect.py --source 0  # 网络摄像头

        参数说明:

  • weights:模型权重文件路径,默认值为'yolov5s.pt'
  • source:输入数据路径,可以是文件、文件夹、URL或glob格式,如果值为0,则表示使用摄像头输入
  • data:数据集配置文件路径,可选,默认值为'coco128.yaml'
  • imgsz:推理时图像的尺寸,用(h, w)表示,默认值为[640]
  • conf-thres:置信度阈值,当检测分数高于此阈值时才认为该目标存在,默认值为0.25
  • iou-thres:非极大值抑制(NMS)的IoU阈值,用于去除重叠较多的检测框,默认值为0.45
  • max-det:每张图像最多允许检测到的目标个数,默认值为1000
  • device:运行设备,可以是CPU或GPU,如果是GPU,则可以指定GPU编号,默认值为空字符串(即自动选择)
  • view-img:是否显示检测结果图像,默认为False
  • save-txt:是否将结果保存为txt文件,默认为False
  • save-conf:是否在保存结果时同时保存置信度,默认为False
  • save-crop:是否保存裁剪的预测框,默认为False
  • nosave:是否不保存图像或视频,默认为False
  • classes:指定需要检测的类别,可以是单个类别编号或多个类别编号,例如--classes 0或--classes 0 2 3
  • agnostic-nms:是否使用无类别NMS(即将所有类别视为同一类别进行NMS),默认为False
  • augment:是否使用数据增强进行推断,默认为False
  • visualize:是否可视化特征地图,默认为False
  • update:是否更新所有模型,默认为False
  • project:保存结果的目录路径,默认为'runs/detect'
  • name:保存结果的文件名,默认为'exp'
  • exist-ok:是否允许覆盖已有的结果文件夹,默认为False
  • line-thickness:绘制边框时的线条粗细,默认为3
  • hide-labels:是否隐藏标签,默认为False
  • hide-conf:是否隐藏置信度,默认为False
  • half:是否使用FP16半精度进行推断,默认为False
  • dnn:是否使用OpenCV DNN进行ONNX模型推断,默认为False

Training(训练): 

python train.py --data coco.yaml --cfg yolov5n.yaml --weights '' --batch-size 128
                                       yolov5s                                64
                                       yolov5m                                40
                                       yolov5l                                24
                                       yolov5x                                16

         参数说明:

  • weights:初始化权重文件路径,默认值为'yolov5s.pt'。填写空则表示从零开始训练模型
  • cfg:模型配置文件路径,默认为空字符串
  • data:数据集配置文件路径,默认值为'coco128.yaml'
  • hyp:超参数配置文件路径,默认值为'hyp.scratch-low.yaml'
  • epochs:训练轮数,默认值为300
  • batch-size:每个GPU上的批处理大小,默认值为16,-1表示自动调节批处理大小
  • imgsz:训练和验证时的图像尺寸,默认值为640像素
  • rect:是否进行矩形训练,默认为False
  • resume:是否从最近的训练中恢复训练,默认为False
  • nosave:是否只保存最终的检查点文件,默认为False
  • noval:是否只在最后一个epoch进行验证,默认为False
  • noautoanchor:是否禁用自动Anchor,默认为False
  • evolve:是否进行超参数进化,默认为False,如果指定参数,则会进行x代进化
  • bucket:gsutil储存桶名称,默认为空字符串
  • cache:缓存图片方式,可以是"ram"(默认)或"disk",也可以不指定
  • image-weights:是否对图片使用加权选择进行训练,默认为False
  • device:运行设备,可以是CPU或GPU,如果是GPU,则可以指定GPU编号,默认值为空字符串(即自动选择)
  • multi-scale:是否变化图像尺寸+/-50%,默认为False
  • single-cls:将多类别数据视为单类别进行训练,默认为False
  • optimizer:优化器类型,可以是'SGD'、'Adam'或'AdamW'之一,默认为'SGD'
  • sync-bn:是否使用SyncBatchNorm,在DDP模式下可用,默认为False
  • workers:dataloader最大工作线程数,默认为8,在DDP模式下是每个RANK的最大工作线程数。
  • project:保存结果的目录路径,默认为'runs/train'
  • name:保存结果的文件名,默认为'exp'
  • exist-ok:是否允许覆盖已有的结果文件夹,默认为False
  • quad:是否使用四路dataloader,默认为False
  • cos-lr:是否使用cosine lr scheduler,默认为False
  • label-smoothing:标签平滑系数,默认为0.0
  • patience:EarlyStopping的等待轮数(没有改善的轮数),默认为100
  • freeze:冻结层级列表,默认为[0],其中0表示不冻结任何层,10表示冻结骨干网络,[0, 1, 2]表示冻结前三层
  • save-period:每隔x轮保存一次检查点文件(如果小于1则禁用此功能),默认为-1
  • local_rank:DDP参数,不要修改
  • entity:W&B实体名称,默认为None
  • upload_dataset:是否上传数据到W&B,默认为False,如果指定参数,则会上传验证集数据
  • bbox_interval:设置bounding-box图像日志记录间隔,默认为-1
  • artifact_alias:数据集工件版本号默认为"latest"

        如果横轴是300,纵轴分别是GIoU、Objectness、Classification、Precision和Recall的四个模型,表示对这四个模型在训练过程中不同指标损失的变化进行了可视化。val GIoU、val Objectness、val Classification、val Precision和val Recall表示在测试集上的指标。以下是每个指标的分析:GIoU:广义交并比(Generalized Intersection over Union),用于计算目标检测中检测框与真实框之间的相似程度。曲线图上的值表示模型使用GIoU作为损失函数的相对训练损失大小。可以通过比较四个模型的GIoU值,判断它们的相对表现和收敛速度,如果一个模型的GIoU值下降较快或者一直徘徊在某个水平,可能需要进一步探索,尝试更改超参数或调整网络结构等。Giou(Generalized Intersection over Union)和IoU(Intersection over Union)都是目标检测任务中常用的衡量检测框和真实框之间相似程度的指标,它们的区别在于计算方式不同。IoU计算两个框的交集面积与并集面积之比;Giou计算两个框的交集面积与并集面积之比,并考虑了外接矩形面积及其对角线长度;Giou除了考虑框的重叠情况,还考虑了框的大小差异。两者的计算方式有所不同,并且Giou在计算时考虑了框的大小差异。在许多目标检测任务中,使用Giou作为损失函数比IoU更有效。Objectness:该指标表示模型对物体存在性的预测准确度。随着训练epoch数的增加,模型应该能够更好地区分图像中存在的物体和背景,并提高对物体存在性的正确预测率。因此,曲线图上Objectness的值应该随着训练epoch数的增加而上升,如果一个模型的Objectness值没有明显提高,则说明该模型可能存在欠拟合问题,可以增加训练数据量或者调整网络结构进行优化。其值越接近1表示模型对图像中存在物体的预测越准确。Objectness从0.060开始下降到0.040,这可能意味着模型在训练过程中对图像中存在物体的预测准确率有所提高。通常情况下,随着训练的进行,模型应该能够更好地区分图像中存在的物体和背景,并提高对物体存在性的正确预测率。因此,如果Objectness的值开始下降,可能是因为模型逐渐学习了如何区分物体和背景。但需要注意的是,如果Objectness持续下降并最终趋于0,则可能意味着模型存在欠拟合问题,无法准确地检测物体。在这种情况下,可以尝试增加训练数据量、调整网络结构等操作来改善模型性能。Classification:该指标表示模型对不同物体类别的分类准确度。曲线图上的值表示模型在训练过程中相对损失大小。通常情况下,随着训练epoch数的增加,模型应该能够更好地区分不同的物体类别,并提高分类准确率。如果一个模型的分类指标停滞不前,则可能需要考虑增加训练数据量或者增加正则化项等操作。Precision和Recall:这两个指标都用于评估模型的检测性能。Precision表示模型对预测为阳性(即存在物体)的图像中真实物体的比例,Recall表示模型成功检测出的正样本数量与总正样本数之比。曲线图上的值表示模型在训练过程中的平均精度(AP)大小。模型的检测性能应该随着训练epoch数的增加而逐渐提升,因此曲线图上的Precision和Recall值应该随着训练epoch数的增加而上升。如果某个模型的Precision和Recall值没有明显提高,则说明该模型可能存在欠拟合问题,可以增加训练数据量或者尝试增加网络宽度等操作。

Tutorials(教程): 

.

        在YOLOv5项目中,通常使用四个指标来评估模型的性能和训练过程,这些指标对应的曲线如下:obj_loss:该曲线表示目标检测任务中物体检测损失函数的变化情况。在YOLOv5中,物体检测损失由定位误差损失、分类误差损失和置信度误差损失三部分组成。obj_loss曲线的下降趋势反映了模型在目标检测任务中定位和分类能力的提高。cls_loss:该曲线表示目标检测任务中分类损失函数的变化情况。分类损失用于衡量预测类别与真实类别之间的差异,cls_loss曲线的下降趋势反映了模型在目标分类方面的性能提高。metrics/precision:该曲线表示目标检测任务中预测精度(precision)随训练轮数的变化情况。预测精度是衡量模型检测结果正确率的指标,即有多少检测结果是真正的目标。metrics/precision曲线的上升趋势代表模型的检测准确率提高。metrics/recall:该曲线表示目标检测任务中召回率(recall)随训练轮数的变化情况。召回率是衡量模型检测结果覆盖率的指标,即有多少目标被成功检测到了。metrics/recall曲线的上升趋势可以表示模型检测能力的提高。总体而言,这些曲线的变化特征可以用于评估模型性能和训练效果,同时也可以作为调整超参数、优化模型结构等方面的参考。例如,obj_loss和cls_loss曲线的下降趋势可以判断模型是否已经收敛;precision和recall曲线的变化特征可以帮助调整检测阈值,以达到更好的性能表现。

        数据准备:收集、标注、处理和组织自己的数据集,以便用于模型训练。这可能涉及到图像采集、手动标注或使用第三方工具标注等操作。预处理数据:将数据集转换为适合用于YOLOv5训练的格式。这通常包括将图像和标注文件组织到特定的目录结构中,生成train.txt和val.txt文件等。配置参数:根据数据集的需求和实际情况,配置训练过程中所需的各种参数,如学习率、批量大小、迭代次数、预训练模型的选择等。开始训练:运行YOLOv5的训练脚本,开始对自定义数据集进行训练。在训练过程中,会输出一些日志信息,如损失值、精度等,可以用于监控训练效果并进行调整。模型导出:训练完成后,将训练得到的模型进行导出,以便后续应用和部署。

                ####打标签labelimg工具,如何打以及标注后的文件怎么理解,请观看我录制的视频

永久视频地址:

                ####修改配置文件

                选择修改自己的数据集根目录、训练集、验证、测试集根目录。names改成自己标签的名称 

                ####下载模型,YOLOv5s模型以及下载好,在我的根目录中,大家也可以自行下载

                ####训练

python train.py --img 640 --batch 16 --epochs 3 --data coco128.yaml --weights yolov5s.pt

                参数解析见上面讲解,可以通过自己选择合适的参数进行训练

        数据集质量:良好的数据集质量是获取高精度模型的关键。要确保数据集包含充足、多样且标注正确的图像。数据增强:使用数据增强技术可以扩充数据集,减少模型过拟合的风险,并提升模型的鲁棒性。YOLOv5提供了多种数据增强选项,如随机裁剪、旋转、缩放等。预训练模型:通常情况下,使用预训练模型可以大大加速训练收敛速度,提高训练效果。在YOLOv5中,可以选择不同大小的预训练模型(如YOLOv5s、YOLOv5m、YOLOv5l、YOLOv5x等)。超参数调整:调整学习率、批量大小、迭代次数等超参数,可以帮助优化模型性能,并提升训练效率。监控训练过程:使用Tensorboard等工具可以实时监控训练过程中的损失函数值、精度等指标,并进行分析和调整。模型保存和恢复:定期保存训练好的模型权重,以便在训练中断或出现问题时恢复训练。测试集评估:使用独立的测试数据集对训练好的模型进行评估,以检验其泛化能力和准确性,帮助调整模型参数并进一步提高模型效果。

        这四个图通常用于对目标检测数据集进行统计和分析,可以从以下几个方面进行解读:Categories per image:该图展示了每张图片中出现的目标类别数量的分布情况。通过观察该图可以得知,数据集中大部分图片都包含多个不同类别的目标,还能够发现一些特殊情况,比如只有单个目标或仅包含一个类别的情况。Instances per image:该图展示了每张图片中目标实例(bounding box)的数量分布情况。通过观察该图可以得知,数据集中绝大部分图片都包含少量(1-5)的目标实例,也有一些图片包含非常多的目标实例(超过20个)。Number of categories vs number of instances:该图展示了数据集中不同目标类别数量和目标实例数量之间的关系。通过观察该图可以得知,数据集中的目标种类数量和目标实例数量基本上呈正相关关系,但是在某些情况下也可能存在较大的差异。Instance size:该图展示了目标实例大小(bounding box size)的分布情况。通过观察该图可以得知,数据集中的目标实例大小差异很大,有些目标非常小(几十像素),而有些目标非常大(几百像素或更多)。同时还可以发现,一些目标实例的宽高比例很不均匀,这可能会对模型性能产生一定影响。通过分析这些图表可以帮助我们更好地了解目标检测数据集的情况,并根据分析结果优化模��设计和训练策略。例如,在模型设计方面,可以针对不同大小、比例等特点设计不同尺寸、形状的卷积核或采用多尺度目标检测策略;在训练策略方面,可以适当调整训练批次、学习率等超参数,以提高模型的性能和泛化能力。

        "Multi-GPU Training"指的是使用多个GPU进行模型训练,以加快训练速度和提高训练效果。在YOLOv5中,使用PyTorch框架提供的DistributedDataParallel(DDP)技术可以实现多GPU训练。具体来说,使用多GPU训练需要进行以下步骤:确保计算机上有多个GPU,并安装好相关驱动和软件环境;在YOLOv5中设置DDP参数,如节点数量、当前节点编号、主节点地址等。这些参数可以通过命令行选项或配置文件进行设置;数据并行处理:在Dataloader中使用torch.nn.DataParallel()将数据划分为多个GPU,并将计算图复制到每个GPU上进行计算;模型并行处理:使用DDP将模型划分为多为副本,在不同GPU上并行计算,加快训练速度并减少内存占用;同步梯度更新:使用all_reduce()操作将不同GPU上的梯度进行累加,然后进行平均值计算,最后统一更新所有GPU上的权重参数。通过使用多GPU训练技术,可以显著提高模型训练速度和效率,缩短训练时间,提高调试效率。但同时也需要考虑硬件资源充足性、网络延迟等问题,并进行合理的调度和资源分配。(本人没用到,仅做讲解)

        PyTorch Hub是一个由PyTorch社区维护的预训练模型仓库,旨在提供一种方便快捷的方式来共享、发现和使用各种预训练模型。PyTorch Hub支持多种深度学习任务和模型类型,包括图像分类、目标检测、语义分割、生成对抗网络等。用户可以通过简单的命令行或Python API调用,即可下载和使用这些预训练模型。此外,PyTorch Hub还提供了一些方便的功能和工具,如模型评估、Fine-tuning示例代码、可视化工具等,可以帮助用户更好地理解和应用这些预训练模型。YOLOv5已经发布到PyTorch Hub中,用户可以直接从Hub中下载并使用官方提供的预训练权重,也可以基于这些权重进行Fine-tuning操作以适应特定需求。PyTorch Hub 是一个预训练模型和数据集的仓库,它包含了各种领域的预训练模型(例如计算机视觉、自然语言处理等),可以方便地用于迁移学习或快速实验。PyTorch Hub 的优势在于:大量的预训练模型:PyTorch Hub 中包含大量的经典预训练模型,这些模型在各自领域已经被广泛验证和使用,可以直接应用于实际任务中;简单易用的 API:PyTorch Hub 提供简单易用的 API,使得用户可以轻松下载和加载预训练模型,无需编写复杂的代码;高质量的文档和示例:PyTorch Hub 有着高质量的文档和示例,帮助用户更好地理解和使用预训练模型。总之,PyTorch Hub为深度学习开发者提供了一种便捷的方式来获取、使用和分享各种预训练模型,加速了深度学习技术的应用和推广。通过 PyTorch Hub,用户可以节省大量时间和精力,快速选择和使用预训练模型。同时,用户也可以将自己的模型发布到 PyTorch Hub 上,分享给其他开发者使用。(本人没用到,仅做讲解)

        GitHub 是一个基于 web 的代码托管平台,主要提供代码管理和协作工具,包括 Git、Subversion 等版本控制系统。在 GitHub 上,用户可以创建自己的代码仓库,上传代码,并与其他人协同工作。GitHub 还支持 issue、pull request 等协作工具,方便开发者之间进行交流和贡献。GitHub 是一个非常活跃的社区,有大量开源项目、示例代码和技术文章。GitHub 主要用于代码管理和协作,而 PyTorch Hub 则专注于预训练模型和数据集的管理和分享。它们都是开发者社区中非常有用的工具,可以为开发者们提供更好的协作和学习体验。

                Opencv DNN推理、C++ inference和常规的深度学习模型推理是三种不同的技术,它们分别有不同的应用场景和特点。Opencv DNN推理:Opencv DNN是一种基于深度学习网络的推理技术,它使用深度学习网络完成图像分类、物体检测等任务。但与常规的深度学习框架相比,Opencv DNN在可移植性、速度和内存消耗等方面具有优势,因此适用于在嵌入式设备等资源受限的环境中进行深度学习模型推理。C++ inference:C++ inference是一种使用C++语言进行深度学习模型推理的技术,主要是通过访问和操作模型的计算图和权值数据实现的。相对于其他编程语言,C++的执行效率较高,且能够充分利用底层硬件的性能,因此适用于对模型推理速度有较高要求的场景。常规的深度学习模型推理:常规的深度学习模型推理指的是使用常见开源深度学习框架(如TensorFlow、PyTorch等)进行深度学习模型推理的技术。这种技术通常能够提供较高的精度和泛化性能,但相对于前两种方法,它们需要更强的计算资源和较大的内存消耗,因此适用于云端、服务器等高性能计算环境。综上所述,Opencv DNN推理、C++ inference和常规的深度学习模型推理都是不同的技术,各自适用于不同的场景和需求。

                TFLite、ONNX、CoreML和TensorRT都是一些流行的深度学习模型导出格式,它们的作用是将训练好的模型转换为特定平台上可用的推理模型。以下是对每个模型导出格式的简要介绍:TFLite:TensorFlow Lite是谷歌开发的一种轻量级机器学习框架,适用于移动设备和嵌入式系统。使用TFLite,可以将TensorFlow模型转换为可以在移动设备或嵌入式设备上运行的模型,并且具有优秀的性能。ONNX:Open Neural Network Exchange是一个跨平台、开放标准的机器学习模型格式,由微软、亚马逊等公司联合开发。使用ONNX,可以将不同框架(如PyTorch、TensorFlow等)中训练好的模型转化为通用的ONNX格式,使其可以在其他框架和硬件平台上进行部署和执行。CoreML:苹果公司开发的Core ML框架允许开发者在iOS、macOS等苹果设备上运行机器学习模型。使用Core ML,可以将各种机器学习模型转换为苹果设备上的Core ML格式,并利用苹果的专门硬件(如A12芯片)来加速模型的推理过程。TensorRT:英伟达开发的TensorRT是用于高性能深度学习推理的库和工具集。使用TensorRT,可以将训练好的TensorFlow、Caffe等框架中的模型优化为适用于NVIDIA GPU上的高性能模型,并实现加速推理。TFLite、ONNX、CoreML和TensorRT都是非常有用的模型导出格式,它们可以帮助开发者更好地将机器学习模型部署到特定平台上,并实现高效、快速的推理过程。

python export.py --weights yolov5s.pt --include torchscript onnx

                export.py脚本。这是针对YOLOv5模型的导出命令,将模型权重文件(yolov5s.pt)转换为TorchScript和ONNX格式。因为.pt的文件是一般在torch深度学习框架中使用,对于一些其他的深度学习框架如tensorflow,paddle等可能不支持使用,这时就往往需要将模型格式转换,对于Onnx格式比较通用。将指定的YOLOv5权重文件加载到PyTorch模型中,并将其转换为TorchScript和ONNX格式的模型,以便在其他平台和框架上使用。导出的TorchScript和ONNX模型可以分别保存到当前目录下的yolov5s.torchscript.ptlyolov5s.onnx文件中,方便后续部署和应用。

python benchmarks.py --weights yolov5s.pt --imgsz 640 --device 0

                benchmarks.py脚本。这是一个基于YOLOv5模型的性能测试命令,用于评估在给定硬件条件下,模型在图像分辨率为640x640的情况下的推理速度。在测试数据集上进行基准测试,并输出模型的平均推理时间(inference time)和每秒推理次数(FPS)等性能指标。该命令的作用是在指定的YOLOv5模型、输入图像大小和计算设备上对模型进行基准测试,以评估其平均推理时间和每秒推理次数等性能指标。(注意修改数据集路径)

python val.py --weights yolov5s.pt

                val.py脚本。这是一个用于基于YOLOv5模型进行验证(validation)的命令,其作用是检验在指定的测试数据集上,使用给定的YOLOv5权重文件进行推理的准确性。因此,该命令将加载指定的YOLOv5权重文件,并在指定的测试数据集上执行推理,输出预测结果和真实标签之间的性能评估指标,例如Precision、Recall、mAP等,以评估训练出的YOLOv5模型的准确性。

                Test-Time Augmentation(TTA),中文翻译为测试时增强,是一种常用的图像分类和物体检测技术,它通过对输入图像进行多次不同的随机变换,从而产生多个版本的输入数据,并将这些版本合并用于预测。在物体检测任务中,TTA通常包括对原始测试图像进行平移、旋转、缩放等几何变换,以及改变亮度、饱和度等颜色变换。然后将这些变换后的图像输入到训练好的检测模型中进行推理,得到每个版本的目标框(bounding box)和类别概率。最后,将所有版本的输出结果进行合并,例如计算每个目标框的平均位置、面积和类别概率等指标,以获得最终的检测结果。TTA可以提高模型的性能和鲁棒性,在一定程度上缓解了过拟合问题,同时还能够检测出一些在原始测试集中未曾出现的物体或场景。不过,TTA的计算成本较高,需要对每个输入图像进行多次前向传播,因此在实际应用中需要权衡模型性能和计算资源的开销。--augment参数用于在推理过程中进行数据增强(data augmentation),通过对输入图像进行随机变换(如旋转、缩放、平移等)来增加模型的鲁棒性和准确性。当设置--augment参数时,YOLOv5检测器将对每个输入图像进行多次不同的随机变换,并对这些版本的输出结果进行合并,以获得最终的检测结果。在实际应用中,使用--augment参数可以提高模型的性能和鲁棒性,尤其是在面对复杂场景、低质量图像或小目标等挑战性任务时。不过,由于数据增强需要大量计算资源,因此会带来一定的推理速度损失。因此,在进行基准测试或快速应用部署时可能会选择关闭数据增强,以提高检测器的推理速度和精度。总之,--augment参数可以根据具体任务和要求进行灵活配置,根据实际效果和需求进行调整。

                模型集成(Model Ensembling)是一种将多个不同模型的输出结果进行结合和整合,从而获得更准确、更鲁棒的预测结果的技术。它通常用于解决单个模型难以解决的问题,例如在处理大规模数据集、复杂场景或高度噪声的任务时。常见的模型集成方法包括:投票法(Voting Ensemble):通过对多个基础模型的预测结果进行投票来确定最终输出,可以是简单平均投票或加权投票。平均法(Averaging Ensemble):将多个基础模型的预测结果进行平均,得到最终输出。堆叠法(Stacking Ensemble):将多个基础模型组合成一个更复杂的模型,例如使用神经网络等方法,从而提高模型性能和鲁棒性。Boosting方法:通过训练多个弱分类器并逐步增强它们的预测能力,例如AdaBoost和Gradient Boosting等算法。模型集成可以提高模型的精度和鲁棒性,并且在一定程度上缓解过拟合等问题。然而,模型集成需要消耗更多的计算资源和时间,同时对模型的选择和训练也有更高的要求,因此需要根据具体场景和任务来选择合适的集成方法和策略。

                模型剪枝(Model Pruning)是一种通过减少神经网络中的冗余连接和参数,从而获得更加紧凑、高效的模型的技术。它可以帮助减小模型体积、提高推理速度和降低存储和计算资源的需求。常见的模型剪枝方法包括:权重剪枝(Weight Pruning):通过将一些权重值置为零或删除不重要的连接,从而减少模型中的冗余参数。这种方法可以利用稀疏矩阵存储技术来节省存储空间和计算量。通道剪枝(Channel Pruning):通过移除不重要的特征通道(channel),从而减少模型的计算量和存储空间。这种方法可以通过对每个通道的激活值进行聚类或最小化滤波器响应等方法来实现。神经元剪枝(Neuron Pruning):通过删除不需要的神经元单元,从而减少模型的计算量和存储空间。这种方法可以使用基于梯度的方法或L1正则化等技术来实现。结构剪枝(Structural Pruning):通过删除不必要的层或模块,从而减少模型的计算量和存储空间。这种方法可以通过基于网络结构的自动化搜索或手动设计等方式来实现。模型剪枝可以降低模型的冗余程度,提高模型的效率和性能,并且在一定程度上缓解了过拟合问题。但是,模型剪枝也会导致模型的精度下降,因此需要根据具体任务和应用场景来权衡模型的精度、效率和复杂度等因素。

                超参数进化(Hyperparameter Evolution)是一种通过自动搜索和优化超参数,从而提高模型性能和鲁棒性的技术。它可以快速地找到最佳的超参数组合,避免了人工调参的繁琐和耗时。常见的超参数进化方法包括:遗传算法(Genetic Algorithm):通过不断迭代生成、交叉和变异候选超参数组合,从而找到最优解。贝叶斯优化(Bayesian Optimization):通过构建一个先验分布并使用贝叶斯公式不断更新后验分布,从而找到最佳的超参数组合。网格搜索(Grid Search):在预定义的超参数空间中采样不同的组合,然后进行网格搜索来寻找最佳的超参数组合。随机搜索(Random Search):随机采样不同的超参数组合,并计算其对应的性能指标,从而寻找最好的配置。超参数进化可以有效地提高模型的性能和鲁棒性,同时也可以缓解过拟合等问题。但是,在实际应用中,超参数进化需要消耗大量的计算资源和时间,并且可能需要对超参数空间进行适当的限制和调整,以避免搜索过程过于耗费资源或找到的最优解在实际中不可行。

                迁移学习中的冻结层(Transfer Learning with Frozen Layers)是一种常用的技术,可以通过在已经训练好的模型中保持一部分层的权重不变,仅对其余部分进行微调来加速模型的训练和提高性能。在迁移学习中,通常使用预训练好的模型来作为初始模型,在新任务上进行微调。在微调过程中,模型会根据新的数据集进行更新,但是由于数据集可能较小或类别有所不同,因此完全重新训练预训练模型可能会导致过拟合或收敛缓慢等问题。因此,可以将一些层的权重固定住,即不参与微调,只让一些其他层的权重进行微调,以减少模型参数和提高泛化能力。通常,可以选择将预训练模型中靠近输入层的一些卷积层的权重固定住,这些层已经学到了一些通用的特征,可以为后续的微调提供更可靠的特征表示,同时也减少了需要训练的参数数量。而对于靠近输出层的一些全连接层,则可以进行微调,以适应新任务的需求。使用冻结层的迁移学习技术可以有效地利用预训练模型的优势,同时避免因为缺少足够的数据而导致的过拟合问题。但是需要注意的是,冻结的层数和微调的层数需要根据具体任务和数据集来确定,以达到最佳的性能和泛化能力。

                架构摘要(Architecture Summary)是一种对深度学习模型架构的可视化和理解技术,可以帮助快速了解模型的结构、参数数量、输出形状等信息,以及帮助发现可能存在的问题或调整方向。在深度学习中,模型的复杂度往往与性能和泛化能力密切相关。因此,通过架构摘要可以更好地了解和控制模型的复杂度,并帮助进行优化和改进。常见的架构摘要方法包括:可视化工具(Visualization Tools):例如TensorBoard等工具,可以用来展示模型的结构图、损失函数曲线等信息。模型摘要方法(Model Summary Methods):例如Keras中的model.summary()函数、PyTorch中的torchsummary等方法,可以在控制台或Jupyter Notebook中打印出模型的层数、输出形状、参数数量等信息。可解释性方法(Explainability Methods):例如LIME、SHAP等方法,可以对模型的预测结果进行解释,从而帮助理解模型的决策过程和规律。架构摘要可以帮助深度学习实践者更好地理解和使用模型,从而提高模型的性能和鲁棒性。但是需要注意的是,架构摘要只是为了帮助模型理解和优化,并不能代替对模型的详细分析和测试。

                Roboflow是一个可视化的数据管理平台,包括数据集收集、标注和主动学习等功能。数据集收集:Roboflow可以从各种来源收集数据集,如本地目录、云存储(如Google Cloud Storage或AWS S3)、GitHub等,并且支持许多不同的数据格式,如图像、视频、语音等。标注:Roboflow提供了一组强大的标注工具,以帮助用户进行快速、准确的标注。用户还可以自定义标注工具,以适应特定领域或任务的需要。主动学习:Roboflow还提供了主动学习的功能,它可以帮助用户优化标注过程,从而提高数据质量和标注效率。主动学习会选择最有价值的样本,并将其提交给用户进行标注。使用Roboflow可以帮助开发者更好地管理和利用数据,从而加速模型的建立和优化,同时也能够提高数据标注的准确性和效率。

                ClearML Logging是一种用于记录、分析和可视化深度学习模型行为和性能的工具,可以帮助深度学习开发者更好地了解和调整模型的训练过程。ClearML是一个提供机器学习实验管理平台的公司,其中包括了记录模型运行状态、可视化结果等丰富的功能。在深度学习中,使用ClearML Logging可以方便地记录模型的训练、验证、测试指标,例如损失函数变化、准确率、F1值等,并可将这些信息进行可视化呈现,从而帮助开发者更好理解模型的行为和性能。使用ClearML Logging的步骤通常如下:创建一个ClearML账户并安装ClearML库。在代码中导入ClearML库,并初始化一个ClearML任务。在训练和评估过程中,在关键点处记录关键指标,并将它们发送到ClearML服务器上。在ClearML网站上查看记录的指标并进行可视化和分析。(可选)与团队成员共享ClearML日志和结果,并进行协作和交流。通过ClearML Logging,开发者可以更全面、直观地了解模型的性能和训练过程,从而在优化模型时做出更明智的决策。同时,通过记录和共享ClearML日志,开发者还可以加速模型开发和交流,并在迭代过程中不断改进算法和方法。

                Deci Platform是一款基于人工智能的推理加速引擎,可以提高深度学习模型的推理速度和性能,从而实现更快的模型迭代和部署。Deci Platform采用了多种技术来提高模型推理速度和效率,包括:算子融合(Operator Fusion):将多个算子组合成一个更大的算子,从而减少内存访问、提高计算效率。自动量化(Auto Quantization):自动将浮点数网络转换为定点数网络,从而缩小模型大小并提高计算速度。模型剪枝(Model Pruning):通过剪枝掉不必要的连接和节点,从而减少模型的参数数量,并提高推理速度。模型量化(Model Quantization):将模型中的参数量化为更小的数据类型,从而减少内存使用并提高计算效率。通过这些技术,Deci Platform可以在不损失精度的情况下,大幅提高深度学习模型的推理速度和性能。同时,Deci Platform也提供了友好的API和SDK,方便开发者在���同平台上进行集成和部署,可应用于各种场景,如自动驾驶、智能物流、医疗诊断等。

 Environments(环境):

一般我们自己安装虚拟环境,运行起来项目就行,这一个本人实际过程中没用到不做讲解,感兴趣可以看看。

Integrations(如何与第三方集成):

这一栏本人实际开发过程中也没怎么用到,这些工具可以帮助用户更轻松快速地训练和管理YOLOv5模型,以提高目标检测的效率和性能。这里给大家简单介绍一下:

  1. Deci:Deci是一款AI加速器优化平台,可以自动编译和量化YOLOv5模型以提高推理性能。用户只需单击几下,即可将YOLOv5模型转换为适用于AI加速器的格式,并获得更快的推理时间。

  2. ClearML:ClearML是一款开源的实验管理工具,可用于追踪、可视化和管理机器学习实验。使用ClearML可以轻松地远程训练和监控YOLOv5模型,同时记录每次实验的配置、超参数和结果等信息。

  3. Roboflow:Roboflow是一个数据集管理平台,可以帮助用户标注、转换和导出各种格式的图像数据集。使用Roboflow可以方便地将自己的自定义数据集导入到YOLOv5中进行训练,并进行数据增强和预处理。

  4. Weights & Biases:Weights & Biases是一个实验跟踪和版本控制平台,可以记录和可视化机器学习模型的训练过程和结果。使用Weights & Biases可以方便地跟踪和比较不同模型的训练表现,改进模型并优化模型性能。

Why YOLOv5:


该曲线通常被称为"速度-精度曲线(Speed-Accuracy Curve)",其中横轴表示模型推理速度,纵轴表示在COCO验证集上的平均精度(AP)。这个曲线可以帮助我们找到在速度和精度之间的最佳平衡点,以便选择合适的模型。

具体分析如下:

  1. 精度与速度的权衡:在进行目标检测时,模型的精度和速度是需要考虑的两个重要指标。通常情况下,随着模型的加深和复杂度的增加,精度会提高但速度会受到影响。因此,需要在精度和速度之间寻找一个平衡点。

  2. 最优模型选择:通过观察速度-精度曲线,可以找到在一定速度范围内达到最佳精度的模型。如果要求较高的检测精度,则需要选择离曲线最左侧较远的模型;如果对速度要求较高,则需要选择在曲线的右侧部分较快的模型。这样就能根据具体需求选择最优的模型。

  3. 采样策略:如果想要更全面地了解速度-精度折衷的情况,可以在不同的速度和AP水平下对模型进行采样。这样可以获得更多的性能数据点,以便分析模型的整体性能。

  4. EfficientDet灰色曲线:EfficientDet是一种高效的目标检测算法,由谷歌研究团队开发。其主要特点是同时考虑了准确率、速度和模型大小三个指标,并且在这三个方面都取得了比较好的性能表现。EfficientDet采用了EfficientNet模型为基础,在此基础上进行了修改和改进。具体来说,它通过使用BiFPN(双向特征金字塔网络)来提高特征融合的效果,并且引入了一种新的损失函数Focal Loss来解决类别不平衡的问题。此外,还采用了一种自适应图像缩放的技术,可以根据不同尺寸的目标自适应调整图像大小,以便更好地检测小物体。

小尺寸五种模型,和上图观察方法一样

Pretrained Checkpoints(预训练模型):

          参数说明:

  1. Size(pixels):输入图像的大小。

  2. mAPval 0.5:0.95:在COCO验证集上,该模型在不同IoU阈值下的平均精度(mAP)评估结果。

  3. mAPval 0.5:在COCO验证集上,该模型在IoU阈值为0.5时的平均精度评估结果。

  4. Speed CPU b1(ms):在CPU上运行时,对单个batch的推理时间 (以毫秒为单位)。

  5. Speed V100 b1(ms):在Tesla V100 GPU上运行时,对单个batch的推理时间 (以毫秒为单位)。

  6. Speed V100 b32(ms):在Tesla V100 GPU上运行时,对batch size为32时的推理时间 (以毫秒为单位)。

  7. Params (M):模型参数数量(以百万为单位)。

  8. FLOPs @640 (B):模型在输入分辨率为640x640时的浮点运算次数,通常用于表示模型的计算复杂性。

可以发现前四个模型和后四个模型命名不同的原因只是训练图片尺寸变小,因此不同场景预测用不同模型合适。根据Train Custom Data中说明,本人选择YOLOv5s模型,这是第二小、最快的型号。

Classification ⭐ NEW:

此功能本人目前还没用到,这部分内容仅做讲解:

        YOLOv5发布的v6.2版本新增了对分类模型训练、验证、预测和导出的支持,这意味着用户可以使用YOLOv5进行图像分类任务。

        具体来说,YOLOv5提供了一系列用于分类模型训练的功能和工具,例如数据增强、超参数自动调整等。用户只需按照指南操作,即可轻松地构建和训练自己的分类模型。

        训练完成后,用户可以使用YOLOv5进行分类模型的验证和预测。YOLOv5还提供了多种导出方式,包括导出到ONNX、TensorRT等不同的框架和平台中,以便更好地满足用户的部署需求。

        总之,通过YOLOv5发布的v6.2版本,用户可以方便地使用YOLOv5进行图像分类任务,并且可以在一个统一的框架中同时进行目标检测和分类任务,为实际应用带来更大的便利性。

Contribute(贡献):

我们重视您的意见! 我们希望给大家提供尽可能的简单和透明的方式对 YOLOv5 做出贡献。开始之前请先点击并查看我们的 贡献指南,填写YOLOv5调查问卷 来向我们发送您的经验反馈。真诚感谢我们所有的贡献者!

Contact(联系):.

关于YOLOv5的漏洞和功能问题,请访问 GitHub Issues。商业咨询或技术支持服务请访问Ultralytics | Revolutionizing the World of Vision AI

4.任务流程

        (0)确定任务

                        确定实时人脸口罩识别属于计算机视觉目标检测任务

        (1)理解原理

                        见本文上面目标检测

理论部分

        (2)选择算法

                        YOLOv5.

                基于深度学习的目标检测算法主要分为两类:Two stage和One stage。1)Tow Stage先进行区域生成,该区域称之为region proposal(简称RP,一个有可能包含待检物体的预选框),再通过卷积神经网络进行样本分类。任务流程:特征提取 --> 生成RP --> 分类/定位回归。常见tow stage目标检测算法有:R-CNN、SPP-Net、Fast R-CNN、Faster R-CNN和R-FCN等。2)One Stage不用RP,直接在网络中提取特征来预测物体分类和位置。任务流程:特征提取--> 分类/定位回归。常见的one stage目标检测算法有:OverFeat、YOLOv1、YOLOv2、YOLOv3、SSD和RetinaNet等。RCNN: 包括 R-CNN、Fast R-CNN 和 Faster R-CNN 等,通过使用候选区域提取技术和卷积神经网络分类器共同完成目标检测。YOLO: You Only Look Once,是一种基于单个 CNN 网络的实时目标检测算法,在速度和准确率上都有着优异的表现。SSD: Single Shot MultiBox Detector,是一种高效的目标检测算法,通过在特征图上预测边界框位置和类别信息来定位目标。RetinaNet: 一种基于深度残差网络的两级检测方法,旨在解决传统单级检测方法对小目标检测效果不佳的问题。Mask RCNN: 是 Faster RCNN 的扩展,增加了语义分割分支,通过同时获得目标的类别、位置和分割掩码来实现更精细的目标检测和分割。

        (3)研究论文

                         目前官方没有发布YOLOv5论文,技术原理参考YOLOv1-4

  1.                 YOLOv1: "You Only Look Once: Unified, Real-Time Object Detection" 论文链接:https://arxiv.org/abs/1506.02640

    1.         YOLOv2: "YOLO9000: Better, Faster, Stronger" 论文链接:https://arxiv.org/abs/1612.08242

      1. YOLOv3: "YOLOv3: An Incremental Improvement" 论文链接:https://arxiv.org/abs/1804.02767

    2. YOLOv4: "YOLOv4: Optimal Speed and Accuracy of Object Detection" 论文链接:https://arxiv.org/abs/2004.10934

        (4)数据采集+数据标注+数据预处理

                数据采集(grab_img.py,rename.py):书写网络爬虫代码大量获取网站上人群口罩图片。书写重命名脚本,将爬取下来的大量图片按顺序重命名。

                数据标注(labelimg.exe):将获取的图片逐一进行标注,类别一为no_mask,类别二为mask。标注完保存,保存的文件格式是txt文本文件。此次选取的数据集来着人群密集的自然场景,如菜市场、地铁、社区、商场、公路等。为了模型的识别能力好,选择的目标人群也多样化,戴口罩的,不戴口罩的,口罩佩戴不规范的,佩戴的口罩不具备防疫效果的等等。目标检测算法做人脸口罩检测打标签时,应该将标签框住整个戴口罩的人脸,并将其分类为“带口罩”。这是因为在实际应用中,我们关心的是人是否佩戴口罩,而不仅仅是口罩本身。在目标检测任务中,标签通常是一个矩形框,用于标识出目标所在的区域。对于人脸口罩检测任务,标签应该尽可能地覆盖整个戴口罩的人脸,以保证检测的准确性和可靠性。需要注意的是,在标记标签时,应该根据具体场景和需求进行调整。例如,在一些需要更加细致的任务中,可能需要对口罩进行单独标记,以便进一步分析和处理。

 

                 数据预处理:数据分为train, valid, test三部分,放在./data下,每一部分images放原始未标注图片,labels放标注后的txt文本文件,注意labels名称不能更改。书写data.yaml和custom_yolo5s.yaml文件。data.yaml文件存放训练集、测试集地址和标签数量和标签名。custom_yolo5s.yaml文件,是复制yolo5s模型文件,将类别改为自己任务类别数,训练时按照yolo5s的格式训练,其中的nc不包含“'背景”'这一类别。

        (5)训练、验证及过程分析

                        下载模型yolov5s到项目根目录下,训练时如果模型参数没有赋予路径名,系统会自动指定从根目录找。具体参数说明请看3.yolov5项目阅读理解(GitHub)Training(训练): 。命令代码见./命令.txt。        

                        执行下面命令

 

 

 

         根据提示,我设置了1000轮,每轮5张图片,当第342轮时,系统判定模型收敛了,241轮是最好的模型,执行总共0.185小时结束,系统将最好的模型和最后一个模型一并保存到./runs/train/exp16/weights中。

        "Fusing layers..." 表示正在将模型中的某些层进行融合(fuse)。在深度学习中,为了提高计算效率和减少内存使用,可以通过融合一些连续的卷积、批归一化(batch normalization)和激活函数(activation function)等层来优化模型结构。例如,在 YOLOv5 模型中,通常会使用 Conv-BN-LeakyReLU 这种三层结构,并将它们合并成一个单独的层。这样可以减少内存访问、加速计算和降低功耗。在实际运行中,融合层需要根据具体的硬件平台和模型结构进行选择和优化。

 

训练过程中如果出现这个错误表明Batch_size太大,应该减小Batch_size

        训练完成后,在./runs/train文件下的最后一个文件夹生成训练过程中的参数变化情况如图

                 以下是每个文件的讲解:

                confusion_matrix.png是一个混淆矩阵的可视化图像,通常用于评估分类模型的性能。该图像将实际标签和预测标签进行了比较,并将它们分成四个不同的类别:真正(TP)、假正(FP)、真负(TN)和假负(FN)。在混淆矩阵中,每个单元格的值表示该类别被预测为另一个类别的次数。例如,“True Positives”(真正例)指分类器正确地将正例样本分类为正例的次数,而“False Positives”(假正例)则指分类器错误地将负例样本分类为正例的次数。通过观察confusion_matrix.png,我们可以计算出多个常用的分类指标,例如准确率(accuracy)、精确率(precision)、召回率(recall)和 F1 分数等,以进一步评估模型的性能。这些指标都基于混淆矩阵的不同方面进行计算,例如准确率计算的是分类器正确分类的总数与总样本数之间的比率,而精确率计算的是真正例的数量与所有预测为正例的样本数量之间的比率。因此,理解confusion_matrix.png可以帮助我们更好地了解模型的性能,找出其对不同类别的分类表现,以帮助我们对模型进行优化和改进。F1_curve.png:这是训练期间生成的F1分数曲线图,可以用于衡量模型的分类准确度。该图像将F1分数与训练期间的迭代次数进行比较,因此我们可以了解模型在不同迭代次数下的表现,并确定何时达到最佳性能,曲线分析见5.先行知识储备(14)F1曲线。hyp.yaml:这是训练时使用的超参数文件,包含训练时使用的超参数信息,例如批量大小、学习率、Momentum等。通过检查超参数,我们可以进一步优化模型的性能,以适应特定的任务需求。opt.yaml:这是模型的配置文件,包含模型结构、优化器、学习率等各种参数信息。在该文件中,我们可以找到模型的架构和训练期间使用的优化算法,进一步推断模型的性能和表现。p_curve.png:这是精确率-召回率曲线图,可以帮助我们更好地理解模型的分类表现。该图像显示了不同阈值下的精确率和召回率之间的权衡关系,以便我们找到最佳的阈值。RP_curve.png:这是精确率-召回率曲线图的延伸,它可以帮助我们理解模型在不同类别上的表现。该图像显示了不同类别的精确度和召回率之间的权衡关系,因此我们可以确定模型在特定类别上的表现如何。R_curve.png:这是模型召回率曲线图,可以帮助我们更好地了解模型在不同召回率下的性能表现。通过观察R_curve.png,我们可以找到最佳阈值以实现最大化召回率。results.csv:这是训练和验证期间生成的结果文件,包含基于混淆矩阵计算出的多个分类指标,例如准确率、精度、召回率和F1分数等。通过检查结果文件,我们可以进一步优化模型的性能。events.out.tfevents.1681544723.jyxPC.17652.0是一个TensorFlow的事件日志文件,通常以“events.out.tfevents”开头,后面跟着一些数字和主机名、进程ID等信息。在这个例子中,“1681544723”是时间戳,“jyxPC”是主机名,“17652”是进程ID,“0”表示它是第一个事件文件。TensorFlow使用事件日志来记录训练和评估过程中的数据,例如损失函数、准确率、梯度等。这些数据可以用于可视化和分析模型,比如在TensorBoard上查看训练曲线或比较不同实验的结果等。事件日志文件通常由TensorFlow的Summary API写入,可以使用TensorBoard或其他工具读取和解析。每个事件记录包含一个时间戳、名称(例如“loss”或“accuracy”)和一个或多个值。事件记录可以按照时间、名称或其他属性进行过滤和排序。

        (6)测试、评估

                命令代码见./命令.txt。

                具体参数说明请看3.yolov5项目阅读理解(GitHub)Inference(推理): 

                每个脚本的功能见: 3.yolov5项目阅读理解(GitHub)  Tutorials(教程):     TFLite, ONNX, CoreML, TensorRT Export🚀

python benchmarks.py --weights yolov5s.pt --imgsz 640 --device 0
python val.py --weights yolov5s.onnx --dnn  # validate
python export.py --weights yolov5s.pt --include torchscript onnx

        (7)部署

                       

​ 

​ 

 

                编写脚本streamlit.py。将测试命令编写到streamlit。py中。通过终端执行命令渲染脚本。 将功能部署到网站上。用户可选择“图片检测”,“视频检测”,“实时检测”三个功能

                如何部署到云端请参考:

如何把 Streamlit 部署到服务器? | 21云盒子_哔哩哔哩_bilibili

5.本人说明

                a.我们修改视频检测后存储的格式,由原来的mp4v改成了avc1。原因是streamlit中的video适合播放h264编码的mp4,详细的操作可以参考

https://xugaoxiang.com/2021/08/20/opencv-h264-videowrite/

                b.当detect.py的source参数为0时,执行实时检测时,按键盘Q键可取消实时检测

                c.网页端不支持修改参数预测,如果想更改推理参数,请到detect.py脚本中,自行修改default参数内容。

6.永久、免费源码地址

https://download.csdn.net/download/weixin_46412999/87735642

7.如何修改成自己的项目

        (1)数据集文件夹

                首先.\data目录下的train,valid,videos三个文件夹分别存放训练集,验证集,测试集图片。进入文件夹,images放原始未标注图片,labels放labelimg标注完的txt文本文件。注意:labels文件夹名称不能改

        (2)两个yaml文件

                在路径./data下,

                data.yaml,nc修改成自己的的类别个数(不包含背景),我是mask和no_mask两个类别所以nc=2。names【“mask”,“no_mask”】修改成自己打标签时的类别名,注意类别顺序不能调换。

                custom_yolov5s.yaml,nc修改成自己的类别个数我是mask和no_mask两个类别所以nc=2。

        (3)爬虫脚本

                根据视频内容修改成自己的参数:

Python爬取百度图片教程_哔哩哔哩_bilibili

        (4)批量图片重命名脚本

                rename.py脚本。path修改成你自己的图片集路径,即可将该路径下的图片统一按顺序命名。

        (5)streamlit脚本

                修改自己的网页内容参考见:

Streamlit部署YOLOv5目标检测_迷途小书童的Note的博客-CSDN博客

        (6)命令

                根路径下有一个“命令.txt”文件,可以根据3.yolov5项目阅读理解(GitHub)中对各脚本的参数说明,自行更改参数,训练自己的模型和任务

8.使用过程中注意事项

9.个人心得体会

  • 11
    点赞
  • 57
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值