当前位置:   article > 正文

使用YOLO v8训练自己的数据集(苹果新鲜度识别)_yolov8训练需要多少张图片

yolov8训练需要多少张图片

  目录

前言:    

一、YOLO v8环境搭建

二、训练数据集的准备工作

1、收集数据集

2、划分数据集

3、训练模型

3.1新建一个数据集yaml文件

4、预测模型

5、验证模型

6、训练结束

三、检测结果与思考:

1、检测结果

2. 实验结果与分析

3、知识体系:

3.1、YOLOv8 概述

3.2、 模型结构设计

3.3、模型推理过程

四、总结


前言:    

        近年来,随着全球经济的发展,水果消费市场规模不断扩大,水果种类也日益丰富。水果检测与识别技术在农业生产、仓储物流、超市零售等领域具有重要的应用价值。传统的苹果检测与识别方法主要依赖于人工识别,这种方法在一定程度上受到人力成本、识别效率和准确性等方面的限制。因此,开发一种高效、准确的自动化水果检测与识别系统具有重要的研究意义和实际价值。

        计算机视觉作为人工智能的一个重要分支,在目标检测和识别方面取得了显著的研究进展。特别是深度学习技术的发展,极大地推动了计算机视觉在水果检测与识别领域的应用。许多研究人员已经尝试利用深度学习技术进行苹果检测与识别,取得了一定的成果。
 

一、YOLO v8环境搭建

1、创建一个虚拟环境

conda create -n torch1.12.1 python=3.8.8

2、激活刚建的虚拟环境 

activate torch1.12.1

3、到官方网站下载yolo模型 ,下载好后解压,里面有个文件requirements.txt  

http://mirrors / ultralytics / ultralytics · GitCode 

 4、安装一个整体包:

pip install -r .\requirements.txt  

注:直接按照路径会有问题,找到自己下载后yolo v8文件里的 requirements.txt 文件路径 

5、然后安装ultralytics ,这是必须的。也可以用镜像地址 

pip   install   ultralytics   -i http://mirrors.aliyun.com/pypi/simple/ --trusted-host mirrors.aliyun.com 

6、安装下载好包,接下来就是验证:

yolo predict model=yolov8n.pt source='ultralytics/assets/bus.jpg' show=True save=True  

二、训练数据集的准备工作

1、收集数据集

我们选择的苹果数据集包含图片数量978张

2、划分数据集

我们导出的数据标签是这个结构

标签类别包含两类:fresh_apple和rotten_apple;

  1. ├── yolov8_dataset
  2. └── train
  3. └── images (folder including all training images)
  4. └── labels (folder including all training labels)
  5. └── test
  6. └── images (folder including all testing images)
  7. └── labels (folder including all testing labels)
  8. └── val
  9. └── images (folder including all testing images)
  10. └── labels (folder including all testing labels)

运行脚本来划分数据集:

  1. import os
  2. import random
  3. import shutil
  4. # 设置随机数种子
  5. random.seed(123)
  6. # 定义文件夹路径
  7. root_dir = 'Moon_Cake'
  8. image_dir = os.path.join(root_dir, 'images', 'all')
  9. label_dir = os.path.join(root_dir, 'labels', 'all')
  10. output_dir = 'yolov8_dataset'
  11. # 定义训练集、验证集和测试集比例
  12. train_ratio = 0.7
  13. valid_ratio = 0.15
  14. test_ratio = 0.15
  15. # 获取所有图像文件和标签文件的文件名(不包括文件扩展名)
  16. image_filenames = [os.path.splitext(f)[0] for f in os.listdir(image_dir)]
  17. label_filenames = [os.path.splitext(f)[0] for f in os.listdir(label_dir)]
  18. # 随机打乱文件名列表
  19. random.shuffle(image_filenames)
  20. # 计算训练集、验证集和测试集的数量
  21. total_count = len(image_filenames)
  22. train_count = int(total_count * train_ratio)
  23. valid_count = int(total_count * valid_ratio)
  24. test_count = total_count - train_count - valid_count
  25. # 定义输出文件夹路径
  26. train_image_dir = os.path.join(output_dir, 'train', 'images')
  27. train_label_dir = os.path.join(output_dir, 'train', 'labels')
  28. valid_image_dir = os.path.join(output_dir, 'valid', 'images')
  29. valid_label_dir = os.path.join(output_dir, 'valid', 'labels')
  30. test_image_dir = os.path.join(output_dir, 'test', 'images')
  31. test_label_dir = os.path.join(output_dir, 'test', 'labels')
  32. # 创建输出文件夹
  33. os.makedirs(train_image_dir, exist_ok=True)
  34. os.makedirs(train_label_dir, exist_ok=True)
  35. os.makedirs(valid_image_dir, exist_ok=True)
  36. os.makedirs(valid_label_dir, exist_ok=True)
  37. os.makedirs(test_image_dir, exist_ok=True)
  38. os.makedirs(test_label_dir, exist_ok=True)
  39. # 将图像和标签文件划分到不同的数据集中
  40. for i, filename in enumerate(image_filenames):
  41. if i < train_count:
  42. output_image_dir = train_image_dir
  43. output_label_dir = train_label_dir
  44. elif i < train_count + valid_count:
  45. output_image_dir = valid_image_dir
  46. output_label_dir = valid_label_dir
  47. else:
  48. output_image_dir = test_image_dir
  49. output_label_dir = test_label_dir
  50. # 复制图像文件
  51. src_image_path = os.path.join(image_dir, filename + '.jpg')
  52. dst_image_path = os.path.join(output_image_dir, filename + '.jpg')
  53. shutil.copy(src_image_path, dst_image_path)
  54. # 复制标签文件
  55. src_label_path = os.path.join(label_dir, filename + '.txt')
  56. dst_label_path = os.path.join(output_label_dir, filename + '.txt')
  57. shutil.copy(src_label_path, dst_label_path)

 运行完脚本后我们的数据集就会划分成这个格式了,现在数据准备工作就彻底完成了,接下来我们就可以开始着手训练模型。

这是划分数据集后的文件结构:

3、训练模型

3.1新建一个数据集yaml文件

里面写绝对路径:

4、预测模型

相关参数解析:

参数默认值描述
model模型文件路径,如yolov8n.pt,yolov8n.yaml
data数据文件路径,如coco128.yaml
epochs100训练的轮数
patience50等待没有观察到改进的轮数,以便提前停止训练
batch16每个批次的图像数量(-1表示自动批处理)
imgsz640输入图像的大小,可以是整数或w,h
saveTrue保存训练检查点和预测结果
save _period-1每x个轮数保存检查点(如果<1,则禁用)
cacheFalseTrue / ram,磁盘或False。使用缓存加载数据
device运行的设备,如cuda device=0或device=0,1,2,3或device=cpu
workers8加载数据的工作线程数(每个RANK如果DDP)
project项目名称
name实验名称,结果保存到project / name”目录中
exist_okFalse是否覆盖现有实验
pretrainedFalse是否使用预训练模型

5、验证模型

python文件:

args.yaml文件:

参数解释:

参数默认值描述
valTrue在训练过程中进行验证/测试
splitval用于验证的数据集划分,可选项有“val"
"test"或"train"
save_jsonFalse是否将结果保存为JSON文件
save_hybridFalse是否保存标签的混合版本 (标签+额外的预测结果)
conf0.25 (predict) ,0.001 (val)检测的物体置信度闯值 (默认值) ,在训练和验证过程中使用不同的阀值
iou0.7非极大值抑制 (NMS) 的交并比 (lou) 阀值
max_det300每个图像最多检测出的目标数量
halfFalse是否使用半精度 (FP16)
dnnFalse是否使用openCV DNN进行ONNX推理
plotsTrue在训练/验证过程中是否保存图表

同样的验证完后得到一个文件夹:

可以看一下检测效果:

6、训练结束

训练完成后,YOLO-v8\ultralytics-main根目录下会产生一个run的文件夹,里面就存有训练好的模型:

三、检测结果与思考:

1、检测结果

准确率没有达到很高考虑到是因为训练150轮次数不够多,而腐烂苹果的召回率较低,观察检测的样本结果看到腐烂苹果是未被检测出来,考虑是因为腐烂苹果的不同品种外形差距较大,而训练集并没有包含全部腐烂苹果的品种,从而导致这样的结果;其在外形相似度很高的情况下能达到70%的召回率结果还是比较满意的。

2. 实验结果与分析

在实验结果与分析部分,我们不仅通过精度和召回率等指标来评估模型的性能,还通过损失曲线和PR曲线来分析训练过程。

训练过程截图如下:

在训练过程中,我们使用tensorboard记录了模型在训练集和验证集上的损失曲线。从图中可以看出,随着训练次数的增加,模型的训练损失和验证损失都逐渐降低,说明模型不断地学习到更加精准的特征。

在训练结束后,我们对模型在测试集上进行了评估,得到了以下结果。下图展示了我们训练的YOLOv8模型在测试集上的PR曲线。可以看到,模型在不同类别上都取得了较高的召回率和精确率,整体表现良好。

3、知识体系:

3.1、YOLOv8 概述

  1. 提供了一个全新的 SOTA 模型,包括 P5 640 和 P6 1280 分辨率的目标检测网络和基于 YOLACT 的实例分割模型。和 YOLOv5 一样,基于缩放系数也提供了 N/S/M/L/X 尺度的不同大小模型,用于满足不同场景需求
  2. 骨干网络和 Neck 部分可能参考了 YOLOv7 ELAN 设计思想,将 YOLOv5 的 C3 结构换成了梯度流更丰富的 C2f 结构,并对不同尺度模型调整了不同的通道数,属于对模型结构精心微调,不再是无脑一套参数应用所有模型,大幅提升了模型性能。不过这个 C2f 模块中存在 Split 等操作对特定硬件部署没有之前那么友好了
  3. Head 部分相比 YOLOv5 改动较大,换成了目前主流的解耦头结构,将分类和检测头分离,同时也从 Anchor-Based 换成了 Anchor-Free
  4. Loss 计算方面采用了 TaskAlignedAssigner 正样本分配策略,并引入了 Distribution Focal Loss
  5. 训练的数据增强部分引入了 YOLOX 中的最后 10 epoch 关闭 Mosiac 增强的操作,可以有效地提升精度

3.2、 模型结构设计

3.3、模型推理过程

(1) bbox 积分形式转换为 4d bbox 格式
对 Head 输出的 bbox 分支进行转换,利用 Softmax 和 Conv 计算将积分形式转换为 4 维 bbox 格式
(2) 维度变换
YOLOv8 输出特征图尺度为 80x80、40x40 和 20x20 的三个特征图。Head 部分输出分类和回归共 6 个尺度的特征图。
将 3 个不同尺度的类别预测分支、bbox 预测分支进行拼接,并进行维度变换。为了后续方便处理,会将原先的通道维度置换到最后,类别预测分支 和 bbox 预测分支 shape 分别为 (b, 80x80+40x40+20x20, 80)=(b,8400,80),(b,8400,4)。
(3) 解码还原到原图尺度
分类预测分支进行 Sigmoid 计算,而 bbox 预测分支需要进行解码,还原为真实的原图解码后 xyxy 格式。
(4) 阈值过滤
遍历 batch 中的每张图,采用 score_thr 进行阈值过滤。在这过程中还需要考虑 multi_label 和 nms_pre,确保过滤后的检测框数目不会多于 nms_pre。
(5) 还原到原图尺度和 nms
基于前处理过程,将剩下的检测框还原到网络输出前的原图尺度,然后进行 nms 即可。最终输出的检测框不能多于 max_per_img。

有一个特别注意的点:YOLOv5 中采用的 Batch shape 推理策略,在 YOLOv8 推理中暂时没有开启,不清楚后面是否会开启,在 MMYOLO 中快速测试了下,如果开启 Batch shape 会涨大概 0.1~0.2。

四、总结

本文利用苹果新鲜度识别案例详细分析和总结了最新的 YOLOv8 算法,从整体设计到模型结构、Loss 计算、训练数据增强、训练策略和推理过程进行了详细的说明, 简单来说 YOLOv8 是一个包括了图像分类、Anchor-Free 物体检测和实例分割的高效算法,检测部分设计参考了目前大量优异的最新的 YOLO 改进算法,实现了新的 SOTA。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/298242
推荐阅读
相关标签
  

闽ICP备14008679号