2022百度人工智能创意赛-创新组作品
一、项目背景
1、煤炭行业发展现状
煤炭资源是我国广泛使用的能源之一,它被广泛应用于发电、制热及人们的日常生活中。现在,煤炭占我国能源生产和消费的比例长期在60%以上,在之后很长时间内煤炭资源依旧会是我国的主要能源。煤炭主要采用传送带输送机进行煤炭的输送,所以传送带输送机的运行状况直接影响着煤矿的产能和效率。近年来我国的经济也在进一步转型,煤矿企业也正在改变过去的生产经营模式,大力推广节能降耗技术,提高能源利用率。煤矿井下传送带运输距离远、运输量大、运输时间长,而且因为生产需要,不能随时停机,导致传送带输送机经常无煤空载,不仅浪费了电能,对输送机损害严重,而且影响煤矿的产能和效益。据统计,每年煤矿传送带空载造成的电能亏损占到正常运行电能损耗的30%。
2020年2月国家八部委联合印发了《关于加快煤矿智能化发展的指导意见》,明确了发 展目标、主要任务以及保障措施等内容。到2035年,各类煤矿要基本实现智能化,构建多产业链、多系统集成的煤矿智能化系统,建成智能感知、智能决策、自动执行的煤矿智能化体系。围绕满足“智慧矿山”生产需要,立足煤矿安全、高效、绿色、低碳、智能开采的新形势和新要求,煤矿带式输送机领域的科技创新以高可靠性设计、高效软启动及功率平衡技术、 动态分析技术、智能感知技术、无人巡检技术、智能化运维管理等关键技术为突破口,攻克制约设备在设计、制造和运行过程中的技术瓶颈,加强基础和核心技术研究,实现我国井工和露天煤矿主运输系统的节能低耗和智能化发展。加快智慧矿山、智能化煤矿建设是煤炭工业迈向高质量发展的“新引擎”。
2、井下煤炭输送存在的问题
煤炭在井下开采后,必须通过传送带运输到地面,因此煤流运输是煤炭产业的大动脉,但在目前的运输过程中,存在着以下的问题:
- 空载、轻载造成电能浪费:由于煤炭生产的不连续性,使带式输送机常常处于空载、轻载及很少达到满载的运行状态,造成电能浪费,同时加剧了设备磨损;多数煤炭企业服役的带式输送机多是恒速运行模式,没有适时进行调整。
- 人工监控工作量大,准确率低:传统的视频监控需要员工时刻守在屏幕前,随着监控视频时间的不断增长、监控范围的不断扩大,员工的工作量也必然会很大,极易产生视觉疲劳,难以达到精密的监控,再加上煤矿井下环境复杂,人工不易分辨运动目标。
- 视频图像不清晰:煤矿井下的环境十分特殊,比如粉尘较大、矿灯全天候照明、头灯等,这些因素会导致视频图像质量差、可辨别度低。
- 现有检测方法精确度低,成本高:基于超声波测距等使用硬件进行检测的方法不仅成本高,还需要工作人员的定期维护。
二、项目内容
本项目是一个井下煤流视频的智能分析系统,包含传送带运输状态识别和煤流分割两个功能:
(1)传送带运输状态识别:将传送带运行过程分为了“传送带不动,无煤”、“传送带不动,有煤”、“传送带动,无煤(空转)”和“传送带动,有煤”四个状态,使用图像分类模型并结合帧差法实时分析传送带的运行状态,如果监测到传送带长时间处于空转状态,系统将会向用户发送一个报警信号;
(2)煤流分割:为了能够实时监控传送带上煤量的多少,又引入了实时语义分割模型,对传送带和煤流实时进行分割,根据分割结果可以计算出煤炭宽度与整个传送带宽度的占比,以此可以体现出传送带上煤量的占比,方便工作人员对传送带的运行速度做出适时调整,提升了传送带系统运行的经济性。
最后视频监控画面采用了GUI界面设计,可以显示传送带当前的运行状态、该状态本次持续时间、四个状态总共的持续时间、煤量占比、运行状态变化折线图和报警信息等内容,辅助企业实现启停自适应控制、煤量自适应调速、多级协同控制、煤流均衡技术。
1、分类模型训练
1.1、数据集(本项目只展示部分数据)
本项目的数据来源于我们的合作企业——河南省永城市永煤集团股份有限公司新桥煤矿、河南省新乡市-辉县龙田煤业有限公司程村矿。该视频数据均由井下传送带上方的监控摄像头所采集,其分辨率为1920×1080,格式为MP4,帧率为30FPS。我们利用分帧脚本对采集到的视频数据进行抽帧操作,设定每间隔6帧抽取一次图像并保存,共获得2811张图像分类数据,1000张图像分割数据。
我们一共设置了四个类别,如图所示,分别为“传送带不动”、“传送带动”、“无煤”和“有煤”四类,共2811张图像。其中前两个类别的图像在视频抽帧时必须进行帧间差分处理,后两个类别只需要在视频抽帧时保存原图像即可,由于图像分类无需标注工具,我们手动将属于同一类的图片放在同一个文件夹下。
数据文件结构如下:
1.2、模型训练
1.2.1、安装PaddleX
! pip install paddlex==2.0.0
1.2.2、准备分类数据集
!unzip -oq chuansong_dataset.zip -d ./
1.2.3、训练模型
import paddlex as pdx
from paddlex import transforms as T
#自定义图像预处理流程transforms
train_transforms = T.Compose(
[T.RandomCrop(crop_size=224), T.RandomHorizontalFlip(), T.Normalize()])
eval_transforms = T.Compose([
T.ResizeByShort(short_size=256), T.CenterCrop(crop_size=224), T.Normalize()
])
#定义训练和验证所用的数据集
train_dataset = pdx.datasets.ImageNet(
data_dir='home/aistudio/chuansong_dataset',
file_list='home/aistudio/chuansong_dataset/train_list.txt',
label_list='home/aistudio/chuansong_dataset/labels.txt',
transforms=train_transforms,
shuffle=True)
eval_dataset = pdx.datasets.ImageNet(
data_dir='home/aistudio/chuansong_dataset',
file_list='home/aistudio/chuansong_dataset/val_list.txt',
label_list='home/aistudio/chuansong_dataset/labels.txt',
transforms=eval_transforms)
#初始化模型,并进行训练
num_classes = len(train_dataset.labels)
model = pdx.cls.ResNet50(num_classes=num_classes)
model.train(num_epochs=10,
train_dataset=train_dataset,
train_batch_size=32,
eval_dataset=eval_dataset,
lr_decay_epochs=[4, 6, 8],
save_interval_epochs=1,
learning_rate=0.025,
save_dir='output/ResNet50',
use_vdl=True)
1.3、模型效果
训练完成后在路径 output/ResNet50/vdl_log/ 下可以看到生成的log文件。
将log文件下载到本地,使用VisualDL工具可以看到loss与acc1等参数的变化趋势,如图所示。
1.4、保存最佳模型
运行以下指令将最佳模型保存到inference_model_cls中,后续使用paddlex.deploy.Predictor()接口调用
!paddlex --export_inference --model_dir=output/ResNet50/best_model --save_dir=inference_model_cls
2、分割模型训练
2.1、数据集(本项目只展示部分数据)
我们对采集到的视频数据进行抽帧处理,共保存了1000张原始图像。由于语义分割模型是对像素点进行分类,我们设计了“背景”、“传送带”,“煤矿”这三个类别,使用labelme标注软件对保存下来的1000张图像进行标注并生成对应的json文件,通过PaddleX提供的脚本文件对其进行处理,生成可用于训练的8位彩色掩膜图像(像素点以类别0,1,2…进行分布)。为了获得更好的模型效果,我们还使用了Augmentor数据增强库中的随机旋转、随机亮度等方式对原始数据与掩膜图像进行同步扩充,将原始数据扩充到了2000张,原始图像、标注后生成的掩膜图像及可视化融合图像。
数据文件结构如下:
2.2、模型训练
2.2.1、准备分割数据集
! unzip -oq /home/aistudio/conveyor_belt_1.zip
#将json格式数据转换成可用于训练的8位彩图转换后生成的文件夹是conveyor_belt_1_train
! paddlex --data_conversion --source labelme --to SEG --pics ./conveyor_belt_1/pics \
--annotations ./conveyor_belt_1/annotations --save_dir ./conveyor_belt_1_train
!pip install Augmentor
import Augmentor
import os
import shutil
#数据增强处理
p = Augmentor.Pipeline("conveyor_belt_1_train/JPEGImages")
p.ground_truth("conveyor_belt_1_train/Annotations")
p.rotate(probability=0.5, max_left_rotation=20, max_right_rotation=20)
p.flip_left_right(probability=0.5)
p.flip_top_bottom(probability=0.5)
p.flip_random(probability=0.5)
p.crop_random(probability=.5, percentage_area=0.9)
p.sample(200)
# 数据归类整理
path = "conveyor_belt_1_train/JPEGImages/output/"
img = 'conveyor_belt_1_train/JPEGImages/'
label = 'conveyor_belt_1_train/Annotations/'
img_path = 'conveyor_belt_1_train/JPEGImages/' + '_'
label_path = 'conveyor_belt_1_train/Annotations/' + '_'
if not os.path.exists(img_path):
os.makedirs(img_path)
if not os.path.exists(label_path):
os.makedirs(label_path)
for file in os.listdir(path):
if file[:2] == '_g':
shutil.move(path + file,label_path)
else:
shutil.move(path + file,img_path)
os.rmdir(path)
#数据重命名处理
num = 25
for img in os.listdir(img_path):
for label in os.listdir(label_path):
if img[-14:-4] == label[-14:-4]:
os.rename(os.path.join(img_path,img),os.path.join(img_path,str(num)+".png"))
os.rename(os.path.join(label_path,label),os.path.join(label_path,str(num)+".png"))
num += 1
def remove_file(old_path, new_path):
filelist = os.listdir(old_path)
for file in filelist:
src = os.path.join(old_path, file)
dst = os.path.join(new_path, file)
shutil.move(src, dst)
remove_file(r"conveyor_belt_1_train/Annotations/_", r"conveyor_belt_1_train/Annotations")
remove_file(r"conveyor_belt_1_train/JPEGImages/_", r"conveyor_belt_1_train/JPEGImages")
os.rmdir(img_path)
os.rmdir(label_path)
#将语义分割数据集划分为训练集:验证集:测试集=7:2:1
! paddlex --split_dataset --format SEG --dataset_dir conveyor_belt_1_train --val_value 0.2 --test_value 0.1
2.2.2、训练模型
import paddle.optimizer
import paddlex.ppdet.optimizer
import paddlex as pdx
from paddlex import transforms as T
#自定义图像预处理流程transforms
train_transforms = T.Compose([
T.Resize(target_size=256),
T.Normalize(
mean=[0.5, 0.5, 0.5], std=[0.5, 0.5, 0.5]),
])
eval_transforms = T.Compose([
T.Resize(target_size=256),
T.Normalize(
mean=[0.5, 0.5, 0.5], std=[0.5, 0.5, 0.5]),
])
#定义训练和验证所用的数据集
train_dataset = pdx.datasets.SegDataset(
data_dir='conveyor_belt_1_train',
file_list='conveyor_belt_1_train/train_list.txt',
label_list='conveyor_belt_1_train/labels.txt',
transforms=train_transforms,
shuffle=True)
eval_dataset = pdx.datasets.SegDataset(
data_dir='conveyor_belt_1_train',
file_list='conveyor_belt_1_train/val_list.txt',
label_list='conveyor_belt_1_train/labels.txt',
transforms=eval_transforms,
shuffle=False)
#初始化模型,并进行训练
num_classes = len(train_dataset.labels)
model = pdx.seg.BiSeNetV2(num_classes=num_classes)
model.train(
num_epochs=100,
train_dataset=train_dataset,
train_batch_size=4,
eval_dataset=eval_dataset,
learning_rate=0.05,
save_dir='output/BiseNetV2',use_vdl=True,
train_batch_size=4,
eval_dataset=eval_dataset,
learning_rate=0.05,
save_dir='output/BiseNetV2',use_vdl=True,
save_interval_epochs=10)
2.3、模型效果
训练完成后,在路径 output/BiseNetV2/vdl_log/ 下可以查看到生成的日志文件。
使用VisualDL工具可以看到loss与miou等参数的变化趋势,可见模型平均的miou为0.978,背景、传送带和煤矿这三类的miou分别为0.994、0.925和0.988,达到了预期的效果。由此可以监控模型是否在正常收敛于最优值
2.4、保存最佳模型
运行以下指令将最佳模型保存到inference_model_seg中,后续使用paddlex.deploy.Predictor()接口调用
!paddlex --export_inference --model_dir=output/BiseNetV2/best_model --save_dir=inference_model_seg
3、结果展示
使用tkinter设计了GUI界面,目前包含如下功能:
- 实时显示当前传送带运输机的运行状态(不断闪烁提醒);
- 统计当前状态本次持续时间;统计四个状态的总共持续时间;
- 显示传送带最近一段时间的运行状态变化折线图;
- 空转超过1分钟(或3、5和10分钟,用户自己选择)之后发送报警信息;
- 对传送带与煤流进行分割并实时显示当前传送带运输机上的煤量占比。
运行界面-报警状态:
运行界面-正常状态:
三、应用前景
我国煤炭行业信息数据化和智能化水平快速发展,这为煤矿企业能够实现传送带运输机的视频监控系统和煤流智能分析系统奠定了基础,同时可以实现工作人员在地面监测室就能远程监测传送带运输机的实际运行状况。满足不同需求的工业相机和计算机性能的不断提高,这为基于图像处理的监测系统提供了所需的硬件支撑,因此我们的项目具有以下应用前景:
- 通过煤矿智能化建设,工作人员不再需要频繁的到井下检查传送带的运行状态,保证了工作人员的安全;智能化少人、无人,不仅实现减员增效,还极大改善了职工工作环境,提高了煤矿安全管理水平。
- 可以减少传送带运输机现场工作人员岗位,节约人力成本;长时间空转报警和根据煤量适时调速,减少了电能浪费,节约成本。
- 智能化控制系统升级改造应用后,将以往人工管理模式摒弃,优化了带式输送机运行管理流程,是实现智能化开采工作面和智能矿山的基础,以期实现“集中远控、无人值守、设备在线监测和故障预警”的建设目标。
四、总结
该项目成果已经被河南理工大学智能开采研究院采用并进行展示和推广
项目展望:
- 加入卸煤篦子堵塞检测。卸煤篦子是卸煤槽不可缺失的一部分,它是煤炭的入口,是煤矿井下运输重要的一环,使用目标检测算法可以很好地判断出是否堵塞,进而报警提醒人工干预以免影响正常运行,初步检测结果如下图所示;
- 进一步优化识别算法模型,将分析的皮带状态结果以MODBUS等标准协议接口输出,用于制定控制策略对皮带进行调速,实现节能降耗;
- 用目标检测算法,实现异物(大块煤、矸石、锚杆等)的检测;
- 基于计算机视觉相关算法,实现传送带跑偏、打滑等异常状态检测;
……
最终实现一套完整的“煤矿井下传送带多功能智能分析系统”,赋能煤矿安全生产。
参赛单位:河南理工大学
团队名称:世界的尽头是炼丹
合作企业:河南省永城市永煤集团股份有限公司新桥煤矿、河南省新乡市-辉县龙田煤业有限公司程村矿
此文章为搬运
原项目链接