刘传忠
摘要:基于人机协同的电气设备智能检测系统,是一个相对比较复杂的系统,为了能够快速验证在系统研发中关键技术的可行性,采用语法优雅功能强大的Python编程语言进行了原型验证。探讨了Python语言在后端接口实现、数据库中的数据存取、系统与设备即时通信,后台定时服务和与算法文件进行信息交互等方面的应用。实践证明采用Python开发语言,能够快速地开发原型系统,满足研发的需要。
关键词:Python;后端接口;设备通信;算法文件交互;原型验证
中图分类号:TP312 文献标识码:A
文章编号:1009-3044(2021)33-0017-03
开放科学(资源服务)标识码(OSID):
Application of Python in Prototype Implementation of Intelligent Detection System for Electrical Equipment
LIU Chuan-zhong1,2,3
(1.Shanghai Electrical Apparatus Research Institute (Group) Co.,Ltd., Shanghai 200063, China; 2.Shanghai Key Laboratory of Smart Grid Demand Response, Shanghai 200063, China; 3.Research and Development (Experiment) Center of Electrical Equipment for National Energy Smart Grid User Side, Shanghai 200063, China)
Abstract: The intelligent detection system of electrical equipment based on man-machine cooperation is a relatively complex system. In order to quickly verify the feasibility of key technologies in system development, the prototype verification is carried out by using Python which has elegant syntax and powerful function. This paper discusses the application of Python in the implementation of back-end interface, data access in database, instant communication between system and equipment, background scheduler service and information interaction with algorithm files. Practice has proved that using Python can quickly develop the prototype system and meet the needs of research and development.
Key words: Python; back-end interface; instant communication; interaction with algorithm files; prototype verification
1 背景
隨着IT信息、物联网、云计算等技术的快速发展和中国制造2025制造强国战略的全面推进,用户端电气设备的应用与日俱增,相应的产品质量和使用安全问题也不容忽视。目前用户端电气设备生产制造环节的检验手段和工具的智能化在我国仍处于相对初级阶段,不能完全满足产业快速发展的需要。将机器学习、机器视觉、云计算、物联网等技术应用于用户端电器设备检测系统,解决产品检测环节生产效率较低、质量无法严格保证的问题势在必行。为了快速构建智能电气设备检测系统,验证相关技术的可行性,本课题选用有语法优雅、功能强大的Python作为主要编程语言进行原型开发验证。
2 原型系统
如图1所示,电气设备智能检测原型系统由视觉检测器、算法训练服务器和Web服务器(包含数据库)三部分组成。
视觉检测器由摄像头、触摸屏和人机控制界面组成,一般部署于产品检测生产线,当待检测的产品通过检测器摄像头所对应的工位时,检测器利用在训练服务器上训练好的算法对摄像头按一定的规则所拍摄的产品图片进行智能判定。
训练服务器采用Ubuntu 20.04系统,由训练集、算法库、模型库、后台服务和接口服务组成,主要用来对算法进行训练。训练服务器搭建Samba服务器[1],允许视觉检测器进行磁盘映射,进行算法文件的获取或照片检测结果的上传等。训练集的图片及标注信息由视觉检测器定时上传得到。算法库由专门的算法工程师开发调试后部署,可在本地直接启动,也可以在Web页面上操作通过接口服务进行启动。模型库存放算法训练成功后的模型文件,同时相关信息会被更新到MySQL数据库中。后台服务会定时获取训练服务器的CPU和内存使用情况,并将相关信息更新到MySQL数据库中。接口服务提供启动算法训练的Web API接口,供Web服务器上的前端页面进行调用。
在原型系统中,Web服务器采用Windows 10专业版,由MySQL数据库、MQTT代理服务器、后台服务、Web API接口服务和前端页面组成,主要用来提供人机交互界面对视觉检测器、训练集、算法、模型等信息进行管理。MySQL数据库采用社区版8.0.19,主要用来存储用户角色权限信息、检测器信息、算法信息、模型训练信息和系统参数等。MQTT代理服务器我们采用开源消息代理软件Mosquitto 2.0.0以服务的方式在后台运行,开启了密码验证和日志功能,可在mosquitto.conf配置文件中进行修改配置,它支持可发布/可订阅的消息推送模式,视觉检测器和后台服务均可以作为客户端发布/订阅相关的主题进行实时信息交互。后台服务程序常驻内存,通过订阅相关的主题,实现对视觉检测器状态汇报数据的实时侦听并及时将状态信息保存到数据库供前端界面读取显示。人机交互功能通过前后端分离的方式进行开发,前端页面采用阿里开源的基于React的前端开发脚手架Ant Design Pro[2],后端接口采用基于微型的 Python web开发框架Flask。
3 Python應用
3.1 Python简介
Python 是一种易于学习使用又功能强大的开源免费跨平台的编程语言,它提供了高效的高级数据结构,还支持简单有效的面向对象编程。优雅的语法,动态类型,交互式的开发环境,以及解释型语言的本质,使得它成为多数平台上写脚本和快速开发应用的理想语言[3],目前Python已被广泛应用自动化测试与运维、网络爬虫、数据分析与可视化等领域。
Python具有自动内存管理,支持多种基本数据类型和数据结构,支持面向对象编程和异常捕捉,它提供了强大的标准库且支持扩展,有很多第三方的模块(modules)/包(packages)可以使用,如在科学计算中常用到的[4]数值计算扩展包NumPy(Numeric Python),数据符号计算库SymPy(Symbolic mathematics with Python),面向对象的绘图库Matplotlib,以及本课题中用到的微型的Web 框架-Flask,消息队列遥测传输(MQTT)的Python客户端paho-mqtt,任务调度工具APScheduler等。
简单来说Python安装后,运行和开发基本可以分为三种方式:交互式解释器、命令行脚本和集成开发环境。为了方便和灵活,本课题采用Anaconda安装Python开发环境,以VSCode作为集成开发环境[5]。
3.2 后端接口与数据存取
在本课题中,Web API后台接口部分我们采用开源的轻量级Web应用程序框架-Flask,它实现的核心简单且具有良好的扩展性,既可以开发MVC网络程序,也可以提供具有Restful风格的Web API。虽然该框架没有提供对ORM(Object Ralational Mapping,对象关系映射)的支持把对象模型表示的对象映射到基于SQL的关系模型数据库结构中去,但我们可以采用Flask扩展Flask-SQLAlchemy实现对Mysql数据库的增删改查操作[6]。
在使用框架的过程中,可以使用route()装饰器来把函数绑定到URL,通过把 URL的一部分标记为
@app.route('/api/v1.0/products/
def getProductEntityById(pid):
表示函数getProductEntityById支持HTTP的GET方法,可以使用的参数为int型,变量名称为pid,当客户端请求http://192.168.11.124:6688/api/v1.0/2时会调用函数getProductEntityById(2),在此处假定接口服务器所在的IP地址为192.168.11.124,Flask应用运行时使用的端口为6688。
3.3 即时通信
在本课题中,为了使视觉检测器和后台服务保持实时通信,采用了构建于TCP/IP协议之上基于发布/订阅(publish/subscribe)模式的“轻量级”通讯协议-MQTT(Message Queuing Telemetry Transport,消息队列遥测传输协议)协议[7]。在通讯过程中,MQTT协议中有三种身份:发布者(Publish)、代理(Broker)(服务器)、订阅者(Subscribe)。其中,消息的发布者和订阅者都是客户端,消息代理是服务器,消息发布者可以同时是订阅者。
视觉检测器和训练服务器软件均作为Client,经过MQTT Broker代理服务器通过主题(Topic)发布或订阅的方式进行发送数据或接收数据。在本项目中我们设计了由Web后台服务发起视觉检测器订阅和由视觉检测器发起Web后台服务订阅的两类共6个主题,分别是检测器状态查询(TrainMachine2Detector/DetectorStatus/Inq)、配置检测器参数(TrainMachine2Detector/DetectorPara/Set)、读取检测器参数(TrainMachine2Detector/DetectorPara/Get)和注册通知(Detector2TrainMachine/RegDetectorinfor/Notify)、检测器状态上报(Detector2TrainMachine/DetectorStatus/Resp)、检测器参数上传(Detector2TrainMachine/DetectorPara/Resp)。报文传输的主要内容定义在有效载荷(payload)中,如读取检测器参数时需要知道是要查询哪个视觉检测器,我们定义的其有效载荷采用JSON格式,其示例为:{"ClientID": "DEV-HA202012-0001"}。
在本课题中我们使用paho-mqtt编写设计MQTT客户端,它是Eclipse基金会开源项目paho的Python MQTT客户端库,实现了物联网MQTT协议的 5.0和3.1。该包提供了全功能的客户端(Client)模块和简化版的消息(publishing)模块,方便我们连接MQTT代理服务器,实现对主题的发布和订阅[8]。下面的代码展示了我们通过用户名和密码登录MQTT代理服务器,并为连接、收到消息、订阅、连接断开等事件指定了回掉函数,我们可以在回掉函数中针对相关信息进行处理,如收到订阅的主题后将相关内容进行解析并存储数据库中。
try:
client = mqtt.Client(ClientID)
client.username_pw_set(ClientUser, ClientPwd)
client.on_connect = on_connect
client.on_message = on_message
client.on_subscribe = on_subscribe
client.on_disconnect = on_disconnect
client.connect(MqttBroker, Mqttport, 60)
client.loop_forever()
except Exception as e:
print(e)
3.4 定时服务
在本课题中,需要在后台定时查询训练服务器的CPU和内存使用情况、磁盘剩余空间等,我们采用了Python第三方库APScheduler来实现该功能。APscheduler全称Advanced Python Scheduler,作用为在指定的时间规则执行指定的作业。指定时间规则的方式可以是间隔多久执行,可以是指定延迟一定日期时间的单次执行,也可以类似Linux系统中Cron风格方式执行任务[9]。如下的代码展示了我们封装了一个启动后台任务的函数,该后台任务为一个。
def StartBackgroundService():
print("StartBackgroundService")
scheduler = BlockingScheduler()
scheduler.add_job(JobShowHardDiskInf, trigger='interval', minutes=1, id='JobShowHardDiskInfId1')
scheduler.start()
print("StartBackgroundService OK")
阻塞式的独占式后台任务,每隔1分钟触发1次,执行的任务为JobShowHardDiskInf(该函数执行查询磁盘信息并将相关信息更新到数据库对应的表中,限于篇幅,此处未予展示)。
3.5 算法交互
在本课题中,由于算法文件是由算法工程师编写的,跟Web展示交互实施团队分属不同的项目,人机交互模块与算法文件之间的信息交互是一个需要解决的问题。由于算法文件也是由Python实现的,人机交互模块通过python的subprocess 模块的Popen() 方法来调用算法文件,如subprocess.Popen(mycmd, shell=True),其中mycmd由函数getStartTrainingCmdStr根据相关信息拼接字符串而成,参数拼接函数的实现如下:
def getStartTrainingCmdStr(mtid,product,algfile,epochs,batchsize):
strCmd = "python "
strCmd += algfile
strCmd += " --mtprogressid '"
strCmd += mtid
strCmd += "' --productmodel '"
strCmd += product
strCmd +="' --epochs "
strCmd += str(epochs)
strCmd += " --batch-size "
strCmd += str(batchsize)
print(strCmd)
return strCmd
对于训练模型ID为“MTDemo20210808”,产品型号名称为“DemoProductModel”,算法文件为“train.py”,epochs为400,batchsize为4的启动训练的参数串mycmd为“python train.py --meprogressid ‘MTDemo20210808 --productmodel ‘DemoProductModel --epochs 400 --batch-size 4”。在算法文件中,通过argparse可以对命令行传入的参数进行解析,如下面的代码:
if __name__ == '__main__':
parser = argparse.ArgumentParser()
parser.add_argument('--productmodel', type=str, default='motor1', help='id')
可以从输入的参数中提取到刚才传入的产品模型信息为“DemoProductModel”,从而实现了算法调用方向算法文件传入的相关信息。至于算法文件向人机交互模块输出相关信息,则可以将相关的信息按需插入或更新数据库中的相关记录即可,此处不再赘述。
4 结束语
本课题采用前端界面Ant Design Pro脚手架,后端采用Python的Flask框架及MQTT客户端paho-mqtt,任务调度工具APScheduler等第三方软件包及Python自带的subprocess模块等,实现了后端接口与数据存储、视觉检测器与Web人机交互界面实时通信,后台定时服务和算法交互等技术验证,实现了对视觉检测器的注册信息、状态信息和配置信息的管理;对训练集、算法模型的启动与信息管理等功能。图2所示为视觉检测器的注册信息管理页面,该页面前端定时刷新读取数据库的相关信息,当有新的视觉检测器注册进来的时候,在该页面列表中能够自动添加新注册的视觉检测器的相关信息。
实践证明,开源且功能强大的Python能够实现电气设备智能检测系统原型的搭建与相关技术验证。本课题的研究为从事相关工作的同行提供一定的参考价值。
参考文献:
[1] 赵大伟,陈刚.Linux环境下Samba服务器的企业级应用[J].电脑知识与技术,2017,13(32):50-52.
[2] 吕晨.基于机器学习的流量分类平台的研究与实现[D].西安:西安电子科技大学,2020.
[3]Python软件基金会.Python教程[EB/OL].[2020-12-20].https://docs.python.org/zh-cn/3/tutorial/index.html.
[4] 姚建盛,李淑梅.Python在科学计算中的应用[J].数字技术与应用,2016(11):76.
[5] 李天辉.基于python的数据分析可视化研究与实现[J].电子测试,2020(20):78-79.
[6] 吴桐.基于Flask框架的物资管理系统的设计与实现[D].南京:南京大学,2016.
[7] 林浒,张家铭,杨海波.基于MQTT协议的即时消息业务设计与实现[J].计算机系统应用,2017,26(3):219-224.
[8] Python软件基金会.项目描述[EB/OL]. [2020-12-20].https://pypi.org/project/paho-mqtt/#description.
[9] 李丹.自動化测试在线管理系统的设计与实现[D].成都:西南交通大学,2017.
【通联编辑:谢媛媛】