目标检测:Yolov5训练自己的数据集(完整版)
利用Yolov5训练自己的数据集,我们主要做以下工作:
一、源码克隆和环境依赖
(一)源码克隆
YOLOv5的代码是open-source的,并因此我们可以从GitHub上下载其源码。我们利用yolov5.5分支作为讲解的基础。这里无需进一步展开详细说明,在此之前我们将代码下载下来即可认为整个项目已经准备好并进入下一步骤。随后我们为运行环境做准备。
(二)环境依赖
本教程使用环境:
- torch: 2.0.0
- python: 3.8
- yolov5 v6.0
为了使YOLOv5代码能够顺利运行,必须按照源码中的需求清单安装相关库文件。具体需求列表已包含在源码中,请访问requirements.txt一并查看。其中包含了所有必要的依赖项及其相应版本信息,这些信息将帮助您顺利完成配置设置。在PyCharm的命令行界面中输入以下指令,即可启动相应的安装流程。
pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple
目前来说,相关环境及所需依赖项已经配置完成。由于本教程主要讲解如何训练个人的数据集以避免内容过于冗长的情况,在此无需过多深入讨论。
二、模型训练
在安装了必要的运行环境、代码库以及训练数据集之后,在完成这些步骤之后,请更换或替换自己的训练数据集,并开始模型的训练过程。
(一) 修改配置文件
预训练模型和数据集都已经准备好并收集完毕,因此无需其他准备即可启动yolov5目标检测模型的训练过程。构建和配置目标检测模型时,请确保修改以下两个配置文件:首先是位于data目录中的对应配置.yaml文件;其次是位于model目录中的对应配置.yaml文件。
在指定的数据目录中定位到voc.yaml配置文件的位置,并对其进行编辑以补充必要的参数设置。为了防止混淆和错误,请确保所有引用路径均采用完整的绝对路径形式。在训练阶段(model training phase)内生成用于模型训练阶段(model training stage)的数据集;在官方提供的验证数据集(official validation dataset)内生成用于模型验证阶段(model validation stage)的数据集;nc代表各类别标签的数量;name指的是各个类别标签名称,在此问题中通常用数字编号来标识类别索引(indices),起始编号为零

(二)修改train.py文件
weights:用于指定YOLOv5模型使用的架构参数的权重文件路径。
在YOLOv5框架中支持的小型、轻量级模型包括S、L、N和X系列中的一个即可。
系统会自动下载所需模型文件。
建议检查网络连接或尝试从镜像网站获取以加快下载速度。
cfg:定义YOLOv5模型具体架构设置的配置文件。
遇到配置文件相关错误时,请检查所使用的模型架构是否正确。
在models目录下查找与当前使用场景匹配的具体配置文件。
根据实际需求调整相应的nc值。
data:存储用于训练和测试的数据文件。这是在上文中指定配置参数的yaml文件。
epochs:指的就是整个数据集会被迭代多少次进行训练。如果显存不足,则建议减少迭代次数。
workers:处理并行操作所需的线程数量,默认设置为8个线程。

(三)修改detect.py(推理)文件
当数据完成训练后,在实验目录中会创建一个专门用于存储模型运行结果的run子目录;随后位于/run/train/exp/weights路径中的有两个重量模型等待处理:最终的那个模型参数以及另一个则是最优参数集合。这些模型会被用来进行推理与验证工作;其中主要关注的是那个最优参数集合,并将通过下一步的工作就是使用这个最优参数集合来进行推理验证。除此之外,在此过程中还会生成若干辅助验证图像和其他相关资料
在主目录中定位到detect.py文件的位置,并访问其内容。接着定位到程序的核心执行点——即主函数的入口处。这里包含着模型的关键配置信息。
f __name__ == '__main__':
"""
--weights:权重的路径地址
--source:测试数据,可以是图片/视频路径,也可以是'0'(电脑自带摄像头),也可以是rtsp等视频流
--output:网络预测之后的图片/视频的保存路径
--img-size:网络输入图片大小
--conf-thres:置信度阈值
--iou-thres:做nms的iou阈值
--device:是用GPU还是CPU做推理
--view-img:是否展示预测之后的图片/视频,默认False
--save-txt:是否将预测的框坐标以txt文件形式保存,默认False
--classes:设置只保留某一部分类别,形如0或者0 2 3
--agnostic-nms:进行nms是否也去除不同类别之间的框,默认False
--augment:推理的时候进行多尺度,翻转等操作(TTA)推理
--update:如果为True,则对所有模型进行strip_optimizer操作,去除pt文件中的优化器等信息,默认为False
--project:推理的结果保存在runs/detect目录下
--name:结果保存的文件夹名称
"""
parser = argparse.ArgumentParser()
parser.add_argument('--weights', nargs='+', type=str, default='yolov5s.pt', help='model.pt path(s)')
parser.add_argument('--source', type=str, default='data/images', help='source') # file/folder, 0 for webcam
parser.add_argument('--img-size', type=int, default=640, help='inference size (pixels)')
parser.add_argument('--conf-thres', type=float, default=0.25, help='object confidence threshold')
parser.add_argument('--iou-thres', type=float, default=0.45, help='IOU threshold for NMS')
parser.add_argument('--device', default='', help='cuda device, i.e. 0 or 0,1,2,3 or cpu')
parser.add_argument('--view-img', action='store_true', help='display results')
parser.add_argument('--save-txt', action='store_true', help='save results to *.txt')
parser.add_argument('--save-conf', action='store_true', help='save confidences in --save-txt labels')
parser.add_argument('--nosave', action='store_true', help='do not save images/videos')
parser.add_argument('--classes', nargs='+', type=int, help='filter by class: --class 0, or --class 0 2 3')
parser.add_argument('--agnostic-nms', action='store_true', help='class-agnostic NMS')
parser.add_argument('--augment', action='store_true', help='augmented inference')
parser.add_argument('--update', action='store_true', help='update all models')
parser.add_argument('--project', default='runs/detect', help='save results to project/name')
parser.add_argument('--name', default='exp', help='save results to project/name')
parser.add_argument('--exist-ok', action='store_true', help='existing project/name ok, do not increment')
opt = parser.parse_args()
这里需要将经过训练优化后的最优权重被传递给推理函数用于处理。即可实现对图像视频的推理处理。
parser.add_argument('--weights', nargs='+', type=str, default='runs/train/exp/weights/best.pt', help='model.pt path(s)')
根据以下步骤操作:首先,请确保所有相关参数已正确配置,并将其配置为对应的图片路径;随后,在$detect.py文件中执行代码即可完成测试流程。
parser.add_argument('--source', type=str, default='000295.jpg', help='source')
当推理测试完成时,在run位置上将会创建一个detect子文件夹。运行后的推理结果将在exp文件夹内进行存储。如图所示。
当推理测试完成时,在run位置上将会创建一个detect子文件夹。运行后的推理结果将在exp文件夹内进行存储。如图所示。
图片的推理结果如下所示。效果还是很不错的。
至此yolov5训练自己的模型就完全搞定了。
三、训练结果讲解
模型训练结束后,在run文件夹中将生成一个命名为train的子目录。推理结果将被存放于exp文件夹中。如图所示
通过查看上述图片中的信息可以得知:
经过200次训练任务后,在过去3.739小时的时长内完成了学习过程。
该训练任务的最终成果为last.pt文件,并位于指定位置且大小为27.4MB。
本次最佳训练成果位于best.pt文件中,并且同样存储在指定位置上。
最终模型参数被成功保存至runs/train/exp14目录中。
点击该链接即可访问预览页面。

(一)深入了解文件含义:损失函数、mAP可视化结果
这个图片内有YOLOv5的损失,其中损失分为三种
YOLO V5模型采用了GIOU Loss作为Bounding box的损失函数,并基于GIoU损失函数计算得到了Box loss这一指标。Box loss的具体数值反映了Bounding box定位的准确性。此外,在目标检测任务中定义了Obj loss这一指标用于衡量推测结果的质量;同样地,在分类任务中定义了Cls loss这一指标用于评估类别预测的效果。这些评价指标分别代表不同的性能维度:val/boxloss表示在验证集上进行Bounding box定位评估的结果;val/obj loss则是针对目标检测任务在验证集上的表现进行量化;val/cls loss则对应于分类任务在验证集上的性能表现。值得注意的是,在实际训练过程中由于仅包含person这一类别数据的缘故,在所有Cls loss相关的指标上其数值均为零【因为只有person这一类别的标签存在

(二)影响mAP的因素
mAP(Mean Average Precision)被视为评估目标检测系统性能的关键指标。该指标综合考量了模型在各类别中精确度与召回率的平均表现。
该目标检测算法在准确度方面的性能表现将直接影响mAP指标的结果。该算法在识别和定位方面的表现均具有显著优势。
模型的训练数据质量:直接关系到模型的泛化能力和效能。更加多样和全面的数据通常有助于提升模型的mAP指标。
3. 超参数调优:在模型训练中对超参数进行微调(如调整学习率衰减策略、优化批量处理大小等),这不仅能够提高模型的收敛速度与训练效果,并且会对最终结果中的平均精度指标产生显著影响
4. 数据增强策略:采用合适的数据增强技术(如随机裁剪、旋转、缩放等)能够有效提升训练数据的多样性,并有助于提升模型的泛化能力以及mAP指标。
5. 先验框(Anchor Boxes)的设计:许多目标检测模型(包括YOLO与SSD)采用先验框来推断目标的位置与类别。通过调整先验框的设计与分布情况,可以有效提升模型在目标检测任务中的准确率与平均精度。
后续步骤通常是这样的:目标检测模型在完成预测环节之后会立即执行后续处理流程。其中一种常用的方法是基于置信度阈值筛选出具有显著信心度的对象信息。这种技术的作用在于去除可能重复或重叠的部分。这些流程的设计直接影响着整体系统的性能评估指标
综合考虑各要素的影响情况可知,mAP指标的表现受到了多方面因素的制约。具体而言,这些影响因素涵盖了模型架构设计, 训练集质量评估, 超参数配置选择以及数据增强技术和后处理策略的应用等多个维度
有需要的同学私信滴滴我哦,绝对物美价廉。
更多项目《》
推荐项目:
1.基于Yolo系列模型的安全帽检测
2.基于Yolov5模型的水果检测(含界面)
3.基于Yolov7模型的火焰检测(含警示提醒)
4.基于Yolov8模型的鱼种类检测
5.基于Yolo模型的鱼种类检测
6.基于目标检测模型的葡萄检查、葡萄叶病虫害检测
7.基于Yolov5模型的课堂环境检测
8.基于Yolo系列模型的肺炎检测
9.基于Yolo系列模型的草莓检测
10.基于Yolo系列模型的玉米植株病虫害检测
11.基于Yolov5+DeepSORT行人、车辆追踪检测
12.基于openpose模型的姿态识别
13.基于Yolo模型的口罩检测
14.基于Yolo模型的疲劳驾驶检测
15.基于Yolo模型的车距、车速检测
16.基于Yolo模型的船舶、交通标志、昆虫检测等
以上仅为常见项目,更多项目和数据集获得请私聊。
**





**
