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