劉傳忠
摘要:基于人機協(xié)同的電氣設(shè)備智能檢測系統(tǒng),是一個相對比較復(fù)雜的系統(tǒng),為了能夠快速驗證在系統(tǒng)研發(fā)中關(guān)鍵技術(shù)的可行性,采用語法優(yōu)雅功能強大的Python編程語言進行了原型驗證。探討了Python語言在后端接口實現(xiàn)、數(shù)據(jù)庫中的數(shù)據(jù)存取、系統(tǒng)與設(shè)備即時通信,后臺定時服務(wù)和與算法文件進行信息交互等方面的應(yīng)用。實踐證明采用Python開發(fā)語言,能夠快速地開發(fā)原型系統(tǒng),滿足研發(fā)的需要。
關(guān)鍵詞:Python;后端接口;設(shè)備通信;算法文件交互;原型驗證
中圖分類號:TP312? ? ? 文獻(xiàn)標(biāo)識碼:A
文章編號:1009-3044(2021)33-0017-03
開放科學(xué)(資源服務(wù))標(biāo)識碼(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信息、物聯(lián)網(wǎng)、云計算等技術(shù)的快速發(fā)展和中國制造2025制造強國戰(zhàn)略的全面推進,用戶端電氣設(shè)備的應(yīng)用與日俱增,相應(yīng)的產(chǎn)品質(zhì)量和使用安全問題也不容忽視。目前用戶端電氣設(shè)備生產(chǎn)制造環(huán)節(jié)的檢驗手段和工具的智能化在我國仍處于相對初級階段,不能完全滿足產(chǎn)業(yè)快速發(fā)展的需要。將機器學(xué)習(xí)、機器視覺、云計算、物聯(lián)網(wǎng)等技術(shù)應(yīng)用于用戶端電器設(shè)備檢測系統(tǒng),解決產(chǎn)品檢測環(huán)節(jié)生產(chǎn)效率較低、質(zhì)量無法嚴(yán)格保證的問題勢在必行。為了快速構(gòu)建智能電氣設(shè)備檢測系統(tǒng),驗證相關(guān)技術(shù)的可行性,本課題選用有語法優(yōu)雅、功能強大的Python作為主要編程語言進行原型開發(fā)驗證。
2 原型系統(tǒng)
如圖1所示,電氣設(shè)備智能檢測原型系統(tǒng)由視覺檢測器、算法訓(xùn)練服務(wù)器和Web服務(wù)器(包含數(shù)據(jù)庫)三部分組成。
視覺檢測器由攝像頭、觸摸屏和人機控制界面組成,一般部署于產(chǎn)品檢測生產(chǎn)線,當(dāng)待檢測的產(chǎn)品通過檢測器攝像頭所對應(yīng)的工位時,檢測器利用在訓(xùn)練服務(wù)器上訓(xùn)練好的算法對攝像頭按一定的規(guī)則所拍攝的產(chǎn)品圖片進行智能判定。
訓(xùn)練服務(wù)器采用Ubuntu 20.04系統(tǒng),由訓(xùn)練集、算法庫、模型庫、后臺服務(wù)和接口服務(wù)組成,主要用來對算法進行訓(xùn)練。訓(xùn)練服務(wù)器搭建Samba服務(wù)器[1],允許視覺檢測器進行磁盤映射,進行算法文件的獲取或照片檢測結(jié)果的上傳等。訓(xùn)練集的圖片及標(biāo)注信息由視覺檢測器定時上傳得到。算法庫由專門的算法工程師開發(fā)調(diào)試后部署,可在本地直接啟動,也可以在Web頁面上操作通過接口服務(wù)進行啟動。模型庫存放算法訓(xùn)練成功后的模型文件,同時相關(guān)信息會被更新到MySQL數(shù)據(jù)庫中。后臺服務(wù)會定時獲取訓(xùn)練服務(wù)器的CPU和內(nèi)存使用情況,并將相關(guān)信息更新到MySQL數(shù)據(jù)庫中。接口服務(wù)提供啟動算法訓(xùn)練的Web API接口,供Web服務(wù)器上的前端頁面進行調(diào)用。
在原型系統(tǒng)中,Web服務(wù)器采用Windows 10專業(yè)版,由MySQL數(shù)據(jù)庫、MQTT代理服務(wù)器、后臺服務(wù)、Web API接口服務(wù)和前端頁面組成,主要用來提供人機交互界面對視覺檢測器、訓(xùn)練集、算法、模型等信息進行管理。MySQL數(shù)據(jù)庫采用社區(qū)版8.0.19,主要用來存儲用戶角色權(quán)限信息、檢測器信息、算法信息、模型訓(xùn)練信息和系統(tǒng)參數(shù)等。MQTT代理服務(wù)器我們采用開源消息代理軟件Mosquitto 2.0.0以服務(wù)的方式在后臺運行,開啟了密碼驗證和日志功能,可在mosquitto.conf配置文件中進行修改配置,它支持可發(fā)布/可訂閱的消息推送模式,視覺檢測器和后臺服務(wù)均可以作為客戶端發(fā)布/訂閱相關(guān)的主題進行實時信息交互。后臺服務(wù)程序常駐內(nèi)存,通過訂閱相關(guān)的主題,實現(xiàn)對視覺檢測器狀態(tài)匯報數(shù)據(jù)的實時偵聽并及時將狀態(tài)信息保存到數(shù)據(jù)庫供前端界面讀取顯示。人機交互功能通過前后端分離的方式進行開發(fā),前端頁面采用阿里開源的基于React的前端開發(fā)腳手架Ant Design Pro[2],后端接口采用基于微型的 Python web開發(fā)框架Flask。
3 Python應(yīng)用
3.1 Python簡介
Python 是一種易于學(xué)習(xí)使用又功能強大的開源免費跨平臺的編程語言,它提供了高效的高級數(shù)據(jù)結(jié)構(gòu),還支持簡單有效的面向?qū)ο缶幊?。?yōu)雅的語法,動態(tài)類型,交互式的開發(fā)環(huán)境,以及解釋型語言的本質(zhì),使得它成為多數(shù)平臺上寫腳本和快速開發(fā)應(yīng)用的理想語言[3],目前Python已被廣泛應(yīng)用自動化測試與運維、網(wǎng)絡(luò)爬蟲、數(shù)據(jù)分析與可視化等領(lǐng)域。
Python具有自動內(nèi)存管理,支持多種基本數(shù)據(jù)類型和數(shù)據(jù)結(jié)構(gòu),支持面向?qū)ο缶幊毯彤惓2蹲剑峁┝藦姶蟮臉?biāo)準(zhǔn)庫且支持?jǐn)U展,有很多第三方的模塊(modules)/包(packages)可以使用,如在科學(xué)計算中常用到的[4]數(shù)值計算擴展包NumPy(Numeric Python),數(shù)據(jù)符號計算庫SymPy(Symbolic mathematics with Python),面向?qū)ο蟮睦L圖庫Matplotlib,以及本課題中用到的微型的Web 框架-Flask,消息隊列遙測傳輸(MQTT)的Python客戶端paho-mqtt,任務(wù)調(diào)度工具APScheduler等。
簡單來說Python安裝后,運行和開發(fā)基本可以分為三種方式:交互式解釋器、命令行腳本和集成開發(fā)環(huán)境。為了方便和靈活,本課題采用Anaconda安裝Python開發(fā)環(huán)境,以VSCode作為集成開發(fā)環(huán)境[5]。
3.2 后端接口與數(shù)據(jù)存取
在本課題中,Web API后臺接口部分我們采用開源的輕量級Web應(yīng)用程序框架-Flask,它實現(xiàn)的核心簡單且具有良好的擴展性,既可以開發(fā)MVC網(wǎng)絡(luò)程序,也可以提供具有Restful風(fēng)格的Web API。雖然該框架沒有提供對ORM(Object Ralational Mapping,對象關(guān)系映射)的支持把對象模型表示的對象映射到基于SQL的關(guān)系模型數(shù)據(jù)庫結(jié)構(gòu)中去,但我們可以采用Flask擴展Flask-SQLAlchemy實現(xiàn)對Mysql數(shù)據(jù)庫的增刪改查操作[6]。
在使用框架的過程中,可以使用route()裝飾器來把函數(shù)綁定到URL,通過把 URL的一部分標(biāo)記為
@app.route('/api/v1.0/products/
def getProductEntityById(pid):
表示函數(shù)getProductEntityById支持HTTP的GET方法,可以使用的參數(shù)為int型,變量名稱為pid,當(dāng)客戶端請求http://192.168.11.124:6688/api/v1.0/2時會調(diào)用函數(shù)getProductEntityById(2),在此處假定接口服務(wù)器所在的IP地址為192.168.11.124,F(xiàn)lask應(yīng)用運行時使用的端口為6688。
3.3 即時通信
在本課題中,為了使視覺檢測器和后臺服務(wù)保持實時通信,采用了構(gòu)建于TCP/IP協(xié)議之上基于發(fā)布/訂閱(publish/subscribe)模式的“輕量級”通訊協(xié)議-MQTT(Message Queuing Telemetry Transport,消息隊列遙測傳輸協(xié)議)協(xié)議[7]。在通訊過程中,MQTT協(xié)議中有三種身份:發(fā)布者(Publish)、代理(Broker)(服務(wù)器)、訂閱者(Subscribe)。其中,消息的發(fā)布者和訂閱者都是客戶端,消息代理是服務(wù)器,消息發(fā)布者可以同時是訂閱者。
視覺檢測器和訓(xùn)練服務(wù)器軟件均作為Client,經(jīng)過MQTT Broker代理服務(wù)器通過主題(Topic)發(fā)布或訂閱的方式進行發(fā)送數(shù)據(jù)或接收數(shù)據(jù)。在本項目中我們設(shè)計了由Web后臺服務(wù)發(fā)起視覺檢測器訂閱和由視覺檢測器發(fā)起Web后臺服務(wù)訂閱的兩類共6個主題,分別是檢測器狀態(tài)查詢(TrainMachine2Detector/DetectorStatus/Inq)、配置檢測器參數(shù)(TrainMachine2Detector/DetectorPara/Set)、讀取檢測器參數(shù)(TrainMachine2Detector/DetectorPara/Get)和注冊通知(Detector2TrainMachine/RegDetectorinfor/Notify)、檢測器狀態(tài)上報(Detector2TrainMachine/DetectorStatus/Resp)、檢測器參數(shù)上傳(Detector2TrainMachine/DetectorPara/Resp)。報文傳輸?shù)闹饕獌?nèi)容定義在有效載荷(payload)中,如讀取檢測器參數(shù)時需要知道是要查詢哪個視覺檢測器,我們定義的其有效載荷采用JSON格式,其示例為:{"ClientID": "DEV-HA202012-0001"}。
在本課題中我們使用paho-mqtt編寫設(shè)計MQTT客戶端,它是Eclipse基金會開源項目paho的Python MQTT客戶端庫,實現(xiàn)了物聯(lián)網(wǎng)MQTT協(xié)議的 5.0和3.1。該包提供了全功能的客戶端(Client)模塊和簡化版的消息(publishing)模塊,方便我們連接MQTT代理服務(wù)器,實現(xiàn)對主題的發(fā)布和訂閱[8]。下面的代碼展示了我們通過用戶名和密碼登錄MQTT代理服務(wù)器,并為連接、收到消息、訂閱、連接斷開等事件指定了回掉函數(shù),我們可以在回掉函數(shù)中針對相關(guān)信息進行處理,如收到訂閱的主題后將相關(guān)內(nèi)容進行解析并存儲數(shù)據(jù)庫中。
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 定時服務(wù)
在本課題中,需要在后臺定時查詢訓(xùn)練服務(wù)器的CPU和內(nèi)存使用情況、磁盤剩余空間等,我們采用了Python第三方庫APScheduler來實現(xiàn)該功能。APscheduler全稱Advanced Python Scheduler,作用為在指定的時間規(guī)則執(zhí)行指定的作業(yè)。指定時間規(guī)則的方式可以是間隔多久執(zhí)行,可以是指定延遲一定日期時間的單次執(zhí)行,也可以類似Linux系統(tǒng)中Cron風(fēng)格方式執(zhí)行任務(wù)[9]。如下的代碼展示了我們封裝了一個啟動后臺任務(wù)的函數(shù),該后臺任務(wù)為一個。
def StartBackgroundService():
print("StartBackgroundService")
scheduler = BlockingScheduler()
scheduler.add_job(JobShowHardDiskInf, trigger='interval', minutes=1, id='JobShowHardDiskInfId1')
scheduler.start()
print("StartBackgroundService OK")
阻塞式的獨占式后臺任務(wù),每隔1分鐘觸發(fā)1次,執(zhí)行的任務(wù)為JobShowHardDiskInf(該函數(shù)執(zhí)行查詢磁盤信息并將相關(guān)信息更新到數(shù)據(jù)庫對應(yīng)的表中,限于篇幅,此處未予展示)。
3.5 算法交互
在本課題中,由于算法文件是由算法工程師編寫的,跟Web展示交互實施團隊分屬不同的項目,人機交互模塊與算法文件之間的信息交互是一個需要解決的問題。由于算法文件也是由Python實現(xiàn)的,人機交互模塊通過python的subprocess 模塊的Popen() 方法來調(diào)用算法文件,如subprocess.Popen(mycmd, shell=True),其中mycmd由函數(shù)getStartTrainingCmdStr根據(jù)相關(guān)信息拼接字符串而成,參數(shù)拼接函數(shù)的實現(xiàn)如下:
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
對于訓(xùn)練模型ID為“MTDemo20210808”,產(chǎn)品型號名稱為“DemoProductModel”,算法文件為“train.py”,epochs為400,batchsize為4的啟動訓(xùn)練的參數(shù)串mycmd為“python train.py --meprogressid ‘MTDemo20210808 --productmodel ‘DemoProductModel --epochs 400 --batch-size 4”。在算法文件中,通過argparse可以對命令行傳入的參數(shù)進行解析,如下面的代碼:
if __name__ == '__main__':
parser = argparse.ArgumentParser()
parser.add_argument('--productmodel', type=str, default='motor1', help='id')
可以從輸入的參數(shù)中提取到剛才傳入的產(chǎn)品模型信息為“DemoProductModel”,從而實現(xiàn)了算法調(diào)用方向算法文件傳入的相關(guān)信息。至于算法文件向人機交互模塊輸出相關(guān)信息,則可以將相關(guān)的信息按需插入或更新數(shù)據(jù)庫中的相關(guān)記錄即可,此處不再贅述。
4 結(jié)束語
本課題采用前端界面Ant Design Pro腳手架,后端采用Python的Flask框架及MQTT客戶端paho-mqtt,任務(wù)調(diào)度工具APScheduler等第三方軟件包及Python自帶的subprocess模塊等,實現(xiàn)了后端接口與數(shù)據(jù)存儲、視覺檢測器與Web人機交互界面實時通信,后臺定時服務(wù)和算法交互等技術(shù)驗證,實現(xiàn)了對視覺檢測器的注冊信息、狀態(tài)信息和配置信息的管理;對訓(xùn)練集、算法模型的啟動與信息管理等功能。圖2所示為視覺檢測器的注冊信息管理頁面,該頁面前端定時刷新讀取數(shù)據(jù)庫的相關(guān)信息,當(dāng)有新的視覺檢測器注冊進來的時候,在該頁面列表中能夠自動添加新注冊的視覺檢測器的相關(guān)信息。
實踐證明,開源且功能強大的Python能夠?qū)崿F(xiàn)電氣設(shè)備智能檢測系統(tǒng)原型的搭建與相關(guān)技術(shù)驗證。本課題的研究為從事相關(guān)工作的同行提供一定的參考價值。
參考文獻(xiàn):
[1] 趙大偉,陳剛.Linux環(huán)境下Samba服務(wù)器的企業(yè)級應(yīng)用[J].電腦知識與技術(shù),2017,13(32):50-52.
[2] 呂晨.基于機器學(xué)習(xí)的流量分類平臺的研究與實現(xiàn)[D].西安:西安電子科技大學(xué),2020.
[3]Python軟件基金會.Python教程[EB/OL].[2020-12-20].https://docs.python.org/zh-cn/3/tutorial/index.html.
[4] 姚建盛,李淑梅.Python在科學(xué)計算中的應(yīng)用[J].數(shù)字技術(shù)與應(yīng)用,2016(11):76.
[5] 李天輝.基于python的數(shù)據(jù)分析可視化研究與實現(xiàn)[J].電子測試,2020(20):78-79.
[6] 吳桐.基于Flask框架的物資管理系統(tǒng)的設(shè)計與實現(xiàn)[D].南京:南京大學(xué),2016.
[7] 林滸,張家銘,楊海波.基于MQTT協(xié)議的即時消息業(yè)務(wù)設(shè)計與實現(xiàn)[J].計算機系統(tǒng)應(yīng)用,2017,26(3):219-224.
[8] Python軟件基金會.項目描述[EB/OL]. [2020-12-20].https://pypi.org/project/paho-mqtt/#description.
[9] 李丹.自動化測試在線管理系統(tǒng)的設(shè)計與實現(xiàn)[D].成都:西南交通大學(xué),2017.
【通聯(lián)編輯:謝媛媛】