目录
yolov8导航
YOLOv8(附带各种任务详细说明链接)
搭建环境说明
数据集准备
项目目录结构展示
不同版本性能对比
模型参数和性能解释
模型对比
训练
执行训练示意代码
训练参数说明
训练正常执行示意
训练结果文件解释
weights
args.yaml
confusion_matrix.png(未标准化的混淆矩阵)
confusion_matrix_normalized.png(标准化的混淆矩阵)
results.png(训练和验证损失及准确率图)
results.csv
验证
验证示意代码
验证参数说明
预测
预测代码示意
预测参数说明
总结
如果大家想要了解关于yolov8的其他任务和相关内容可以点击这个链接,我这边整理了许多其他任务的说明博文,后续也会持续更新,包括yolov8模型优化、sam等等的相关内容。
如果不知道如何搭建的小伙伴可以参考这个博文:
超级详细的!多种方式YOLOV8安装及测试
操作系统:win10 x64
编程语言:python3.9
开发环境:Anaconda
示例项目下载地址:
YOLOv8 项目与 MNIST160 手写数字图片数据集集成
MNIST160 手写数字图片数据集 - 用于 YOLOv8 图像分类
YOLOv8系列模型在计算机视觉领域已成为一个热门话题。它们以其高效的图像处理能力和准确性而闻名。但是,根据不同的应用场景,选择合适的YOLOv8变体至关重要。下面的表格是针对不同版本的yolo模型的测试结果。
入门级 - YOLOv8n-cls: 对于那些资源有限但需要快速处理的场景,YOLOv8n-cls是一个理想的选择。它的轻量级设计使得在普通CPU上也能达到可接受的速度和准确性。
平衡选择 - YOLOv8s-cls与YOLOv8m-cls: 这两个模型在速度和准确率之间取得了良好的平衡,非常适合中等计算能力的设备。YOLOv8s-cls在保持较快处理速度的同时,提供了较高的准确率。而YOLOv8m-cls则在这两方面都有进一步的提升。
高端选择 - YOLOv8l-cls与YOLOv8x-cls: 当性能是首要考虑因素时,YOLOv8l-cls和YOLOv8x-cls是最佳选择。它们需要较高的计算资源,但提供了业界领先的图像处理准确性。特别是YOLOv8x-cls,它以最高的准确率成为了性能的标杆,适合那些需要极致性能的应用。
Model | size (pixels) |
acc top1 |
acc top5 |
Speed CPU ONNX (ms) |
Speed A100 TensorRT (ms) |
params (M) |
FLOPs (B) at 640 |
---|---|---|---|---|---|---|---|
YOLOv8n-cls | 224 | 66.6 | 87.0 | 12.9 | 0.31 | 2.7 | 4.3 |
YOLOv8s-cls | 224 | 72.3 | 91.1 | 23.4 | 0.35 | 6.4 | 13.5 |
YOLOv8m-cls | 224 | 76.4 | 93.2 | 85.4 | 0.62 | 17.0 | 42.7 |
YOLOv8l-cls | 224 | 78.0 | 94.1 | 163.0 | 0.87 | 37.5 | 99.7 |
YOLOv8x-cls | 224 | 78.4 | 94.3 | 232.0 | 1.01 | 57.4 | 154.8 |
模型大小(size): 指的是模型输入图像的分辨率。在这个表格中,所有模型的输入分辨率都是224x224像素。
准确率(accuracy):
速度: 测试模型处理单张图像所需的时间(毫秒)。
参数数量(params (M)): 模型中总参数的数量,单位是百万(M)。
浮点运算次数(FLOPs (B) at 640): 执行一次前向传递所需的浮点运算次数,单位是十亿(B),这里是基于640像素的输入计算的。
使用py文件在pycharm中运行:
from ultralytics import YOLO
# 加载模型
model = YOLO('yolov8n-cls.yaml').load('yolov8n-cls.pt') # 从YAML构建并转移权重
if __name__ == '__main__':
# 训练模型
results = model.train(data='./mnist160', epochs=10, imgsz=64)
命令行方式运行:
# 从YAML构建新模型并从头开始训练
yolo classify train data=./mnist160 model=yolov8n-cls.yaml epochs=10 imgsz=64
# 从预训练的*.pt模型开始训练
yolo classify train data=./mnist160 model=yolov8n-cls.pt epochs=10 imgsz=64
# 从YAML构建新模型,转移预训练权重并开始训练
yolo classify train data=./mnist160 model=yolov8n-cls.yaml pretrained=yolov8n-cls.pt epochs=10 imgsz=64
命令行运行和编辑器中运行关系如下图:
这三行代码都可以正常的运行。不同的是有一些参数的区别。
参数 (Key) | 默认值 (Value) | 描述 (Description) |
---|---|---|
model | 如果预训练就指向预训练模型 | 模型文件路径,例如 yolov8n.pt, yolov8n.yaml |
data | 执行数据集地址 | 数据文件路径,例如 coco128.yaml |
epochs | 100 | 训练的周期数 |
time | None | 训练的小时数,如果提供了此参数将覆盖周期数 |
patience | 50 | 早停训练等待的最大无改善周期数 |
batch | 16 | 每批次的图像数量(-1 表示自动批次) |
imgsz | 640 | 输入图像的尺寸 |
save | True | 是否保存训练检查点和预测结果 |
save_period | -1 | 每 x 个周期保存一次检查点(如果小于 1 则禁用) |
cache | False | 是否使用数据加载的缓存,可选 True/ram, disk 或 False |
device | None | 运行设备,例如 cuda device=0 或 device=0,1,2,3 或 device=cpu |
workers | 8 | 数据加载的工作线程数(如果使用DDP则每个RANK) |
project | None | 项目名称 |
name | None | 实验名称 |
exist_ok | False | 是否覆盖已存在的实验 |
pretrained | True | 是否使用预训练模型(布尔值)或从其中加载权重的模型(字符串) |
optimizer | 'auto' | 使用的优化器,选项包括 [SGD, Adam, Adamax, AdamW, NAdam, RAdam, RMSProp, auto] |
verbose | False | 是否打印详细输出 |
seed | 0 | 随机种子,用于可重复性 |
deterministic | True | 是否启用确定性模式 |
single_cls | False | 将多类别数据作为单一类别训练 |
rect | False | 矩形训练,每批次根据最小填充整理 |
cos_lr | False | 使用余弦学习率调度器 |
close_mosaic | 10 | 在最后几个周期禁用马赛克增强(0 为禁用) |
resume | False | 从最后一个检查点恢复训练 |
amp | True | 自动混合精度(AMP)训练 |
fraction | 1.0 | 训练集中用于训练的数据集比例(默认为 1.0,即全部图像) |
profile | False | 在训练期间用于日志记录器的 ONNX 和 TensorRT 速度分析 |
freeze | None | 在训练期间冻结前 n 层,或冻结层索引列表 |
lr0 | 0.01 | 初始学习率(例如 SGD=1E-2, Adam=1E-3) |
lrf | 0.01 | 最终学习率(初始学习率 * 最终学习率) |
momentum | 0.937 | SGD 动量/Adam beta1 |
weight_decay | 0.0005 | 优化器权重衰减 5e-4 |
warmup_epochs | 3.0 | 热身周期数(小数也可) |
warmup_momentum | 0.8 | 热身期间的初始动量 |
warmup_bias_lr | 0.1 | 热身期间的初始偏置学习率 |
box | 7.5 | 边界框损失增益 |
cls | 0.5 | 类别损失增益(根据像素缩放) |
dfl | 1.5 | DFL 损失增益 |
pose | 12.0 | 姿态损失增益(仅姿态) |
kobj | 2.0 | 关键点对象损失增益(仅姿态) |
label_smoothing | 0.0 | 标签平滑(小数表示比例) |
nbs | 64 | 标称批次大小 |
overlap_mask | True | 训练期间遮罩是否重叠(仅限分割训练) |
mask_ratio | 4 | 遮罩下采样比率(仅限分割训练) |
dropout | 0.0 | 是否使用 dropout 正则化(仅限分类训练) |
val | True | 训练期间是否进行验证/测试 |
plots | False | 训练/验证期间是否保存图表和图像 |
以上表格中列出了 YOLOv8 训练的参数、默认值和中文描述。这些参数允许用户自定义训练过程,以适应不同的数据集和硬件环境。通过调整这些参数,用户可以控制训练的持续时间、性能和最终的模型质量。
当你可以看到这一个个的迭代记录的时候,就说明程序已经可以正常运行了。看到Results saved to **** 说明模型已经训练完了,并且把训练的结果保存了起来。
模型训练完成后会输出以下这些文件:
这里面保存的是模型pt文件,best表示损失值最小的模型,last是模型训练最后保存的模型。
这里面存放的是训练相关的参数,上面的代码咱们训练的时候基本都是使用的是默认参数,因此代码中并没有直接进行展示。
这张图显示了一个未标准化的混淆矩阵,用于评估 YOLOv8 模型在手写数字识别任务上的性能。矩阵的行表示预测的标签,而列则代表真实的标签。深色格子表示较高的数值,即模型对该类别的预测数量。对角线上的数字理想情况下应该是最高的,因为它们表示正确预测的数量。例如,数字 "0" 被正确识别了 5 次,而数字 "6" 和 "9" 分别有 4 次和 6 次正确识别。非对角线上的数字表示模型的预测错误,如数字 "4" 被误认为是 "9" 2 次。
与第一个文件类似,这张图也是混淆矩阵,但数据经过了标准化处理,代表预测准确率的比例,而不是绝对数量。深色表示更高的准确率。在这张图中,我们可以看到模型对某些数字的识别准确率较高,如 "0"、"4" 和 "9" 的准确率分别为 0.62、0.62 和 0.75。标准化混淆矩阵有助于我们了解模型在各个类别上的性能,而不受类别样本数量不均的影响。
此图展示了 YOLOv8 训练过程中的损失和准确率变化。左上角的图显示了训练损失随着时间的下降,而右上角的图显示了验证损失的下降,这表明模型正在学习并在测试数据上泛化。左下角的图表显示了 top-1 准确率(模型预测的最高概率类别是正确的类别的频率),右下角显示了 top-5 准确率(正确类别在模型预测的前五个最高概率类别中的频率)。这两个准确率随着时间的增加而提高,显示了模型性能的提升。
这个文件是一个 CSV 格式的数据表,包含了训练过程中每个周期(epoch)的详细性能指标,如损失、准确率等。每行代表一个训练周期的结果,列包括周期编号、训练损失、验证损失、top-1 准确率和 top-5 准确率等。这些数据可以用来进一步分析模型的训练过程和性能趋势。
这四个文件一起为 YOLOv8 模型在手写数字识别任务上的性能提供了全面的视角。通过对这些数据的分析,可以深入了解模型在各个数字类别上的准确性,以及训练过程中的优化程度。
进行验证的时候需要再数据集中额外保存一个val数据集“
”
val很简单,实际上就是当模型训练完了,在你所具有的验证集上进行预测,用来给工程人员观察的评估结果。
from ultralytics import YOLO
# 加载模型
model = YOLO('yolov8n-cls.yaml').load('yolov8n-cls.pt') # 从YAML构建并转移权重
if __name__ == '__main__':
# 训练模型
results = model.train(data='./mnist160', epochs=5, imgsz=64)
# 加上这一行代码即可进行验证了
model.val()
验证所输出的结果是这样的:
分类任务中验证结果相对简单,实际上就是两个混淆矩阵,具体如何解读可以看上面的介绍。
参数 (Key) | 默认值 (Value) | 描述 (Description) |
---|---|---|
data | None | 数据文件路径,例如 coco128.yaml |
imgsz | 640 | 输入图像的尺寸(整数) |
batch | 16 | 每批次的图像数量(-1 为 AutoBatch) |
save_json | False | 将结果保存为 JSON 文件 |
save_hybrid | False | 保存混合标签版本(标签 + 额外预测) |
conf | 0.001 | 目标检测的置信度阈值 |
iou | 0.6 | 非极大值抑制(NMS)的交并比(IoU)阈值 |
max_det | 300 | 每张图像的最大检测数量 |
half | True | 使用半精度(FP16)运算 |
device | None | 运行设备,例如 cuda device=0/1/2/3 或 device=cpu |
dnn | False | 使用 OpenCV DNN 进行 ONNX 推理 |
plots | False | 在训练/验证过程中保存图表和图像 |
rect | False | 矩形验证,每批次整理以最小填充 |
split | val | 用于验证的数据集分割,例如 'val', 'test' 或 'train' |
from ultralytics import YOLO
# 加载训练好的小莫
model = YOLO('yolov8n-cls.pt')
# 想预测哪个模型就用哪个
results = model(['./im1.jpg', './im2.jpg'], save=True)
print(results[0].names)
# 对结果进行处理
for result in results:
probs = result.probs
print(probs)
对模型调用预测的代码,我们可以通过循环的方式对两个图片预处理结果进行分别的处理。这里我们直接获取probs,这里面包含每个类别对应的标签,names可以看到对应标签对应的类别。
# 这段代码就是 print(results[0].names) 所输出的结果,后续所输出的标签值可以在这个字典中获取具体类别信息
{0: 'tench', 1: 'goldfish', 2: 'great_white_shark', 3: 'tiger_shark', 4: 'hammerhead', 5: 'electric_ray', 6: 'stingray', 7: 'cock', 8: 'hen', 9: 'ostrich', 10: 'brambling', 11: 'goldfinch', 12: 'house_finch', 13: 'junco', 14: 'indigo_bunting', 15: 'robin', ...... 997: 'bolete', 998: 'ear', 999: 'toilet_tissue'}
# 这个是probs的结果,分别有每个类别的概率、shape大小、最大概率标签值、前5概率值、前5标签值
## 这个是每个类别的概率值
data: tensor([2.7705e-09, 9.8885e-08, 2.1485e-06, 1.6867e-08, 3.7770e-07, 3.9904e-08, 7.9187e-08, 7.5118e-07, 4.9935e-08, 8.2831e-08, 8.7084e-08, 3.6748e-07, 4.5848e-08, 1.1680e-08, 5.4355e-07, 3.8587e-08, 1.9416e-07, 4.7345e-08, 4.2129e-08, 1.9800e-07, 7.3290e-09, 2.6064e-09, 2.8881e-08, 4.8047e-08, 2.4624e-08, 3.5464e-08,......
1.1429e-08, 1.0660e-08, 2.2343e-09, 1.5287e-08, 1.6387e-08, 9.6785e-10, 4.7864e-10, 8.0425e-09, 1.1199e-07, 3.7916e-09, 2.3834e-06, 4.8378e-07], device='cuda:0')
orig_shape: None
## tensor长度大小
shape: torch.Size([1000])
## 最大概率标签结果 这里面的779对应的就是names中key为779的结果
top1: 779
## 最大标签的概率
top1conf: tensor(0.2844, device='cuda:0')
## 前5的 你懂得
top5: [779, 829, 561, 654, 874]
top5conf: tensor([0.2844, 0.2269, 0.1197, 0.0534, 0.0389], device='cuda:0')
同时咱们得代码中的 save=True 这个参数是可以不填的,默认为False就是不用yolo直接输出效果图,为True时候他结果默认会输出到runs/predict文件夹中,输出的结果如下:
左上角会有前5个对应概率的结果 。
在执行预测的时候,model() 等同与 model.predict(),里面有如下参数:
来源(Source) | 参数(Argument) | 类型(Type) | 备注(Notes) |
---|---|---|---|
image | 'image.jpg' | str or Path | 单个图像文件。 |
URL | 'https://ultralytics.com/images/bus.jpg' | str | 图像的URL地址。 |
screenshot | 'screen' | str | 捕获屏幕截图。 |
PIL | Image.open('im.jpg') | PIL.Image | HWC格式,RGB通道。 |
OpenCV | cv2.imread('im.jpg') | np.ndarray | HWC格式,BGR通道,uint8 (0-255)。 |
numpy | np.zeros((640,1280,3)) | np.ndarray | HWC格式,BGR通道,uint8 (0-255)。 |
torch | torch.zeros(16,3,320,640) | torch.Tensor | BCHW格式,RGB通道,float32 (0.0-1.0)。 |
CSV | 'sources.csv' | str or Path | CSV文件,包含图像、视频或目录路径。 |
video ✅ | 'video.mp4' | str or Path | MP4、AVI等格式的视频文件。 |
directory ✅ | 'path/' | str or Path | 包含图像或视频的目录路径。 |
glob ✅ | 'path/*.jpg' | str | 匹配多个文件的Glob模式。使用 * 字符作为通配符。 |
YouTube ✅ | 'https://youtu.be/LNwODJXcvt4' | str | YouTube视频的URL地址。 |
stream ✅ | 'rtsp://example.com/media.mp4' | str | 用于RTSP、RTMP、TCP或IP地址等流媒体协议的URL。 |
multi-stream ✅ | 'list.streams' | str or Path | *.streams 文本文件,每行一个流媒体URL,例如,8个流将以批量大小8运行。 |
总结来说,该内容提供了一个完整的YOLOv8项目运行指南,包括环境搭建、数据集准备、训练、验证和预测过程的详细说明,以及各个阶段所需参数的详细列表和解释。这为需要进行YOLOv8训练图片分类任务和部署的开发人员提供了一个相对较为详细的参考。希望大家能够喜欢,如果感觉哪里写的不清楚,可以留言,我这边会积极补充。如果有哪里写的不够清晰,小伙伴本可以给评论或者留言,我这边会尽快的优化博文内容,另外如有需要,我这边可支持技术答疑与支持。