許永全,馮玉田
(上海大學(xué) 通信與信息工程學(xué)院,上海 200444)
機(jī)器視覺(jué)正迅速成為工業(yè)4.0智能工廠基礎(chǔ)設(shè)施的重要組成部分,是制造和質(zhì)量控制的關(guān)鍵技術(shù),在制造業(yè)的檢測(cè)、測(cè)量、掃描和物體檢測(cè)中展示了其成本效益,以提高一致性、生產(chǎn)力和整體質(zhì)量[1]。工業(yè)化進(jìn)程已經(jīng)走到了一個(gè)關(guān)鍵的轉(zhuǎn)折點(diǎn),正從模仿加改進(jìn)的開(kāi)發(fā)模式向創(chuàng)新和創(chuàng)造的階段轉(zhuǎn)變,使用機(jī)器學(xué)習(xí)來(lái)增強(qiáng)機(jī)器視覺(jué)系統(tǒng),使其能夠快速適應(yīng)并融入所部署的系統(tǒng)中,是應(yīng)對(duì)復(fù)雜應(yīng)用的一個(gè)正確的解決方案[2]。隨著3D機(jī)器視覺(jué)系統(tǒng)的快速發(fā)展,對(duì)機(jī)器學(xué)習(xí)算法提出了越來(lái)越多的要求,同時(shí)也加速了算法迭代的速度,甚至提出隨著外部應(yīng)用的變換,需要在多種算法間頻繁切換,這些需求的實(shí)現(xiàn)加速機(jī)器學(xué)習(xí)解決方案在更廣泛的領(lǐng)域應(yīng)用。
文中設(shè)計(jì)了一個(gè)基于FPGA的機(jī)器學(xué)習(xí)多重加載和動(dòng)態(tài)部署系統(tǒng),主要面向工業(yè)應(yīng)用的實(shí)用性軟硬件設(shè)計(jì)方案,充分發(fā)揮FPGA的硬件優(yōu)勢(shì),彌補(bǔ)FPGA開(kāi)發(fā)過(guò)程復(fù)雜,對(duì)工程人員要求高的缺陷[3]。
該系統(tǒng)的機(jī)器學(xué)習(xí)算法采用卷積神經(jīng)網(wǎng)絡(luò)為核心的深度學(xué)習(xí)算法,并采用SOC技術(shù)降低了算法實(shí)現(xiàn)和軟件開(kāi)發(fā)的難度,同時(shí)將并行處理和串行控制集成到一個(gè)平臺(tái)上,提高了工業(yè)化設(shè)備的適用度[4]。另外系統(tǒng)實(shí)現(xiàn)了多重加載機(jī)器學(xué)習(xí)算法的功能,使設(shè)備具備應(yīng)對(duì)多種應(yīng)用場(chǎng)景的能力,同時(shí)系統(tǒng)能夠通過(guò)網(wǎng)絡(luò)實(shí)現(xiàn)機(jī)器學(xué)習(xí)算法的動(dòng)態(tài)部署和多重預(yù)加載,提高了設(shè)備的通用性和可維護(hù)性。
硬件系統(tǒng)主要包括電源時(shí)序板、FPGA處理器和CMOS傳感器三部分,電源板和處理器采用排插連接,CMOS傳感器與FPGA處理器之間采用LVDS標(biāo)準(zhǔn)接口[5],并用定制的柔性軟板連接。圖1是系統(tǒng)核心硬件電路板框圖。系統(tǒng)的特點(diǎn)是體積小,處理能力強(qiáng),適合嵌入到對(duì)設(shè)備要求苛刻的各種工業(yè)設(shè)備內(nèi),比如工業(yè)機(jī)器人引導(dǎo)、流水線產(chǎn)品多維度掃描檢測(cè)等[6]。
電源時(shí)序板為整個(gè)系統(tǒng)提供電源,輸入為DC24V標(biāo)準(zhǔn)電源電壓,通過(guò)STM32單片機(jī)產(chǎn)生時(shí)序控制信號(hào),同時(shí)芯片會(huì)監(jiān)測(cè)所有的電源電壓,保障硬件模塊電源的正常工作。設(shè)備的各種異常信號(hào),芯片也會(huì)根據(jù)設(shè)定自動(dòng)處理,并報(bào)告狀態(tài)信息,保障系統(tǒng)安全可靠的運(yùn)行[7],F(xiàn)PGA處理器板的主要功能模塊如圖1所示。系統(tǒng)采用Xilinx公司的Artix-7系列的xc7a200tfbg676芯片,此芯片是Artix-7功能比較強(qiáng)大的一款芯片,擁有134 600個(gè)LUT、740個(gè)DSP乘法器和365個(gè)Block RAM內(nèi)存單元,非常適合進(jìn)行大量浮點(diǎn)運(yùn)算的設(shè)計(jì)。板載4 GB的DDR3,保障了設(shè)備運(yùn)行流暢性[8],同時(shí)搭載MICRON公司的256 Mb的NOR flash為系統(tǒng)提供了足夠的程序存儲(chǔ)空間。
圖1 硬件系統(tǒng)核心電路板
FPGA與外界的通信主要通過(guò)兩種方式,TTL232低速串口用于調(diào)試設(shè)備,千兆網(wǎng)絡(luò)接口用于數(shù)據(jù)的傳輸,保障了從模塊調(diào)試到產(chǎn)品部署的通信傳輸。此外電路板還包含了伺服電機(jī)運(yùn)動(dòng)控制接口、連續(xù)激光亮度控制接口,以及為保密而專門設(shè)計(jì)的DS加密芯片。整個(gè)系統(tǒng)主控部分和電源部分的長(zhǎng)寬高分別為100 mm、40 mm和15 mm,CMOS傳感器電路板的長(zhǎng)寬高分別為40 mm、40 mm和5 mm,版面面積和一般的工業(yè)相機(jī)的鏡頭截面大小類似[9]。
硬件部分的設(shè)計(jì)理念是嵌入到各種特殊設(shè)備的工業(yè)應(yīng)用,因此體積小、處理能力強(qiáng)、功能靈活等特點(diǎn)是這個(gè)系統(tǒng)的基本要求。例如工業(yè)機(jī)器人3D引導(dǎo)應(yīng)用領(lǐng)域,首先需要使用電機(jī)控制激光掃描,同時(shí)高速的CMOS傳感器采集實(shí)時(shí)圖像,F(xiàn)PGA對(duì)采集的圖像實(shí)時(shí)進(jìn)行激光線提取,并進(jìn)行復(fù)雜的畸變校正和3D點(diǎn)云生成運(yùn)算,最后通過(guò)機(jī)器學(xué)習(xí)控制機(jī)器人動(dòng)作。由于快速工業(yè)流水線操作要求較高的實(shí)時(shí)性,傳統(tǒng)的CPU無(wú)法在有限的時(shí)間處理完大量的浮點(diǎn)運(yùn)算,因此在機(jī)器人內(nèi)部通過(guò)并行處理器實(shí)時(shí)完成復(fù)雜的算法實(shí)現(xiàn)。
FPGA芯片內(nèi)部的RTL設(shè)計(jì)通常稱為FPGA的硬件設(shè)計(jì),硬件架構(gòu)如圖2所示,Xilinx公司文檔稱為PL(programmable logic)設(shè)計(jì),相應(yīng)的SOC處理器程序設(shè)計(jì)稱為PS(processing system)端設(shè)計(jì),文中將PL簡(jiǎn)稱為RTL設(shè)計(jì)。RTL設(shè)計(jì)主要分為三部分:外部設(shè)備、SOC軟核處理器設(shè)計(jì)和圖像采集及卷積神經(jīng)網(wǎng)絡(luò)算法部分。
外部設(shè)備主要包括DDR3控制器、網(wǎng)絡(luò)協(xié)議棧收發(fā)器、串口收發(fā)器以及NOR flash控制器部分[10]。例化的DDR3控制器的主時(shí)鐘為800 MHz,32 bit位寬,設(shè)計(jì)的最大傳輸帶寬為6.4 GB/s,滿足絕大多數(shù)的現(xiàn)場(chǎng)應(yīng)用。網(wǎng)絡(luò)協(xié)議棧收發(fā)器使用的TCP/IP網(wǎng)絡(luò)協(xié)議,速度為1 000 Mb/s,所有的外部設(shè)備都連接到AXI總線上,多設(shè)備的訪問(wèn)使用Vivado提供的內(nèi)部互聯(lián)專用模塊連接。
圖2 FPGA的RTL SOC硬件設(shè)計(jì)架構(gòu)
SOC軟核處理器設(shè)計(jì)采用Xilinx公司的FPGA開(kāi)發(fā)工具Vivado2017.2提供的軟核處理器MicroBlaze,并例化了兩個(gè)獨(dú)立的處理器模塊,每個(gè)處理器都擁有獨(dú)立的片上程序存儲(chǔ)器,并用于存儲(chǔ)各自的BootLoader程序[11]。0號(hào)處理器作為主處理器,它的主要功能是控制整個(gè)系統(tǒng)的運(yùn)行,并為各個(gè)模塊加載參數(shù)配置,1號(hào)處理器負(fù)責(zé)復(fù)雜數(shù)據(jù)傳輸,并掛載網(wǎng)絡(luò)協(xié)議棧收發(fā)器,兩個(gè)處理器之間采用MailBox中斷方式進(jìn)行實(shí)時(shí)通信,并且,這兩個(gè)處理器通過(guò)各自的二級(jí)緩存訪問(wèn)全部的DDR的地址,處理器與各個(gè)設(shè)備模塊之間也是采用高速AXI總線連接的。
圖像采集使用的傳感器總線為16位LVDS串行總線,雙邊沿采樣,模塊包括傳感器的控制程序和LVDS總線訓(xùn)練程序,采集到的圖像首先進(jìn)行抽樣和截取,滿足設(shè)計(jì)的算法要求,卷積神經(jīng)網(wǎng)絡(luò)算法模塊同時(shí)進(jìn)行機(jī)器學(xué)習(xí)算法處理,輸出計(jì)算結(jié)果,其中抽樣或截取后的圖片也可以選擇實(shí)時(shí)輸出。模塊的輸出最后通過(guò)DMA的方式寫入DDR的指定區(qū)域。
當(dāng)設(shè)備工作時(shí),0號(hào)處理器首先為配置卷積神經(jīng)網(wǎng)絡(luò)計(jì)算單元DLA加載算法的網(wǎng)絡(luò)模型參數(shù),使其完成指定的網(wǎng)絡(luò)算法模型,然后通知CMOS傳感器采集圖像。CMOS傳感器將采集的圖像數(shù)據(jù)源源不斷地輸入到FPGA內(nèi)部,經(jīng)過(guò)抽樣后送入到卷積神經(jīng)網(wǎng)絡(luò)計(jì)算模塊中,輸出的計(jì)算結(jié)果通過(guò)DMA的方式寫入DDR中,同時(shí)通知1號(hào)處理器數(shù)據(jù)已經(jīng)準(zhǔn)備好。1號(hào)處理器先將數(shù)據(jù)分包,再通過(guò)DMA的方式從DDR傳輸?shù)骄W(wǎng)絡(luò)協(xié)議棧收發(fā)器中,最終以TCP/IP協(xié)議,將卷積神經(jīng)網(wǎng)絡(luò)算法的計(jì)算結(jié)果發(fā)送給外部設(shè)備。
圖3是系統(tǒng)BootLoader的啟動(dòng)流程,整個(gè)系統(tǒng)需要多個(gè)分布式加載的子程序。
系統(tǒng)SOC端的可用存儲(chǔ)器包括4部分,分別是易失性存儲(chǔ)器DDR3、易失性片上存儲(chǔ)器、非易失性程序存儲(chǔ)器NOR Flash和非易失性參數(shù)存儲(chǔ)器,其中易失性片上存儲(chǔ)器是使用FPGA的內(nèi)部Block RAM構(gòu)建的,每個(gè)處理器的易失性片上存儲(chǔ)器是獨(dú)立的。
表1 系統(tǒng)需要加載的子程序列表
表1是系統(tǒng)需要加載的子程序列表,其中Bitstream.bit是系統(tǒng)的PL端硬件電路鏡像,通過(guò)Vivado SDK提供的Generate Bitstream工具將Bitstream.bit、Boot0.elf、Boot1.elf三個(gè)程序合并為一個(gè)程序,命名為Download.bit。Boot0.elf、Boot1.elf程序作為非易失性片上存儲(chǔ)器的初始化常量插入到Download.bit中。最終燒寫到NOR Flash中的程序包括Download.bit、Ethenet.elf和多個(gè)實(shí)現(xiàn)不同網(wǎng)絡(luò)模型的Conv1_n.elf鏡像文件,這些鏡像文件開(kāi)始需要使用Vivado SDK提供的Program Flash Mermory工具單獨(dú)寫入NOR Flash指定的偏移地址中,以后可以使用網(wǎng)絡(luò)升級(jí)和更換這些預(yù)置的鏡像[12]。
圖3 系統(tǒng)BootLoader的啟動(dòng)流程
系統(tǒng)上電后,PL端的程序會(huì)自動(dòng)從NOR Flash加載到FPGA內(nèi)部,自動(dòng)加載完成后,系統(tǒng)開(kāi)始啟動(dòng)卷積神經(jīng)網(wǎng)絡(luò)的BootLoader流程,如圖3所示。0號(hào)處理器作為主處理器,首先將1號(hào)處理器應(yīng)用程序加載到1號(hào)處理器的DDR程序運(yùn)行段中,然后根據(jù)配置選擇需要加載的卷積神經(jīng)網(wǎng)絡(luò)模型Conv1_n.elf到自己的DDR程序運(yùn)行段中,這些配置存儲(chǔ)在非易失性參數(shù)存儲(chǔ)器中。加載完成后,通知1號(hào)處理啟動(dòng)應(yīng)用程序,同時(shí)自己也啟動(dòng)深度學(xué)習(xí)網(wǎng)絡(luò)應(yīng)用程序,完成BootLoader的整個(gè)過(guò)程[13]。
系統(tǒng)的多重加載主要體現(xiàn)在同時(shí)擁有多個(gè)Conv1_n.elf,即多種網(wǎng)絡(luò)模型應(yīng)用,在特定的環(huán)境啟動(dòng)不同網(wǎng)絡(luò)算法完成特殊功能。不僅如此,還可以通過(guò)外部PC軟件為系統(tǒng)更換這些網(wǎng)絡(luò)模型文件。目前設(shè)計(jì)預(yù)置網(wǎng)絡(luò)模型的最大數(shù)量為10個(gè),燒寫在10個(gè)指定NOR Flash偏移地址中。
系統(tǒng)的軟件設(shè)計(jì)主要包括處理器的嵌入式開(kāi)發(fā)和上位機(jī)軟件的庫(kù)文件,即雙核處理器的應(yīng)用程序和面向最終用戶的終端軟件中間件程序。
0號(hào)處理器是主控處理器,它需要初始所有的外部設(shè)備,配置自定義的卷積神經(jīng)網(wǎng)絡(luò)算法模型,分配和管理多種數(shù)據(jù)塊緩存。1號(hào)處理器主要負(fù)責(zé)網(wǎng)絡(luò)傳輸,它根據(jù)0號(hào)處理器發(fā)送的緩存狀態(tài)信息,將FPGA產(chǎn)生的數(shù)據(jù)從DDR發(fā)送到TCP/IP網(wǎng)絡(luò)協(xié)議棧。嵌入式開(kāi)發(fā)使用的是Xilinx公司提供的Vivado SDK,它是一款界面十分友好的嵌入式編譯器,使用C或C++編寫源碼程序,開(kāi)發(fā)難度等同于ARM嵌入式系統(tǒng)開(kāi)發(fā)難度[14]。
固化在硬件中的程序主要在2個(gè)MicroBlaze處理器中,包括CAM采圖模塊和DLA卷積神經(jīng)網(wǎng)絡(luò)計(jì)算模塊,另外還包括數(shù)據(jù)傳輸中使用的DMA傳輸。由于0號(hào)處理器作為主要的控制單元,1號(hào)處理器主要負(fù)責(zé)網(wǎng)絡(luò)傳輸,因此針對(duì)不同的網(wǎng)絡(luò)模型,需要修改0號(hào)處理器對(duì)DLA模塊的控制邏輯,并修改CAM采圖后的圖像抽樣以滿足特定網(wǎng)絡(luò)需求,其他的配置都不需要變化。
0號(hào)處理器的執(zhí)行流程:
(1)初始化硬件,訓(xùn)練LVDS接口的采圖時(shí)序;
(2)建立DLA的執(zhí)行網(wǎng)絡(luò)模型,指定DLA的內(nèi)存分配;
(3)設(shè)置CAM采圖配置,設(shè)置采圖后的數(shù)據(jù)抽樣;
(4)啟動(dòng)卷積神經(jīng)網(wǎng)絡(luò)算法,執(zhí)行采圖;
(5)取出計(jì)算結(jié)果。
上位機(jī)軟件的庫(kù)文件是提供給最終用戶的客戶端使用的,又稱為中間件程序,中間件首先將負(fù)責(zé)的配置指令重新整合,并提供給用戶控制接口,方便用戶調(diào)用。其次將網(wǎng)絡(luò)數(shù)據(jù)重新打包,以整合好的包數(shù)據(jù)格式提供給終端客戶,最后中間件提供了一個(gè)日志信息和錯(cuò)誤信息接口,記錄了必要的狀態(tài)信息和異常情況,方便用戶回溯歷史行為和排查異常。
文中使用自制的搭載Xilinx FPGA A7板卡和CMOS傳感器,以及配套的電源、鏡頭等外部設(shè)備,實(shí)時(shí)采集產(chǎn)線上的產(chǎn)品,并將深度學(xué)習(xí)處理過(guò)的數(shù)據(jù)通過(guò)千兆網(wǎng)發(fā)送到工控機(jī)處理。其中工控機(jī)配置I5 5520雙核4線程處理器,8 G內(nèi)存,500 G固態(tài)硬盤,Windows7操作系統(tǒng)。
配置的網(wǎng)絡(luò)模型為經(jīng)典的ImageNet,其中DLA的硬件處理單元為8,傳感器采集實(shí)時(shí)圖像,抽樣尺寸為227*227*3的ImageNet標(biāo)準(zhǔn)輸入,測(cè)試結(jié)果為每秒處理155張采集圖像,板卡和傳感器的總功率約12 W。表2是消耗的主要FPGA資源。
表2 PE=8的卷積神經(jīng)網(wǎng)絡(luò)計(jì)算模型占用的資源
文中采用DLA算法核心,在FPGA上實(shí)現(xiàn)了卷積神經(jīng)網(wǎng)絡(luò)。系統(tǒng)基于Xilinx的MicroBlaze SOC技術(shù),在單片F(xiàn)PGA上集成一體化環(huán)境,將DLA的卷積算法模型集成到設(shè)備上,并提供遠(yuǎn)程算法升級(jí)和多重網(wǎng)絡(luò)模型的動(dòng)態(tài)加載,降低了工程人員將自定義機(jī)器學(xué)習(xí)算法落地到工廠的難度,提高了對(duì)機(jī)器視覺(jué)設(shè)備的可維護(hù)性,有利于推進(jìn)卷積神經(jīng)網(wǎng)絡(luò)在工業(yè)化視覺(jué)領(lǐng)域中的應(yīng)用。