赞
踩
目录
针对煤矸石分选的问题,提出一种基于深度学习的目标检测算法替代人工选矸,为后续开发自动选矸机器人提供视觉依据。由于矸石样本数量有限,各个地区矸石特征不一,没有统一标准大数量样本集。通过模型训练实验发现,基础YOLOv8的深度学习网络存在针对小块煤矸石漏检与误检的缺陷,通过算法克服小块煤矸石漏检的缺陷。通过实验测试得出,改进后的YOLOv8能够对小块煤矸石检测,同时也能够提高目标检测模型的整体检测精度,准确率可达90%以上,完全可以替代人工检测。
在本博文中,我们提出了一种基于深度学习的煤矸石检测与识别系统,该系统采用YOLOv8算法对煤矸石进行检测和识别,实现对图片中的煤矸石进行准确识别。
对煤矸石进行检测与识别,系统将识别出图片中的克服小块煤矸石漏检的缺陷。
通过调研,本项目最终使用yolov8模型作为目标检测的模型, YOLOv8 旨在快速、准确且易于使用,使其成为广泛的物体检测、图像分割和图像分类任务的极佳选择。
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
yolov8网络结构图
创新点改进图
1.YOLOv8环境配置
2.创建一个虚拟环境
首先去自己的anaconda的安装的envs(虚拟环境),在导航栏输入cmd,进入命令窗口,确保python>=3.7;CUDA>=10.1,PYtorch>=1.7
conda create -n torch1.12.1 python=3.8.8
3.激活刚建的虚拟环境
activate torch1.12.1
4.到官方网站下载yolo模型 ,下载好后解压,里面有个文件requirements.txt
mirrors / ultralytics / ultralytics · GitCode
安装一个整体包:
pip install -r .\requirements.txt
直接按照路径会有问题,找到自己 requirements.txt 文件路径,我这里是pip install -r D:\ultralytics-main\ultralytics-main\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
我们选择的煤矸石数据集包含图片数量3091张
数据集划分训练集,验证集,测试集的比例为8:1:1
-
- # -*- coding: utf-8 -*-
- """
- 将数据集划分为训练集,验证集,测试集
- """
- import os
- import random
- import shutil
-
- # 创建保存数据的文件夹
- def makedir(new_dir):
- if not os.path.exists(new_dir):
- os.makedirs(new_dir)
-
- def split_data(img_dir,label_dir):
-
- random.seed(1) # 随机种子
- # 1.确定原图片数据集路径
- datasetimg_dir = img_dir
- #确定原label数据集路径
- datasetlabel_dir = label_dir
-
- # 2.确定数据集划分后保存的路径
- split_dir = os.path.join(".", "dataset")
- train_dir = os.path.join(split_dir, "train")
- valid_dir = os.path.join(split_dir, "valid")
- test_dir = os.path.join(split_dir, "test")
- dir_list = [train_dir,valid_dir,test_dir]
- image_label = ['images','labels']
-
- for i in range(len(dir_list)):
- for j in range(len(image_label)):
- makedir(os.path.join(dir_list[i],image_label[j]))
-
- # 3.确定将数据集划分为训练集,验证集,测试集的比例
- train_pct = 0.8
- valid_pct = 0.1
- test_pct = 0.1
- # 4.划分
- imgs = os.listdir(datasetimg_dir) # 展示目标文件夹下所有的文件名
- imgs = list(filter(lambda x: x.endswith('.tif'), imgs)) # 取到所有以.png结尾的文件,如果改了图片格式,这里需要修改
- random.shuffle(imgs) # 乱序路径
- img_count = len(imgs) # 计算图片数量
- train_point = int(img_count * train_pct) # 0:train_pct
- valid_point = int(img_count * (train_pct + valid_pct)) # train_pct:valid_pct
- for i in range(img_count):
- if i < train_point: # 保存0-train_point的图片到训练集
- out_dir = os.path.join(train_dir, 'images')
- label_out_dir = os.path.join(train_dir, 'labels')
-
- elif i < valid_point: # 保存train_point-valid_point的图片到验证集
- out_dir = os.path.join(valid_dir, 'images')
- label_out_dir = os.path.join(valid_dir, 'labels')
- else: # 保存test_point-结束的图片到测试集
- out_dir = os.path.join(test_dir, 'images')
- label_out_dir = os.path.join(test_dir, 'labels')
-
- target_path = os.path.join(out_dir, imgs[i]) # 指定目标保存路径
- src_path = os.path.join(datasetimg_dir, imgs[i]) #指定目标原图像路径
- label_target_path = os.path.join(label_out_dir, imgs[i][0:-4]+'.txt')
- label_src_path = os.path.join(datasetlabel_dir,imgs[i][0:-4]+'.txt')
- shutil.copy(src_path, target_path) # 复制图片
- shutil.copy(label_src_path, label_target_path) #复制txt
-
- print('train:{}, valid:{}, test:{}'.format(train_point, valid_point-train_point,
- img_count-valid_point))
-
- if __name__ == "__main__":
- img_dir = './images'
- label_dir = './data'
- split_data(img_dir,label_dir)
-
-

运行完脚本后我们的数据集就会划分成这个格式了,现在数据准备工作就彻底完成了,接下来我们就可以开始着手训练模型。
images
下包含 test
,train、val
文件夹,这三个文件夹下包含此次需要的 图片信息
labels
下包含 test,train、val
文件夹,这三个文件夹下包含此次需要的 对应图片的标注信息
首先在 dataset
文件夹下新建一个数据加载配置文件 data_coal.yaml
,里面写绝对路径:
model: 训练模型权重,可指定具体位置,如yolov8n.pt,yolov8n.yaml等
epochs:训练的轮次,训练的轮数越多,模型对数据的学习就越充分
在 YOLOv8 模型的训练过程中,以下指标和参数是常见的,它们用于监控和优化训练的进展:
(1)Epoch(迭代周期):一个 Epoch 表示一次完整的数据集被模型用于训练的过程。在每个 Epoch 中,模型会遍历整个训练数据集一次,并尝试更新权重以减小损失函数的值。训练通常会持续多个 Epoch,以便模型收敛到最佳性能。
(2)GPU_mem(GPU内存占用):GPU 内存占用表示模型在训练过程中使用的 GPU 内存量。监视 GPU 内存的占用可以帮助您确保训练过程中不会出现内存不足的问题,同时还可以优化模型的批处理大小和训练速度。
(3)box_loss(边界框损失):边界框损失是目标检测任务中的一个损失函数,它度量了模型在预测目标边界框位置方面的误差。较低的边界框损失通常表示模型更好地定位目标。
(4)cls_loss(类别损失):类别损失是目标检测任务中的另一个损失函数,它度量了模型在预测目标类别方面的误差。较低的类别损失通常表示模型更好地识别目标的类别。
(5)dfl_loss(特征图级别的损失):YOLOv8 中的 dfl_loss 可能是指特征图级别的损失,用于优化特征图的相关性,以提高目标检测性能。
(6)Instances(实例数):Instances 表示在训练数据集中存在的目标实例的数量。这是目标检测任务中的一个重要统计指标,有助于了解数据集的规模。
(7)Precision (P):精确度是指模型预测的正类别目标中有多少是真正的正类别目标。它表示模型在识别目标时的准确性。计算公式为:Precision = TP / (TP + FP),其中 TP 表示真正的正类别目标,FP 表示模型错误地预测为正类别的目标。
(8)Recall (R):召回率是指在所有真正的正类别目标中,模型成功检测到多少。它表示模型在识别正类别目标时的覆盖范围。计算公式为:Recall = TP / (TP + FN),其中 TP 表示真正的正类别目标,FN 表示模型未能检测到的正类别目标。
(9)mAP50 (平均精确度@0.5 IoU):mAP50 是指模型在测试数据集上的平均精确度,当 IoU 阈值为 0.5 时的表现。它通过计算不同类别的精确度并取平均来评估模型在目标检测任务中的性能。通常,mAP50 越高表示模型在识别目标时的准确性越高。
(10)mAP50-95 (平均精确度@0.5-0.95 IoU):mAP50-95 是指模型在测试数据集上的平均精确度,考虑了 IoU 阈值从 0.5 到 0.95 的范围。它更全面地评估模型的性能,因为不同任务可能要求不同 IoU 阈值的精确度。
- from ultralytics import YOLO
-
- if __name__ == '__main__':
- # 直接使用预训练权重或yaml文件创建模型
- model = YOLO('yolov8n.pt')
- model.train(**{'cfg': 'ultralytics/cfg/default.yaml', 'data': r"D:/ssxxx/YOLO-v8/ultralytics-main/Dataset/data_coal.yaml"})
成功训练后根目录下会产生一个runs的文件夹,里面就存有训练好的模型
我设置的batch_size为16所以一次读取16张图片
在训练结束后,我们对模型在测试集上进行了评估,得到了以下结果。下图展示了我们训练的YOLOv8模型在测试集上的PR曲线。可以看到,模型在不同类别上都取得了较高的召回率和精确率,整体表现良好。
如图显示,得到的map@0.5性能指标为0.989。
但是比较训练集的损失和验证集的损失曲线,发现训练集的损失曲线一直下降,而验证集的损失曲线后面呈上升状态,说明模型训练过程中发生了过拟合。
解决方法:增加数据量,过拟合可能是由于数据量不足导致的,因此可以增加训练数据量,以减少过拟合的风险。
在项目中,我学到了许多有关目标检测和深度学习的重要知识和经验。通过这次项目,我深入了解了目标检测领域的主要算法,特别是YOLOv8。学习了如何使用现代深度学习技术来构建高性能的目标检测系统;学习了如何收集、标注和预处理图像数据,以创建适用于训练的数据集;了解了模型训练的基本原理,包括损失函数、优化器和迭代过程;还学会了如何选择和调整超参数以优化模型性能;此外,学习了如何使用不同的性能指标(如Precision、Recall、mAP等)来评估模型的性能。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。