前言
本文我将介绍我和我的团队自主研发设计的一款AI产品的成果展示——“基于视频AI识别技术的煤矿安全生产管理系统”。
这款产品是目前我在创业阶段和几位矿业大学的博士共同从架构设计、开发到交付的全过程中首次在博客频道发布, 我之前一直想写但没有机会来整理这套系统的架构, 因此我也特别感谢CSDN平台提供了这个机会,让我有了一定的动力来整理并分享这套系统的架构。
我将从产品的萌芽到系统的架构设计,业务模块的划分,容灾恢复等多个方面来介绍这款产品。
我相信这将为系统架构设计,业务模块划分,容灾业务处理能力感到困惑的技术开发人员也能提供有价值的思路。
人工智能在煤矿安全检测领域的发展趋势
近年来,在中美两国的AI发展中,仍然存在一定的差异。美国在AI基础研究和技术创新方面处于领先地位,而且他们拥有丰富的资金和人才支持。而中国则在应用层面迅速追赶,特别是在工业应用和智能化建设方面取得了显著进展, 中国的AI发展更注重产业协同,推动技术与实际应用的结合,以实现更高效的生产和管理。
随着AI技术在国内的迅猛发展,AI正在重塑各个行业,尤其是在煤矿安全检测领域。煤矿业作为国民经济发展的关键支柱型产业,其智能化建设对于促进矿山安全稳健发展、确保国家能源资源安全具有举足轻重的意义。近年来,我国矿山智能化建设步伐加快,成效显著,然而仍面临发展不均衡、不充分及不协调等挑战,亟需进一步优化与提升。为深入贯彻落实《中共中央办公厅 国务院办公厅关于进一步加强矿山安全生产工作的意见》 ,大家可以参考关于印发《关于深入推进矿山智能化建设 促进矿山安全发展的指导意见》的通知 查看具体政策意见。除此之外,国家能源局也出台了关于进一步加快煤矿智能化建设促进煤炭高质量发展的通知
明确要求加强新一代通信技术、人工智能(AI)、数据中心等信息基础设施建设,鼓励具备条件的地方建设煤炭工业互联网平台,逐步实现煤矿生产、经营、管理等数据的智能分析和统一管理。推广AI视频智能监控、井下高精度定位、露天矿边坡监测预警等系统,强化关键区域、重点岗位的实时监控。
可见未来AI领域将对煤矿业的生产带来生产效率,安全的提升,优化资源管理和故障管理维护的预测,促进智能化转型等多方面的影响,安全性将产生非常深远重大的意义。
项目的萌芽
自2011年毕业以来,我首先在IBM Platform Computing深耕虚拟云计算领域,积累了近两年的宝贵虚拟化技术经验。随后,我转战淘米网与网易,投身于游戏开发行业,不断拓展自己的技术边界。
在这个过程中,csdn也记录和陪伴着我的技术成长 。
18年我决定回到西安开始踏上创业之路,和几个志同道合的朋友专注于自己的游戏开发,在游戏产品取得稳定的发展之后,我对人工智能领域也有同样的兴趣和热爱(实际上我在工作期间和交大老师微信保持联系,也帮老师会做一些算法优化,做一些视觉算法,使得我对AI对实际的工业检测,视觉识别行业非常看好)。一次偶然的机遇,我在CSDN上与几位来自矿业大学的博士都对人工智能发展趋势,模型训练聊的投机,志同道合,仿佛“桃园结义”,所以我们希望借助各自优势共同推动AI技术在煤矿行业的深度应用与发展,一步步稳健前行。
在这样的矿业背景和AI发展趋势下,再加上后来矿大老师的牵线下我们开始对使用AI视觉来管理煤矿生产的安全课题有了进一步的推进和落地。于是我们从2014年3月份开始设计开发产品,并迅速推广给西北各个煤矿企业,我主要负责全平台的系统架构设计。
系统架构设计
系统架构设计是软件开发和部署中的核心环节,尤其在煤矿行业这样复杂且高风险的环境中,架构设计需要综合考虑多种因素,以确保系统的性能、可靠性和安全性。以下将从通用架构设计因素和煤矿行业特定环境因素两个方面进行分析。
系统架构设计需要考虑的因素
在设计系统架构时(有对服务器架构设计开发感兴趣的可以订阅专栏 游戏服务器开发专栏 缓存设计专栏),除了要考虑通用的业务需求,性能,可扩展性,高可用,安全性以及成本控制等方面之外,作为煤矿行业,他的环境又有一定的特殊性,这就决定了系统架构设计需要额外考虑以下环境因素:
1. 复杂的井上井下环境
高湿度和粉尘浓度
煤矿井下环境通常湿度大且粉尘浓度高,这对硬件设备的耐用性和系统的稳定性提出了更高要求。需要选择防尘、防潮的设备,并设计冗余系统以应对设备故障。有限的网络条件
井下井上网络通常带宽有限且延迟较高,系统需要优化数据传输协议,减少带宽占用,并支持离线模式以应对网络中断。2. 安全性和实时性
安全监测需求
煤矿行业需要实时监测瓦斯浓度、温度、压力等环境参数,以防止安全事故。系统必须具备高实时性和可靠性,确保数据采集和处理的及时性。应急响应能力
系统需要支持快速响应机制,例如在检测到危险情况时,能够自动触发报警并执行预设的应急方案。3. 系统的可扩展性
模块化设计
煤矿系统通常需要集成多种功能模块(如设备监控、人员定位、生产调度等)。模块化设计可以提高系统的灵活性,便于后续功能扩展。分布式架构
由于煤矿作业区域分散,系统需要采用分布式架构,以支持多区域协同工作,同时避免单点故障。4. 法规与合规性
煤矿行业受严格的安全法规约束,系统设计必须符合相关标准(如数据存储合规性、隐私保护等)
需求简要说明
这里我简要说明下系统设计的需求部分:操作人员可以通过任何一台电脑用浏览器登陆系统页面,部署视频监控,硬件嵌入式盒子,算法和模型的信息,部署告警的区域,配置的算法一旦触发告警策略,会立即通知给管理平台,并通过音柱对告警所在区域进行语音告警,可分析出某一个时间段内所有告警类型的趋势并针对告警趋势进行预判预测。
以下是目前常见的煤矿安全生产过程中需要检测的算法:
告警分类 算法
人员违规及异常行为 人员违规穿越皮带,人员脱岗行为,人员在岗睡觉,规范佩戴安全帽,
规范穿戴反光衣,打电话,吸烟,人员聚集,固定场所巡检行为
主运输系统隐患管理 皮带大块煤检测,皮带异物检测,皮带跑偏检测,皮带空载
皮带煤量识别,烟火检测,高温检测,火焰检测,吸烟检测
破碎站人员报警,人员接近仓口预警
车辆运输异常行为识别 人员下车检测,超时停车检测
软件架构设计
一、应用与服务层
该层位于架构的最顶端,直接与用户和业务需求对接。它包括以下关键组件:
- 视频结构化:在视频结构化过程中,通过RTSP等协议传输的视频流可以被接入到处理系统中。处理系统会对这些视频流进行解码、去噪、稳定处理等预处理操作,然后,利用算法对预处理后的视频流进行特征提取和对象识别等处理,从而提取出视频中的关键信息,以便于后续的应用和分析。
- 业务模块:如“人员违规行为”、“车辆结构化”、“火点烟雾检测”等,这些模块实现了具体的业务逻辑和功能需求。
- 算法模型与特征提取:负责处理和分析数据,提取有用信息,并应用算法模型进行预测和决策。
- 态势预测:通过态势预测,基于当前和历史数据,对未来一段时间内的发展趋势进行预估,从而为决策制定提供科学依据,及时发现并预警潜在的风险和问题,使相关人员能够提前采取措施进行防范,从而降低损失。
二、模型与数据处理层
该层位于应用与服务层之下,专注于算法模型的部署、数据处理和特征提取。它包括:
- BMC引擎与BMCV Engine:专为特定业务场景设计的算法引擎,提供高效的模型推理和数据处理能力。
- OpenCV与FFmpeg:开源的计算机视觉和多媒体处理库,用于图像和视频的处理与分析。
三、基础架构与资源管理层
该层位于模型与数据处理层之下,负责提供基础架构支持和资源管理服务。它包括:
- Docker容器:用于封装和部署算法模型,提高模型的可移植性和可扩展性。通过Docker,可以轻松地在不同环境中部署和运行模型。
- K8S:作为容器编排系统,Kubernetes负责管理和调度容器化应用,提供自动化部署、扩展、管理和运行容器化应用程序的能力。
- 操作系统内核(Kernel):操作系统的核心部分,负责管理硬件资源、提供进程调度、内存管理等功能。
- 设备驱动程序(Device Drivers):与硬件设备通信的接口,使操作系统能够控制和管理这些设备。
- NGINX:高性能的HTTP和反向代理服务器,用于处理网络通信和负载均衡。
- BootLoader:引导加载程序,负责系统启动时加载操作系统内核。
- 数据库(MySQL):作为数据存储的核心,MySQL负责存储和管理系统所需的所有结构化数据,如区域信息,设备信息,算法信息,模型信息,告警信息等。
- Redis:高性能的键值存储数据库,用于缓存数据、热数据存储,灾难恢复和崩溃拉起业务。
各个模块业务松耦合
松耦合是一种软件设计原则,旨在降低系统组件之间的依赖关系,使系统更加可扩展和易维护(感兴趣的可以阅读 :你的代码是否按照高内聚、低耦合的原则来设计的?-CSDN博客)。其实从我们的业务需求上不难划分出各个模块来,我使用了服务化设计的思路:将应用拆分为多个独立的服务,每个服务负责特定的功能。这些服务通过轻量级的通信协议(如REST、gRPC)进行交互,而不依赖于彼此的具体实现。
因此我拆分为三个主要的服务: AI管理平台(Platform),算法后处理服务(AIEC)和算法处理服务(AIInterface),其中AIEC和AIInterface都是运行在嵌入式盒子或者服务器上的,这就要求AIEC和AIInterface适配不同的厂家硬件。
Platform:
平台的功能相对简单,主要是提供人机交互界面,操作人员登陆后对相机,算法,模型等资源进行配置和升级管理:
接收和查看算法告警信息
根据告警历史记录进行告警的态势预测:
AIEC:
AIEC实际上充当的是算法调度器的角色,由于它运行在arm嵌入式盒子或者服务器上,那么他就需要适配多种硬件厂商来满足不同场景下的业务需要。
考虑到适配不同硬件,并且要对算法调度,因此我们抽象化了硬件接口:
type IBaseDevice interface {
GetDeviceType() string //获取设备类型
Init() error //启动的时候初始化一些配置文件
StartAI() error //开启算法接口(必须初始化一些配置检查之类的)
StopAI() error //关闭算法接口
StatDeep() error //检查ai算法服务状态
GetDeepState() (bool, string, error)
ReloadAIProcess() error //重启ai算法服务
Terminal() error //关闭ai算法服务
Stop() error //暂停ai算法服务
}
对于不同的硬件比如华为,算能,英伟达只需要实现以上接口即可。
同样的,由于AIEC需要对算法服务的检测结果要进一步的分析推理,因此我们要对不同的算法进行抽象,实际上就只有一个接口方法DetectAnlysis(result *AIResultReq)而已,通过调用接口方法可以获取到AIInterface的检测结果,并根据不同的算法类型进行各自的推理分析。
比如离岗检测,需要统计某一个时间段内,目标区域是否有人员识别结果,一旦识别到人,则重置识别状态和结果,否则达到时间段的阈值则触发告警。
如何调度的简要说明:
我们通过RESTful接口接收来自Platform的相机和算法更新信息,处