吳 凱,黨 鑫,郭風(fēng)祥,焦禹銘,宋慶增
(天津工業(yè)大學(xué) 計算機科學(xué)與技術(shù)學(xué)院,天津 300387)
人工智能技術(shù)早在上個世紀(jì)五十年代便被研究者們提出和建立,人工智能技術(shù)的初衷是為了讓機器可以模擬、擴展、延伸人的智能.目前,深度學(xué)習(xí)技術(shù)是人工智能領(lǐng)域最熱門的研究方向,深度學(xué)習(xí)技術(shù)自2006年被提出以來,已被廣泛的應(yīng)用在計算機視覺,語音處理,數(shù)據(jù)挖掘等多個領(lǐng)域.在計算機視覺領(lǐng)域當(dāng)中,目標(biāo)檢測是指在給定的目標(biāo)范圍內(nèi)提取出有效的目標(biāo)區(qū)域.近年來,目標(biāo)檢測技術(shù)在監(jiān)控、搜尋、跟蹤等任務(wù)中做出了極大地貢獻(xiàn),降低了這些任務(wù)所需要的人力成本,提高了任務(wù)的執(zhí)行效率.
在目標(biāo)跟蹤領(lǐng)域,最近的研究表明,跟蹤算法使用卷積神經(jīng)網(wǎng)絡(luò)來提取特征和分類,可以使算法具備區(qū)分背景和非背景的能力,提升算法魯棒性[1].目標(biāo)跟蹤系統(tǒng)的效果往往會被作為關(guān)鍵環(huán)節(jié)的特征提取所影響[2].目前的卷積神經(jīng)網(wǎng)絡(luò)模型已朝向越來越龐大和復(fù)雜的趨勢發(fā)展,對算力的要求也逐漸提高,所以在目標(biāo)跟蹤系統(tǒng)中使用神經(jīng)網(wǎng)絡(luò)作為提取特征的手段,會極大的影響系統(tǒng)的實時性.目前對目標(biāo)跟蹤系統(tǒng)的部署通常在云端和邊緣計算設(shè)備端,在云端的部署當(dāng)中,通常云端需要處理多個視頻流,對云端的算力和數(shù)據(jù)傳輸?shù)木W(wǎng)絡(luò)延遲需求也比較高,在實時性極高的邊緣計算場景當(dāng)中,邊緣計算設(shè)備對神經(jīng)網(wǎng)絡(luò)模型帶來的龐大算力需求和功耗問題又難以解決[3].
近期,研究者們在軟件層面使用模型壓縮技術(shù),如剪枝、量化等輕量化網(wǎng)絡(luò)方法,使得算法更加適應(yīng)嵌入式端的移植[4].在硬件層面,使用異構(gòu)計算進(jìn)行算法的加速也逐漸成為主流,常見的異構(gòu)加速平臺有GPU(Graphics Processing Unit)、ASIC(Application Specific Integrated Circuit)、FPGA(Field Programmable Gate Array)3種,其中GPU具有數(shù)千計算內(nèi)核,可以進(jìn)行海量數(shù)據(jù)的并行計算,但與之而來的數(shù)據(jù)帶寬需求和功耗也十分巨大.ASIC為定制電路,成品具有功耗低性能強的特點,但是缺點在于靈活性差,一旦流片便無法更改,同時具有較長的設(shè)計周期[5].FPGA別名現(xiàn)場可編程邏輯陣列,具有可重構(gòu),低功耗,高度并行的特點,開發(fā)周期短,靈活度高,適合目前計算量大但更新迭代快速的神經(jīng)網(wǎng)絡(luò)算法[6].
本文針對目標(biāo)跟蹤系統(tǒng)部署在資源受限的移動平臺面對的需求和問題,從軟件算法和硬件電路兩個層面進(jìn)行優(yōu)化,選取設(shè)計更為靈活的高性能FPGA平臺進(jìn)行系統(tǒng)設(shè)計和搭建,采取軟硬件協(xié)同設(shè)計的方法,對計算任務(wù)合理的劃分,使得該目標(biāo)跟蹤系統(tǒng)獲得更好的性能和功耗優(yōu)勢.
本設(shè)計采取兩段式目標(biāo)跟蹤方法,將目標(biāo)跟蹤分為detection+track,即為先進(jìn)行目標(biāo)檢測繼而對檢測出來相同的目標(biāo)進(jìn)行匹配的方式實現(xiàn)目標(biāo)跟蹤,摒棄了傳統(tǒng)的端到端式的目標(biāo)跟蹤方法,此設(shè)計可以根據(jù)跟蹤效果對detection部分和track部分分別采取優(yōu)化手段,以達(dá)到更好的跟蹤效果,算法的處理流程如圖1所示.
圖1 算法處理流程
從圖1中可以看出,算法分為兩部分,首先對輸入視頻流進(jìn)行初始化操作,執(zhí)行預(yù)處理和視頻分幀,然后進(jìn)入YOLOv5檢測算法,接下來進(jìn)入跟蹤流程,將檢測算法處理后得到的檢測框和特征信息進(jìn)行篩查,去除小于置信度的目標(biāo),對檢測框進(jìn)行非極大值抑制,消除一個目標(biāo)身上多個框的情況,然后算法會對每個目標(biāo)使用卡爾曼濾波預(yù)測目標(biāo)在當(dāng)前幀的位置,來確定目標(biāo)是否消失或出現(xiàn)新目標(biāo)并確認(rèn)狀態(tài),之后將預(yù)測結(jié)果和檢測結(jié)果進(jìn)行匹配,此時會區(qū)分目標(biāo)的狀態(tài).對確認(rèn)狀態(tài)正常的目標(biāo)進(jìn)行級聯(lián)匹配,未確認(rèn)狀態(tài)的目標(biāo)會進(jìn)行IOU交并比檢測,重新確定位置并匹配,之后將進(jìn)行下一幀的處理,更新參數(shù),并對未匹配的目標(biāo)進(jìn)行刪除,最后保存結(jié)果進(jìn)行輸出.
在使用目標(biāo)檢測為基礎(chǔ)的兩段式目標(biāo)跟蹤系統(tǒng)中,目標(biāo)檢測的效果對跟蹤系統(tǒng)的性能有著至關(guān)重要的影響.目前基于深度學(xué)習(xí)為基礎(chǔ)的目標(biāo)檢測算法主要分為單階段目標(biāo)檢測和雙階段目標(biāo)檢測兩種,單階段目標(biāo)檢測算法將輸入特征圖當(dāng)中的目標(biāo)位置和類別信息進(jìn)行回歸分析,直接給出結(jié)果,而雙階段目標(biāo)檢測算法要先對所檢測目標(biāo)進(jìn)行候選區(qū)域提取,再對候選區(qū)中的目標(biāo)分類和候選區(qū)域的坐標(biāo)進(jìn)行回歸修正,最后得出目標(biāo)檢測結(jié)果.單階段的主流目標(biāo)檢測算法為YOLO(YOLO、YOLOv2、YOLOv3、YOLOv4)[7-10]系列算法;雙階段的主流目標(biāo)檢測算法為R-CNN((R-CNN、Faster R-CNN、Mask-RCNN)[11-13]系列算法.YOLO系列算法在檢測的精度效果上不如后者,但是在檢測速度上有著明顯的優(yōu)勢.YOLOv5并不是YOLO系列的作者Joseph Redmon開發(fā)的,且其檢測精度略低于YOLOv4,但YOLOv5勝在靈活性與檢測速度,更加適用于部署在移動端系統(tǒng)當(dāng)中.最新的研究結(jié)果表明YOLOv5的大小最小僅有27mb,但是使用darknet 架構(gòu)的YOLOv4有244 MB,對比之下YOLOv5比v4小近90%,二者卻有著接近的檢測精度[14].YOLOv5與其他目標(biāo)檢測算法在coco數(shù)據(jù)集上的測試速度如表1所示.
表1 目標(biāo)檢測算法速度
YOLOv5與v4、v3相比擁有較高的精度,和最快的檢測速度.同時Yolov5 按照神經(jīng)網(wǎng)絡(luò)的體量大小分為 Yolov5s、Yolov5m、Yolov5l、Yolov5x網(wǎng)絡(luò),4種網(wǎng)絡(luò)的結(jié)構(gòu)完全一致,方便研究者根據(jù)需求靈活使用.本設(shè)計為了跟蹤系統(tǒng)實時化的需求,采用了檢測速度較快,同時保證一定精度的Yolov5m作為使用模型.
YOLOv5的結(jié)構(gòu)分為4個部分:輸入端,Backbone,Neck和prediction.其中輸入端YOLOv5采用了 Mosaic 的數(shù)據(jù)增強方法,該方法原理是將圖片隨機的進(jìn)行調(diào)用,使其大小、角度隨機分布生成,使其堆疊,該技術(shù)可以極大地擴充數(shù)據(jù)集數(shù)據(jù)量,從而使模型學(xué)習(xí)到更多的目標(biāo)特征信息,提升模型的識別能力.YOLOv5的輸入端使用了并行度的設(shè)計,使YOLOv5可以同時計算4張輸入圖片,變相的提升了mini-batch的參數(shù)值,這樣可以優(yōu)化算法對計算資源和內(nèi)存的使用.YOLOv5同樣引入了聚類算法,可以使用聚類來設(shè)計anchor的值,在算法訓(xùn)練的過程中還可以從訓(xùn)練集中計算出新的anchor值.算法在預(yù)測過程中會對圖片的大小進(jìn)行自適應(yīng)調(diào)整,將圖片的黑邊減少,以減少多余的計算量,從而加快預(yù)測速度.Backbone中YOLOv5采用了Focus 結(jié)構(gòu)和 CSP 結(jié)構(gòu),Neck中采用了FPN+PAN的結(jié)構(gòu),F(xiàn)PN是一種使用上采樣對數(shù)據(jù)信息進(jìn)行融合的自頂向下的方法,可以獲得預(yù)測數(shù)據(jù)的特征圖.而PAN相反采用的是自底向上的特征金字塔形式,將淺表層的定位信息傳遞至更深的層次當(dāng)中,加強多個尺度的定位能力.最后的prediction層包含損失函數(shù)和非極大值抑制(NMS)YOLOv5采用的GIOU損失函數(shù)可以有效地解決邊界問題.同時NMS可以處理同一目標(biāo)上的多個目標(biāo)框重合問題,選出最優(yōu)解.
本設(shè)計采用兩段式目標(biāo)跟蹤,在視頻流數(shù)據(jù)通過YOLOv5處理后,會進(jìn)入跟蹤算法的處理階段.跟蹤算法使用的是Wojke N[15]等人提出的設(shè)計思想為卡爾曼濾波和匈牙利方法結(jié)合的Deepsort跟蹤框架,是一種可以處理在線實時目標(biāo)跟蹤的算法.Deepsort算法是根據(jù)Sort算法進(jìn)行改進(jìn),在mot16數(shù)據(jù)集上Deepsort算法和其他在線目標(biāo)跟蹤算法的效果如表2所示.EAMTT和POI算法速度太慢不滿足跟蹤系統(tǒng)的實時性要求.Deepsort與Sort算法相比,擁有更高的跟蹤精度,并且在對遮擋目標(biāo)的追蹤效果有更好的優(yōu)勢,速度仍舊可以滿足實時的要求.
表2 在線跟蹤算法參數(shù)
該方法使用(u,v,r,h,u′,v′,r′,h′)這8種參數(shù)來表示待跟蹤目標(biāo)的運動狀態(tài)信息(u,v)用來確定檢測框的中心坐標(biāo),r為檢測框的長和寬的比值,h為檢測框的高度,(u′,v′,r′,h′)這4個變量描述的是對應(yīng)參數(shù)的移動速度信息.過程為在目標(biāo)檢測算法檢測到目標(biāo)當(dāng)前幀所在的坐標(biāo)時,會使用卡爾曼濾波的方法預(yù)測目標(biāo)下一幀的位置信息,預(yù)測模型是線性和時勻速的.接下來算法將會使用預(yù)測得來的目標(biāo)框和實際得到的下一幀的目標(biāo)框之間的馬氏距離來作為二者是否為同一目標(biāo)的度量標(biāo)準(zhǔn).
使用馬氏距離作為度量標(biāo)準(zhǔn)可能會導(dǎo)致軌跡匹配的不穩(wěn)定性.尤其是在多目標(biāo)跟蹤或者目標(biāo)密集的場景下,馬氏距離往往會失去作為度量標(biāo)準(zhǔn)的效力,目標(biāo)的身份ID號轉(zhuǎn)變會變得更加的頻繁.因此除了預(yù)測框和目標(biāo)框之間的馬氏距離,Deepsort算法創(chuàng)新式的在每個目標(biāo)當(dāng)中加入了通過深度神經(jīng)網(wǎng)絡(luò)提取而來的外觀特征向量,對確定的目標(biāo)算法會建立一個基于該目標(biāo)獨有的特征集.針對目標(biāo)的運動變化,速度與角度的改變使得目標(biāo)的外觀特征逐漸改變,算法通過計算外觀特征向量集與檢測到的每一個目標(biāo)外觀特征向量集的最小余弦距離來判斷軌跡是否屬于同一目標(biāo).
Deepsort算法在匹配檢測框和預(yù)測框的時候,采用的是基于匈牙利方法的級聯(lián)匹配模式.使用級聯(lián)匹配方法可以優(yōu)先匹配更加頻繁出現(xiàn)的軌跡,使遮擋時間短的軌跡優(yōu)先與現(xiàn)有的檢測框進(jìn)行匹配,有效解決因為目標(biāo)發(fā)生遮擋期間使得卡爾曼濾波對丟失的軌跡不再進(jìn)行持續(xù)預(yù)測而導(dǎo)致的跟蹤失敗問題.為了對抗遮擋問題,本設(shè)計還對算法進(jìn)行一些調(diào)整,在匹配過程中,優(yōu)化TLOST參數(shù).當(dāng)目標(biāo)通過匈牙利算法對檢測框的移動數(shù)據(jù)和深度學(xué)習(xí)進(jìn)行初步軌跡匹配之后,確定匹配成功的,將會更新軌跡信息,如果出現(xiàn)未匹配成功的情況,會對未匹配的軌跡和其他未匹配的檢測框進(jìn)行二次匹配,在經(jīng)過TLOST幀后仍未有檢測框與之匹配,系統(tǒng)將會判斷該軌跡已經(jīng)終止,可以通過增大TLOST幀數(shù)值來有效解決短時間內(nèi)的目標(biāo)遮擋問題,但會因為算法待機等待時間的增加而產(chǎn)生多余計算量.
在原Deepsort算法完成級聯(lián)匹配時,有部分沒有進(jìn)行匹配的軌跡是因為遮擋產(chǎn)生的,而遮擋極有可能是因為目標(biāo)之間的重合產(chǎn)生的,可以假設(shè)至少有一個已完成級聯(lián)匹配的目標(biāo)與其他目標(biāo)發(fā)生了重疊,導(dǎo)致目標(biāo)被遮擋,無法完成軌跡的更新.此時可以計算所有匹配成功目標(biāo)和未匹配成功目標(biāo)的交并比,設(shè)定一個閾值,當(dāng)其中兩個目標(biāo)的交并比大于此閾值,就可以認(rèn)定目標(biāo)之間發(fā)生重疊遮擋現(xiàn)象,之后將發(fā)生重疊的未匹配成功目標(biāo)的預(yù)測軌跡視為該目標(biāo)的實際位置,繼續(xù)完成匹配,這樣可以減少因為目標(biāo)重疊而產(chǎn)生的遮擋問題而導(dǎo)致的跟蹤失敗.
根據(jù)兩段式目標(biāo)跟蹤的特點,本設(shè)計采取了軟硬件協(xié)同設(shè)計的優(yōu)化方法.為了滿足實時性和最大資源利用率的需求,將系統(tǒng)任務(wù)劃分成控制和運算兩大部分,控制部分包含配置,通信,串行邏輯等,本次設(shè)計將此部分任務(wù)劃分給主機端使用CPU實現(xiàn),CPU適用于串行和多線程多任務(wù)處理.運算部分主要是YOLO目標(biāo)檢測的向前推斷部分,包含大量并行的乘除法,通過FPGA中高并行度的可編程邏輯來實現(xiàn),主機端和FPGA板卡通過PCIE接口進(jìn)行通信,系統(tǒng)的整體結(jié)構(gòu)如圖2所示.
圖2 整體架構(gòu)
輸入端負(fù)責(zé)視頻數(shù)據(jù)的采集,并將視頻流傳送回主機,主機負(fù)責(zé)將視頻流初始化,進(jìn)行分幀操作,再通過上位機將每一幀的圖像通過PCIE接口傳入FPGA板卡,F(xiàn)PGA板卡內(nèi)數(shù)據(jù)通過AXI總線進(jìn)行數(shù)據(jù)交互,通過AXI Lite進(jìn)行指令交互.圖像數(shù)據(jù)會暫存在DDR中,經(jīng)由上位機發(fā)送指令進(jìn)行卷積計算加速,再將處理后的結(jié)果送回DDR,再由AXI總線經(jīng)過PCIE接口將數(shù)據(jù)傳送回主機,完成加速處理操作.最后主機將數(shù)據(jù)進(jìn)行YOLO后處理,執(zhí)行跟蹤算法,流程結(jié)束.
在目標(biāo)檢測向前推斷階段,包含大量的卷積運算,卷積運算包含大量的乘法和加法.為了更高效的進(jìn)行卷積運算,本文設(shè)計了由多個并行計算單元組成的卷積加速模塊,如圖3所示.
圖3 計算模塊設(shè)計
每一個并行計算單元可以根據(jù)不同的計算任務(wù)需求來調(diào)整計算單元的類別,來完成3*3卷積,1*1卷積或者reshape操作.計算單元通過一個控制寄存器來進(jìn)行操控,使用者通過上位機發(fā)送指令,經(jīng)過AXI Lite總線傳遞指令,計算單元通過解析控制寄存器里的指令來完成復(fù)位、計算、數(shù)據(jù)傳輸?shù)炔僮?計算所需的圖片數(shù)據(jù)和權(quán)重將會由AXI總線進(jìn)行傳輸,在開始計算時數(shù)據(jù)會通過一組直接存儲器訪問(Direct Memory Access,DMA)經(jīng)由AXI總線搬運至計算單元,在計算單元的前后兩側(cè)都設(shè)置一個AXI switch通路選擇器,在計算任務(wù)開始時,AXI switch會根據(jù)計算任務(wù)的需求,將從DDR傳入的數(shù)據(jù)發(fā)送給相應(yīng)的計算單元,當(dāng)計算任務(wù)結(jié)束時,數(shù)據(jù)會傳入另一個AXI switch中,再將數(shù)據(jù)寫回DDR相應(yīng)的地址中.本次設(shè)計中有幾種不同功能的PE單元,以卷積3*3為例,如圖4所示.
圖4 3*3卷積計算單元
3*3標(biāo)準(zhǔn)卷積單元由數(shù)據(jù)生成、FPGA乘加計算資源、用來存儲特征圖數(shù)據(jù)和權(quán)重的Bram、指令寄存器、控制步長的Stride、減少過擬合的POOL等元素組成.Switch模塊用于控制數(shù)據(jù)通路的選擇,指令由PC上位機發(fā)出,經(jīng)過AXI LITE端口進(jìn)入模塊內(nèi)的指令寄存器當(dāng)中,通過解析指令可以選擇加載權(quán)重數(shù)據(jù)進(jìn)入Block RAM或加載特征圖數(shù)據(jù)開始計算.數(shù)據(jù)生成模塊是一個將輸入的特征圖數(shù)據(jù)經(jīng)過一些復(fù)用操作,變成適用于卷積操作的并行數(shù)據(jù),方便和權(quán)重一起進(jìn)入乘加樹進(jìn)行并行計算.Block RAM負(fù)責(zé)儲存一層計算所需要的權(quán)重數(shù)據(jù),是一塊使用資源較大的BRAM,方便后續(xù)計算的數(shù)據(jù)讀取,權(quán)重數(shù)據(jù)由上位機發(fā)出的控制指令調(diào)入.Weight RAM是一塊使用資源比較小的RAM負(fù)責(zé)暫存一次計算使用的權(quán)重數(shù)據(jù),開始計算時從數(shù)據(jù)生成模塊處理好的并行特征圖數(shù)據(jù)和Weight RAM里暫存的權(quán)重數(shù)據(jù)會進(jìn)入到乘加樹進(jìn)行模擬卷積操作.指令寄存器是用來儲存、解析上位機發(fā)出的指令,發(fā)出控制信號,控制計算模塊進(jìn)行數(shù)據(jù)加載和計算.乘加樹模塊是FPGA里的一些乘法器、加法器、DSP資源,特征圖數(shù)據(jù)和權(quán)重數(shù)據(jù)會進(jìn)入乘加樹模塊進(jìn)行模擬卷積操作.數(shù)據(jù)截斷模塊會對乘加樹模塊計算出來的數(shù)據(jù)和Weight RAM里的權(quán)重進(jìn)行截斷操作,截斷操作會將數(shù)據(jù)的低三位截斷,以方便后續(xù)的計算.經(jīng)行截斷以后的數(shù)據(jù)會進(jìn)入Stride模塊,Stride模塊會控制數(shù)據(jù)是否進(jìn)行步長的跨度操作.最后數(shù)據(jù)會進(jìn)入POOL然后截斷輸出.
基于高速設(shè)計和最大化資源利用率的原則,在進(jìn)行卷積運算時,本設(shè)計采用了數(shù)據(jù)復(fù)用、權(quán)重共享的方法,特此在數(shù)據(jù)生成模塊加入了Padding、四變?nèi)⒑腿兙殴δ?在卷積運算中,為了更好地對圖像的邊界信息進(jìn)行處理,獲取更完整的Feature Map,會對輸入圖像進(jìn)行Padding操作,實為補零操作.為了更高的效率,本設(shè)計將此功能在FPGA中實現(xiàn),省去上位機處理和傳輸數(shù)據(jù)的時間.
在FPGA內(nèi)部實現(xiàn)Padding操作,需要借助有限狀態(tài)機(Finite State Machine,F(xiàn)SM),對一張圖片進(jìn)行補零操作,在每一張圖片數(shù)據(jù)進(jìn)入時需要補一行零,后續(xù)還有左補零和右補零操作,在最后一行又需要補一行零才能完成這一復(fù)雜的操作.因此需要使用狀態(tài)機將電路分成不同的操作狀態(tài),同時使用上位機指令進(jìn)行補零的操控.
在進(jìn)行Padding操作之后,還需要對輸入的數(shù)據(jù)進(jìn)行一些數(shù)據(jù)生成操作.在FPGA中,面對大量的流式數(shù)據(jù)運算,往往將數(shù)據(jù)暫存在FIFO當(dāng)中,再將其取出進(jìn)行計算操作,常規(guī)的卷積3*3操作需要一次對需要進(jìn)行卷積的9個像素點做點乘操作,我們一次將卷積所需的3行數(shù)據(jù)傳入FIFO,再從FIFO當(dāng)中依次讀出進(jìn)行計算,但這樣做一個時鐘只能做第1行、第2行、第3行的一個像素點的點乘,完整一次3*3標(biāo)準(zhǔn)卷積需要3個時鐘,速度慢,還會增加后續(xù)數(shù)據(jù)的等待時間,有可能造成數(shù)據(jù)丟失的問題.
針對這些問題,本次設(shè)計對進(jìn)行卷積之前的數(shù)據(jù)處理進(jìn)行了優(yōu)化,首先設(shè)計1個四變?nèi)K,該模塊使用4個分布式Ram,分別為ram0、ram1、ram2、ram3,對padding操作完成后的數(shù)據(jù)進(jìn)行儲存,首先將三行數(shù)據(jù)分別讀入ram0,ram1,ram2在3行數(shù)據(jù)讀滿之后,開啟一次卷積計算,待3行數(shù)據(jù)計算的同時,將第4行數(shù)據(jù)讀入ram3,計算完畢之后,使用ram1,ram2,ram3當(dāng)中的3行數(shù)據(jù),再次開啟一次卷積計算,同時將第5行的數(shù)據(jù)讀入ram0,以此類推,四變?nèi)僮鞯氖疽鈭D如圖5所示.
圖5 四變?nèi)僮?/p>
四變?nèi)僮髟黾恿藬?shù)據(jù)的復(fù)用率,節(jié)省了數(shù)據(jù)準(zhǔn)備的時間,極大地加快了卷積運算的效率.經(jīng)過四變?nèi)螅覀兊玫搅艘淮尉矸e計算的三行數(shù)據(jù),但是一次3*3卷積計算需要9個像素點方能計算完成,還需要對數(shù)據(jù)進(jìn)一步優(yōu)化處理.為此,本設(shè)計采用三變九模塊,將傳入的每行數(shù)據(jù)復(fù)制3份,在每1行的復(fù)制當(dāng)中,第1次的復(fù)制完全保留,第2次的復(fù)制去掉第1個數(shù)據(jù),第3次的復(fù)制去掉前兩個數(shù)據(jù).三變九模塊的示意圖如圖6所示.
圖6 三變九操作
由于FPGA的電路特性,導(dǎo)致其對浮點數(shù)據(jù)不能很好地支持.神經(jīng)網(wǎng)絡(luò)模型當(dāng)中絕大部分參數(shù)為浮點型,在進(jìn)行向前推斷階段,會消耗大量的計算資源,不適合使用FPGA進(jìn)行處理.研究表明,使用8bit,16bit定點數(shù)據(jù)進(jìn)行推斷,不會損失過多精度,在速度上反而更有優(yōu)勢[16].因此為了更適應(yīng)FPGA當(dāng)中部署神經(jīng)網(wǎng)絡(luò),加快模型的推斷速度,需要對浮點模型進(jìn)行數(shù)據(jù)量化操作.
本次設(shè)計采用線性量化,線性量化的公式為:
(1)
其中s是縮放的系數(shù),z代表零點.
XQ=clamp(0,Nl-1,XINT)
(2)
Clamp代表截斷操作,Nl由量化所需要的位數(shù)決定.在進(jìn)行卷積運算時,可將原卷積公式轉(zhuǎn)化為下述公式,完成量化操作.
(3)
本設(shè)計的上位機使用Python語言編寫,主要涉及視頻分幀/抽幀、圖像預(yù)處理、FPGA數(shù)據(jù)和計算調(diào)度,YOLO后處理和Deepsort跟蹤部分.在視頻抽幀分幀,圖像預(yù)處理時,我們會借助OpenCV的函數(shù)庫來實現(xiàn),將視頻流轉(zhuǎn)化為所需的一幀一幀的圖像,再將圖像進(jìn)行一些縮放操作,方便后續(xù)計算任務(wù).YOLO后處理包含解碼和非極大值抑制等,用來解析檢測的結(jié)果,消除多余的重疊框.Deepsort算法使用卡爾曼濾波和匈牙利方法對檢測結(jié)果進(jìn)行跟蹤處理.以上操作均為串行操作,在主機CPU上運行會有極高的效率.
在FPGA對神經(jīng)網(wǎng)絡(luò)進(jìn)行加速的階段,F(xiàn)PGA內(nèi)的數(shù)據(jù)傳輸和計算開始、復(fù)位等指令,均由上位機發(fā)出.為了更方便高效的完成對FPGA的調(diào)度,本設(shè)計定制了一套精簡的AI指令集[17-19].指令集包含對FPGA整體的復(fù)位,各個模塊的復(fù)位、開始信號、數(shù)據(jù)通路的選擇,DMA搬運數(shù)據(jù)的地址和開始信號,還有一些需要配置的參數(shù)如Padding時填零個數(shù),Stride時的步長,都由指令集進(jìn)行配置.Control寄存器為讀寫雙向,上位機可以通過讀寫該寄存器,來控制和獲得計算模塊的當(dāng)前狀態(tài),Switch寄存器為只寫寄存器,上位機通過配置該寄存器,可以完成對4種算子的操控,在每層計算開始之前,會配置該寄存器,來選擇進(jìn)行標(biāo)準(zhǔn)卷積、DW、PW、或者是Reshape操作.Config寄存器,為參數(shù)寄存器,每次計算所需的特征圖數(shù)據(jù),和權(quán)重數(shù)據(jù),都由該寄存器進(jìn)行配置,該寄存器有四條指令,分別為從DDR中讀出的數(shù)據(jù)數(shù)量,讀出的數(shù)據(jù)所在地址,和寫入DDR的數(shù)據(jù)數(shù)量,和寫入DDR的數(shù)據(jù)地址.Compute寄存器一共有4組,分別對應(yīng)12組指令,在每層計算開始之前,會該4組寄存器進(jìn)行詳細(xì)配置,計算模塊會對計算指令進(jìn)行解析操作,從而完成計算指令所對應(yīng)的計算操作,該指令集信息如圖7所示.
圖7 指令集設(shè)計
實驗使用的目標(biāo)檢測模型為YOLOv5m,數(shù)據(jù)集為曠世的CrowdHuman數(shù)據(jù)集[20],硬件方面上,選擇Xilinx 的FPGA,芯片為16nm的Virtex UltraScale+VU9P.設(shè)計全部采用Verilog HDL語言實現(xiàn),開發(fā)工具為Xilinx 的Vivado 2019.2,計算模塊和IP核使用Vivado的block design技術(shù)進(jìn)行連接,并進(jìn)行綜合布線.對照組使用目前主流的GPU NVIDIA GeForce GTX 1080TI和NVIDIA的嵌入式GPU Jetson Xavier.
本設(shè)計采用的時鐘主頻為200Mhz,根據(jù)YOLOv5m目標(biāo)檢測模型的特點,在FPGA內(nèi)部實現(xiàn)3*3標(biāo)準(zhǔn)卷積代替YOLOv5m向前推斷中的卷積操作,經(jīng)過優(yōu)化設(shè)計,最終在VU9P板卡中使用的資源情況如表3所示.
表3 VU9P資源使用情況
在兩段式目標(biāo)跟蹤系統(tǒng)當(dāng)中,目標(biāo)檢測的精確度和速度會極大地影響跟蹤算法的效果.本文分別在VU9P、GTX 1080TI、Jetson Xavier上使用自己錄制的行人視頻,在使用CrowdHuman數(shù)據(jù)集訓(xùn)練好的YOLOv5m模型中,使用480×800的圖像輸入尺寸進(jìn)行測試.表4為性能的對比.由于在FPGA當(dāng)中使用了INT8格式,對比GPU使用的浮點格式,會造成一定的精度損失,但精度仍然只比嵌入式GPU下降3%,但其速度明顯快于GTX 1080TI和Jetson Xavier.雖然損失了一定的精確度,但是在部署系的速度和功耗比上,VU9P都要優(yōu)于GTX 1080TI和Jetson Xavier.
表4 YOLOv5m不同平臺性能對比
經(jīng)過YOLOv5m的實驗后,繼續(xù)開發(fā)上位機,使系統(tǒng)完善,使用Python復(fù)現(xiàn)和改進(jìn)Deepsort跟蹤算法,使用MOT20數(shù)據(jù)集基于MOT20[21]基準(zhǔn)對本跟蹤算法進(jìn)行測試,下載官網(wǎng)數(shù)據(jù)進(jìn)行測試.MOT20測試數(shù)據(jù)集場景多為大量行人,十分擁擠的挑戰(zhàn)性測試場景,對跟蹤算法的抗遮擋性和目標(biāo)發(fā)生重疊時的處理能力有較大的考察意義.在使用一樣的參數(shù)和閾值設(shè)定下與原Deepsort算法進(jìn)行對比實驗效果如表5所示.
表5 跟蹤算法性能對比
通過對比可知,本文經(jīng)過改進(jìn)的Deepsort跟蹤精度有少量的提升,在軌跡匹配失敗時,使用交并比來檢測目標(biāo)是否發(fā)生重疊現(xiàn)象,設(shè)定閾值,防止目標(biāo)由于重疊問題發(fā)生匹配失敗現(xiàn)象,實驗結(jié)果可知身份編號轉(zhuǎn)變的數(shù)值IDS,有較大幅度的降低,證明了本次改進(jìn)針對遮擋目標(biāo)和目標(biāo)消失時的軌跡再匹配有一定程度的改善,避免了部分目標(biāo)丟失的情況.
對接上位機與改進(jìn)后的跟蹤算法,使異構(gòu)系統(tǒng)可以完整的運行YOLOv5m+Deepsort.使用自己錄制的行人視頻進(jìn)行測試,同時在GTX 1080TI、Jetson Xavier進(jìn)行同樣的實驗.測試服務(wù)器CPU為Inter I9 7960,圖像縮放尺寸為480×800,測試處理結(jié)果拋去權(quán)重加載,視頻圖像預(yù)處理的時間,只測試設(shè)備處理所有視頻幀到跟蹤算法輸出結(jié)果的時間.實驗結(jié)果如表6所示.經(jīng)測試該系統(tǒng)可以達(dá)到實時處理效果.
表6 跟蹤系統(tǒng)不同平臺性能對比
本文針對目標(biāo)跟蹤部署在資源受限的移動平臺中遇到的功耗問題和實時性需求,設(shè)計并集成了一種基于FPGA的神經(jīng)網(wǎng)絡(luò)異構(gòu)加速跟蹤系統(tǒng).在硬件層面基于卷積神經(jīng)網(wǎng)絡(luò)特點設(shè)計卷積加速器結(jié)構(gòu),可以實現(xiàn)在低功耗條件下進(jìn)行卷積算法的加速.在算法層面上改進(jìn)Deepsort跟蹤算法達(dá)到更好的跟蹤效果.在系統(tǒng)層面上創(chuàng)新性的結(jié)合了當(dāng)下流行的目標(biāo)檢測算法YOLOv5和在線目標(biāo)跟蹤框架Deepsort,使用8bit定點數(shù)據(jù)并根據(jù)軟硬件協(xié)同優(yōu)化設(shè)計的方法合理分配計算任務(wù),完成跟蹤算法的異構(gòu)加速部署,系統(tǒng)處理速度可以達(dá)到實時水平,滿足在資源受限平臺上的部署.