YOLO V5模型 0 基础使用教程🚀
一. 官方工程文件解读🚀
以下是
YOLO v5
官方工程文件的一级目录结构:
.
├── benchmarks.py(py文件,Python脚本,用于评估YOLOv5模型的性能,比如检测速度和精度)
├── classify(文件夹,可能包含用于图像分类的代码)
├── CONTRIBUTING.md(markdown文件,贡献指南,说明如何为项目贡献代码或文档)
├──data
(文件夹,通常包含用于训练和测试的数据集以
模型训练对应的配置文件
,包括图像文件和标注信息)
├──detect.py
(py文件,用于
执行目标检测任务
,可以加载预训练模型并进行
推理
)
├──export.py
(py文件, 用于将训练好的模型转换为其他格式,例如ONNX,以便于在不同平台上部署)
├── hubconf.py(py文件,可能与PyTorch Hub集成有关,用于发布和分享模型)
├── LICENSE(项目许可证文件,说明项目使用和分发的法律条款)
├──models
(文件夹,包含模型定义的代码以及官方提供的
权重文件
,比如YOLOv5的网络结构)
├── README.md(markdown文件,项目的自述文件,通常包含项目简介、安装指南和使用说明。)
├──requirements.txt
(txt文件,列出项目所需的依赖库,通常用 pip指令安装)
├── segment(文件夹,包含用于图像分割的代码和配置文件)
├── setup.cfg(cfg配置文件,用于设置Python包的安装选项)
├──train.py
(py文件,用于训练YOLOv5模型,可能包含数据加载、模型定义、训练循环和验证步骤。)
├── tutorial.ipynb(Jupyter Notebook教程,用于指导用户如何使用YOLOv5)
├── utils(文件夹,包含一些辅助函数或工具,比如数据增强、日志记录等。)
└── val.py(py文件,用于模型的验证过程,评估训练过程中模型的性能)
这些文件是官方提供给我们的基础文件,通过这些文件我们就可以训练模型了。虽然凭借以上文件就可以训练模型了,但是训练出来的模型不是我们想要的。
要想训练出我们自己想要的模型离不开以下三样东西:
- 自己的数据集(训练集、测试集)
- 配置文件(与数据集信息相匹配的配置文件)
- 官方提供的工程文件(官方预训练的权重文件)
二. 用自己的数据集训练模型🚀
1. 创建自己的数据集yaml配置文件
在
data
目录下,新建
.yaml
文件,名字自己取,我这里是
traffic_data.yaml
2. 对数据集进行划分
结构如下所示,其
dataset
放在
yolov5-master
文件夹第一层就好,或者随便放都行,推荐放
yolov5-master
文件夹第一层。训练集和验证集自己划分比例,一般都是30%作为验证集合,需要注意的是,文件夹命名按着下面的一样。
dataset/
├──
train/
│ ├──
images/
│ │ ├── image1.jpg
│ │ ├── image2.jpg
│ │ └── …
│ ├──labels/
│ │ ├── image1.txt
│ │ ├── image2.txt
│ │ └── …
│ └── …
└──text
├──
images/
│ ├── image101.jpg
│ ├── image102.jpg
│ └── …
├──labels/
│ ├── image101.txt
│ ├── image102.txt
│ └── …
└── …
3. 填写创建的yaml配置文件里的信息
将我们数据信息写入yaml文件,path写dataset的路径,train直接按着下面就行
path: ./dataset
train: train/images/
val: text/images/Classes
names:
0: Speed limit (5km)
1: Speed limit (15km)
2: Speed limit (20km)
3: Speed limit (30km)
4: Speed limit (40km)
5: Speed limit (50km)
4. 修改代码
train.py
中找到如下代码,按着图中的要求修改代码。
修改完之后保存即可。
5. 训练模型
python train.py --img 640--batch 32--epoch 101--data data/traffic_data.yaml --cfg models/yolov5s.yaml --weights weights/yolov5s.pt --device 0
python train.py
: 执行的Python脚本的名称。train.py
是用于启动训练过程的脚本。--img 640
: 指定输入图像的尺寸,这里是640 * 640像素。--batch 32
: 设置一个批次(batch)的大小,即每次训练迭代中同时处理的图像数量,这里是32张图像。--epoch 101
: 指定训练过程中要进行的迭代次数,称为"epoch"。每个epoch代表整个数据集被完整地遍历一次。这里是101个epoch。--data data/traffic_data.yaml
: 指定数据配置文件的路径,data/traffic_data.yaml
文件含训练数据的路径、类别信息等。--cfg models/yolov5s.yaml
: 指定模型配置文件的路径,models/yolov5s.yaml
这个文件定义了模型的架构,例如YOLOv5s模型。--weights weights/yolov5s.pt
: 指定预训练模型权重的路径,weights/yolov5s.pt
用于在训练开始时加载预训练的权重,以便更快地收敛或提高模型的性能。--device 0
: 指定要使用的计算设备,这里是0。在多GPU环境中,可以通过指定不同的数字来选择不同的GPU设备。
当我们看到如下信息时,就说明模型已经训练完成:
通过以上信息,我们可以大致判断出我们模型的训练效果。接下来,我们看看每一行信息的具体含义。
101 epochs completed in1.752 hours.# 训练周期和时间:模型训练完成了101个epoch,在1.752小时内完成。
Optimizer stripped from runs/train/exp6/weights/last.pt,14.8MB # 代表最后一个epoch训练后的权重文件
Optimizer stripped from runs/train/exp6/weights/best.pt,14.8MB # 代表验证过程中表现最好的权重文件
Validating runs/train/exp6/weights/best.pt...# 正在验证best.pt权重文件的性能。
Fusing layers...
YOLOv5s summary:157 layers,7177339 parameters,0 gradients,16.3 GFLOPs
# 模型有157层。# 总共有7,177,339个参数。# 在验证过程中没有梯度计算(是因为在验证阶段不进行反向传播)。# 模型的浮点运算次数为16.3 GFLOPs(每秒浮点运算次数的十亿次)。
同时在
runs/train/exp6/
也会生成本次模型训练结果的所有文件,我们可以在这个文件夹下看到模型训练的结果
上面显示可以让我们对模型有一个大概的判断,但是在实际中我们更关注下面这些信息:
class
:类别。这是指在目标检测任务中需要识别的对象类别
Images
:图像数量。这表示用于评估模型性能的图像总数(也就是
测试集的图片数量
)
Instances
:实例数量。这表示所有测试集图像中,特定类别的对象出现的次数
P (Precision)
:精度。这是针对每个类别计算的,表示模型正确识别的正例占模型识别为正例的总数量的比例。(
范围 0-1,数值越大越好
)
R (Recall)
:召回率。也称为真正例率或灵敏度,表示模型正确识别的正例占实际正例总数的比例。(
范围 0-1,数值越大越好
)
mAP50
:平均精度在50%交并比下。(
数值越大越好
)
- 想象一下,你有一个篮子,里面装满了各种水果(代表不同的目标类别)。现在,你的朋友要帮你挑出苹果(假设苹果是一个类别)。但是,他只能通过篮子上的一个小洞来挑选,他看不到里面,只能凭感觉挑。如果他挑出来的确实是苹果,我们就说这是一个"真正例"。mAP50就是计算所有类别(所有水果)中,朋友挑对的次数占他尝试挑的次数的平均值,但只考虑那些他挑出来的水果和篮子里的苹果至少有一半是一样的情况。
mAP50-95
:平均精度在50%到95%交并比范围内。(
数值越大越好
)
- 这个指标更严格一些。还是上面那个挑水果的例子,但这次我们不仅看朋友挑出来的是不是苹果,还要看他挑出来的苹果和篮子里的苹果有多相似。如果相似度在50%到95%之间,我们才认为这次挑选是有效的。mAP50-95就是计算所有类别中,朋友在这种更严格的条件下挑对的次数占他尝试挑的次数的平均值。
Epoch
:训练周期。每个周期中模型都会遍历一次完整的数据集。
一般设置在100左右,设置数值太小,模型可能捕获的特征不够,训练的效果不好;设置数值太大,模型容易过拟合,同样也会造成训练效果不好。
GPU_mem
:GPU内存使用量。训练过程中使用的GPU内存大小
box_loss
:边界框损失。这是评估模型预测的边界框与真实边界框之间差异的损失值,数值越小表示预测越准确。
obj_loss
:目标损失。这是评估模型是否正确识别出图像中存在目标的损失值。
cls_loss
:分类损失。这是评估模型对目标类别分类准确性的损失值。
Instances
:实例数量。这表示在当前的训练批次(batch)中有多少个目标实例。
Size
:图像尺寸。这表示训练使用的图像分辨率是640 * 640像素。
需要注意的是,我们在训练模型的时候,
--img
应该设置成跟训练集测试集图片大小尺寸一样,这样训练出来的模型效果才比较好。
三. 利用训练好的模型,借助labelImg自动标注🚀
工程目录下打开文件
detect.py
文件,找到类
sar_opt()
,如下图:
差不多在200多行,会有一个**‘–save-txt’, action=‘store_false’, help=‘save results to *.txt’)**,这里需要改成
store_false
,原本是
store_true
。这样在推理的时候就可以生成txt文件。
四. 模型转换🚀
模型文件转换指令:
python export.py --weights runs/train/exp4/weights/best.pt --opset 11--include onnx --batch 1--img 720
export.py
: 这是执行转换操作的Python脚本文件。--weights
: 此参数后面跟的是模型权重文件的路径。在这个例子中,runs/train/exp4/weights/best.pt
是模型训练过程中保存的最佳权重文件的路径。--opset
: 此参数后面跟的是ONNX操作集的版本。操作集版本决定了ONNX模型的兼容性和特性。在这个例子中,版本被设置为11。--include
: 此参数用于指定导出的文件格式。onnx
表示生成ONNX格式的文件。--batch
: 此参数定义了导出模型的batch大小。在这个例子中,batch大小被设置为1,意味着模型将被导出为处理单个图像的版本。 重文件的路径。--opset
: 此参数后面跟的是ONNX操作集的版本。操作集版本决定了ONNX模型的兼容性和特性。在这个例子中,版本被设置为11。--include
: 此参数用于指定导出的文件格式。onnx
表示生成ONNX格式的文件。--batch
: 此参数定义了导出模型的batch大小。在这个例子中,batch大小被设置为1,意味着模型将被导出为处理单个图像的版本。--img
: 此参数用于指定模型输入图像的尺寸。
版权归原作者 自然语言编程 所有, 如有侵权,请联系我们删除。