深度学习——煤矸石识别

本文介绍了在煤矸石分选中使用深度学习的YOLOv8算法进行目标检测的项目,详细描述了数据预处理、模型训练过程,以及如何解决小块煤矸石漏检问题。模型在测试集上的PR曲线显示了高精度,但存在过拟合现象,通过增加数据量得以改善。
摘要由CSDN通过智能技术生成

目录

项目背景

1.项目需求

2.项目实现

3.yolov8网络结构

一、数据预处理

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

1.准备好数据集

2.划分数据集

3.划分数据集后的文件结构

4.模型训练

5.模型预测

6.创建main.py文件并调用

三、训练与检测结果

PR曲线图:

四、总结



项目背景

        针对煤矸石分选的问题,提出一种基于深度学习的目标检测算法替代人工选矸,为后续开发自动选矸机器人提供视觉依据。由于矸石样本数量有限,各个地区矸石特征不一,没有统一标准大数量样本集。通过模型训练实验发现,基础YOLOv8的深度学习网络存在针对小块煤矸石漏检与误检的缺陷,通过算法克服小块煤矸石漏检的缺陷。通过实验测试得出,改进后的YOLOv8能够对小块煤矸石检测,同时也能够提高目标检测模型的整体检测精度,准确率可达90%以上,完全可以替代人工检测。

        在本博文中,我们提出了一种基于深度学习的煤矸石检测与识别系统,该系统采用YOLOv8算法对煤矸石进行检测和识别,实现对图片中的煤矸石进行准确识别。

1.项目需求

对煤矸石进行检测与识别,系统将识别出图片中的克服小块煤矸石漏检的缺陷。

2.项目实现

通过调研,本项目最终使用yolov8模型作为目标检测的模型, YOLOv8 旨在快速、准确且易于使用,使其成为广泛的物体检测、图像分割和图像分类任务的极佳选择。

3.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网络结构图

创新点改进图

一、数据预处理

  • 数据集来源:百度
  • 数据集格式:图片格式jpg,大小3091张 
  • 煤矸石数据集及训练的模型有3091张图片和txt标签,标签类别两类:“coal”、“rock”。

1.YOLOv8环境配置

  • 语言环境:python3.8
  • 编辑器:pycharm
  • 深度学习环境:tensorflow2

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 

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

1.准备好数据集

我们选择的煤矸石数据集包含图片数量3091张

2.划分数据集

数据集划分训练集,验证集,测试集的比例为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)

​

3.划分数据集后的文件结构

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

images 下包含 test,train、val 文件夹,这三个文件夹下包含此次需要的 图片信息
labels 下包含 test,train、val 文件夹,这三个文件夹下包含此次需要的 对应图片的标注信息

4.模型训练

首先在 dataset 文件夹下新建一个数据加载配置文件 data_coal.yaml,里面写绝对路径:

5.模型预测

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 阈值的精确度。

6.创建main.py文件并调用

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张图片

PR曲线图:

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

如图显示,得到的map@0.5性能指标为0.989。

但是比较训练集的损失和验证集的损失曲线,发现训练集的损失曲线一直下降,而验证集的损失曲线后面呈上升状态,说明模型训练过程中发生了过拟合。

解决方法:增加数据量,过拟合可能是由于数据量不足导致的,因此可以增加训练数据量,以减少过拟合的风险。

四、总结

在项目中,我学到了许多有关目标检测和深度学习的重要知识和经验。通过这次项目,我深入了解了目标检测领域的主要算法,特别是YOLOv8。学习了如何使用现代深度学习技术来构建高性能的目标检测系统;学习了如何收集、标注和预处理图像数据,以创建适用于训练的数据集;了解了模型训练的基本原理,包括损失函数、优化器和迭代过程;还学会了如何选择和调整超参数以优化模型性能;此外,学习了如何使用不同的性能指标(如Precision、Recall、mAP等)来评估模型的性能。

  • 4
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 13
    评论
基于深度学习煤矸石识别系统是一种利用机器视觉和深度学习技术来实现对煤矸石的自动识别的系统。该系统首先采集煤矸石的图像作为训练样本,然后通过深度学习方法对这些样本进行训练,以获取一个煤矸石识别的卷积神经网络模型。这个模型可以自动学习图像中的特征,并通过优化模型参数来提高识别准确率。 为了训练一个效果好的网络模型,需要提供大量不同的煤矸石图像数据,让模型能够充分学习和理解煤矸石的特征。通过该系统,可以快速、准确地对煤矸石进行识别,为后续的煤矸石分拣工作提供了基础。 值得注意的是,这种基于深度学习煤矸石识别系统是在现有煤矸石识别技术基础上的一种创新应用。它结合了机器视觉、机器人和智能控制等技术,实现了对粒度为50~260 mm的煤矸石进行高效、快速分拣。这个系统的出现使得煤矸石分拣逐渐朝着自动化和机器人化的方向发展。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [基于机器视觉的多机械臂煤矸石分拣机器人系统研究](https://blog.csdn.net/qq_42722197/article/details/127711593)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值