張麗麗, 陳 真, 劉雨軒, 屈樂樂
(沈陽航空航天大學(xué) 電子信息工程學(xué)院,遼寧 沈陽 110000)
目標檢測是計算機視覺領(lǐng)域的一個重要研究方向,近年來,基于卷積神經(jīng)網(wǎng)絡(luò)的目標檢測算法取得了巨大突破,在自動駕駛、人臉識別、行人檢測等領(lǐng)域都獲得了廣泛應(yīng)用,文獻[1]針對Yolo v3提出使用Generalized Intersection over Union(GIOU)計算損失、密集連接等方法,實現(xiàn)了2.11%的性能提升,文獻[2]指出傳統(tǒng)的目標檢測算法對于小尺寸目標的檢測效果較差,針對此問題,文獻[3]通過不同通道特征圖的疊加,引入空間注意力機制,增強了模型對于小目標的檢測能力,文獻[4]使用Mish激活函數(shù)替換ReLu激活函數(shù),使用Complete Intersection over Union(CIoU)計算損失,實現(xiàn)1.88%的性能提升,然而隨著檢測性能的提升,目標檢測算法計算冗雜、網(wǎng)絡(luò)參數(shù)繁多、計算復(fù)雜度大幅增加,使得其只能在高性能計算機上運行,在實時性要求更高的應(yīng)用場景中,傳統(tǒng)的中央處理器的計算架構(gòu)無法滿足實時計算的需求,需要硬件加速器進行加速計算,降低延時,主流的解決方法之一是采用現(xiàn)場可編程邏輯門陣列(Field Programmable Gate Array, FPGA)提高運算速度,F(xiàn)PGA具有高實時性、低功耗以及并行處理等特點,使其能夠完成多種情形的工作,具有較好的實用性和靈活性,適用于目標檢測算法的各種應(yīng)用場景。
文獻[5]中,Wei等人實現(xiàn)了Yolo 網(wǎng)絡(luò)的加速,并將網(wǎng)絡(luò)中的Leaky ReLu激活函數(shù)替換為ReLu激活函數(shù)以減少資源消耗,在ZYNQ7035中實現(xiàn)了19 FPS的性能;文獻[6]提出了一種輕量級Yolo v2的實現(xiàn)方法,該方法通過使用二值化的特征提取網(wǎng)絡(luò)減少了計算量與內(nèi)存消耗,并使用支持向量機回歸對物體進行分類,在XCZU9EG器件上實現(xiàn)了40.81 FPS的性能,該設(shè)計通過降低算法的復(fù)雜度成功地提高了速度;文獻[7]對Yolo網(wǎng)絡(luò)進行了優(yōu)化,針對優(yōu)化后的網(wǎng)絡(luò),使用AXI4總線封裝了應(yīng)用程序接口,并且使用ReLu激活函數(shù)替換Leaky ReLu激活函數(shù),參數(shù)模型全部存儲在片上存儲器中以減少外部存儲器的訪問,實現(xiàn)了19.6 FPS的性能;文獻[8]采用流水線架構(gòu),所部署的神經(jīng)網(wǎng)絡(luò)中的每一層均映射到專門的硬件模塊,在Virtex XC7VX486 T器件上實現(xiàn)了109 FPS的性能,該方案需要相當(dāng)大的片上存儲空間,對于一些中低端芯片,部署難度大。相對于Yolo v2而言,Yolo v3在檢測精度方面有了巨大提升,同時也帶來了更多的計算量,于是部分工作中采用Yolo v3-Tiny網(wǎng)絡(luò)進行部署,文獻[9]中通過將Yolo v3-Tiny網(wǎng)絡(luò)中的特征圖映射為矩陣并且將歸一化層與卷積層合并以降低計算復(fù)雜度,在XCZU7EV器件上實現(xiàn)了8.3 FPS的性能;文獻[10]使用Yolo v3-Tiny網(wǎng)絡(luò)在XCZU9EG器件上實現(xiàn)了104 FPS的性能,但其未提到圖片大小、可檢測物體種類數(shù)以及資源消耗,以上工作需要針對網(wǎng)絡(luò)進行特定的優(yōu)化,靈活性低,對開發(fā)者硬件知識儲備要求較高,對于非專業(yè)硬件開發(fā)人員而言上手難度大,且開發(fā)周期較長,難以適應(yīng)快速迭代神經(jīng)網(wǎng)絡(luò)模型,因此需要一種普適性強,開發(fā)周期短,開發(fā)流程簡潔的神經(jīng)網(wǎng)絡(luò)模型加速方法。
針對上述需求,為達到嵌入式設(shè)備部署神經(jīng)網(wǎng)絡(luò)時所需的低功耗、高檢測準確度、實時性以及方便移植的目的,本文提出了一種目標檢測網(wǎng)絡(luò)模型在ZYNQ平臺上的實現(xiàn)方法,該方法采用軟硬件協(xié)同設(shè)計,使用ZYNQ芯片中的FPGA部分對算法進行硬件加速處理,實現(xiàn)了兩個目標檢測模型,分別是改進后的Yolo v3-Tiny與Yolo v3-SPP。首先優(yōu)化Yolo v3-Tiny與Yolo v3-SPP模型結(jié)構(gòu)使其適用于ZYNQ端的部署,并對其進行訓(xùn)練,然后將訓(xùn)練好的模型進行量化,再對量化后的模型根據(jù)構(gòu)建的硬件信息進行編譯,得到可以在ZYNQ端執(zhí)行的模型文件,最后編寫程序調(diào)用該模型文件,達到硬件加速的目的。
Yolo v1-v3[11-13]是 一 種 被 廣 泛 使 用 的one stage目標檢測架構(gòu),Yolo v3網(wǎng)絡(luò)模型在保證檢測精度的同時兼顧了檢測速度,由于該模型參數(shù)量較大,在使用ZYNQ芯片中的FPGA部分對算法進行加速時,無法直接將模型的全部參數(shù)存儲于FPGA上有限的片上存儲器中,且其參數(shù)類型為float32,不適于FPGA等硬件設(shè)備進行計算加速,因此需要對其進行量化、編譯等操作以使其適用于FPGA的部署,而Yolo v3模型在量化、編譯之后會有較大的精度損失,為了彌補這個損失,本文采用Yolo v3-SPP網(wǎng)絡(luò)模型進行部署,該模型相較于Yolo v3模型,主要區(qū)別在于特征提取網(wǎng)絡(luò)之后加入了Spatial Pyramid Pooling(SPP)模塊,在該結(jié)構(gòu)中分別使用大小為1×1,5×5,9×9,13×13的池化核進行最大池化處理,再將不同尺度的特征圖在第一維度進行concatenate操作,得到SPP結(jié)構(gòu)的輸出。
SPP模塊通過使用不同大小的池化核進行池化操作,增加了特征提取網(wǎng)絡(luò)提取全局信息的能力,可以提高特征圖的表達能力,提高模型的檢測性能,而上述SPP結(jié)構(gòu)無法直接應(yīng)用于ZYNQ端的部署,因為該結(jié)構(gòu)中包含大小為9×9與13×13的池化核,由Xilinx公司的產(chǎn)品指南[14]可知,F(xiàn)PGA上支持的最大池化核尺寸為8×8,一種解決方案是保持SPP結(jié)構(gòu)不變,將模型的中間結(jié)果從FPGA傳回至CPU處理,待CPU計算完成后再將結(jié)果傳至FPGA完成之后的計算,這樣的缺點是會造成額外的數(shù)據(jù)搬移,此時數(shù)據(jù)在CPU與FPGA之間的傳輸會成為系統(tǒng)整體性能的瓶頸,另一種方法是更改網(wǎng)絡(luò)結(jié)構(gòu),使其適用于FPGA的部署從而避免不必要的數(shù)據(jù)搬移,提升系統(tǒng)性能。本文選擇更改SPP結(jié)構(gòu),然后對模型進行訓(xùn)練,使用訓(xùn)練完成的模型進行部署,整體網(wǎng)絡(luò)結(jié)構(gòu)如圖1所示,SPP結(jié)構(gòu)對運行速度的影響及模型性能測試見本文4.2節(jié)。
圖1 Yolo v3-SPP網(wǎng)絡(luò)結(jié)構(gòu)Fig.1 Yolo v3-SPP network structure
ZYNQ為Xilinx公司推出的一種異構(gòu)加速平臺,該平臺由兩部分構(gòu)成,為Processing System(PS)端與Programmable Logic(PL)端,即FPGA部分。本文所用芯片屬于ZYNQ UltraScale+ MPSoCs系列芯片,型號為XCZU15EGffvb1156-2-i,所用編譯環(huán)境為Vivado 2021.2,Petalinux 2021.2,Vitis 2021.2以 及Vitis AI 1.4.0。系統(tǒng)采用軟硬協(xié)同實現(xiàn)目標檢測功能,系統(tǒng)框圖如圖2所示,其中PS端掛載了一張SD卡,卡中燒錄有Linux操作系統(tǒng),系統(tǒng)中包含有opencv、numpy等常用python庫,還包含VART以及自定義動態(tài)鏈接庫,攝像頭負責(zé)獲取圖像數(shù)據(jù),獲取到的圖像數(shù)據(jù)傳入主機程序中進行處理,處理完成的數(shù)據(jù)通過AXI總線傳輸至PL端的DPU IP核中進行運算,PL端再將運算后的結(jié)果返回至PS端,PS端再對結(jié)果進行后處理,得到模型的輸出結(jié)果,另外PS端還負責(zé)結(jié)果的儲存與輸出。
圖2 系統(tǒng)框圖Fig.2 System block diagram
Deeplearning Process Unity(DPU)是Xilinx公司開發(fā)的一款I(lǐng)P核。該IP核在ZYQN中的PL端實現(xiàn),可由Vitis AI編譯器生成的指令驅(qū)動。在使用該IP核時需要對其進行配置,部分可配置參數(shù)如下,Arch,該參數(shù)用于配置DPU架構(gòu)并行度,如B512,B4096,數(shù)字512或4 096代表每秒最大計算量(Ops);RAM Usage,該參數(shù)用于配置Block RAM(BRAM)的使用模式,可配置為低BRAM使用與高BRAM使用;Number of DPU Cores,該參數(shù)用于配置一個DPU IP核中的內(nèi)核個數(shù),可配置為1~4個;DSP Usage,該參數(shù)用于配置DSP的使用模式,可配置為低DSP使用與高DSP使用;URAM Use per DPU,該參數(shù)用于配置Ultra RAM(URAM)的使用模式,可配置DPU中每個內(nèi)核使用的URAM數(shù)量,各參數(shù)的配置以及對系統(tǒng)性能影響的測試見4.1節(jié)。
ZYNQ端的可執(zhí)行模型文件,即xmodel文件,基于Xilinx公司的Vitis AI工具生成,該工具中包含有Vitis AI量化器與Vitis AI編譯器,其中,Vitis AI量化器負責(zé)將浮點型數(shù)據(jù)量化為定點數(shù)據(jù),在量化過程中,需要輸入校準圖像數(shù)據(jù);Vitis AI編譯器負責(zé)根據(jù)DPU的配置參數(shù)將經(jīng)Vitis AI量化器量化后的模型文件編譯為xmodel文件。當(dāng)DPU不支持模型中的某個運算時,Vitis AI編譯器仍可編譯該模型。在這種情況下,模型被分成幾個部分,每個部分稱為子圖,DPU上無法執(zhí)行的子圖將被放在CPU上執(zhí)行,此時,DPU執(zhí)行完子圖后需要將結(jié)果回傳至CPU中進行相應(yīng)子圖的計算,DPU需要等待CPU計算完成,才可以進行下一子圖的計算,這樣會增加數(shù)據(jù)傳輸以及等待時間,影響計算效率。
執(zhí)行程序基于Python語言編寫,采用多線程設(shè)計,程序結(jié)構(gòu)如圖3所示,通過ctypes庫實現(xiàn)對c/c++的兼容以及動態(tài)鏈接庫的調(diào)用,程序執(zhí)行時首先加載xmodel文件并對xmodel文件進行反序列化,得到所有子圖,然后獲取各子圖執(zhí)行的位置,取出需要在DPU中執(zhí)行的子圖;然后通過opencv庫中的函數(shù)接口獲取攝像頭輸出的圖片數(shù)據(jù),對圖片數(shù)據(jù)進行預(yù)處理,預(yù)處理包括數(shù)據(jù)歸一化、數(shù)據(jù)縮放以及數(shù)據(jù)類型轉(zhuǎn)換,數(shù)據(jù)縮放倍數(shù)由模型編譯時確定。再將預(yù)處理后的數(shù)據(jù)送入DPU或CPU中完成對應(yīng)子圖的計算,得到網(wǎng)絡(luò)輸出結(jié)果,結(jié)果經(jīng)處理后可以存儲在SD卡中或傳輸給下一級。
圖3 主程序結(jié)構(gòu)Fig.3 Main program structure
為探究DPU IP核的內(nèi)核數(shù)、架構(gòu)并行度以及系統(tǒng)時鐘頻率對系統(tǒng)性能的影響,本文針對7種DPU配置方案進行了測試,測試使用改進后的Yolo v3-SPP模型,每種方案的配置方式如表1所示,其中方案1、方案3架構(gòu)并行度相同,時鐘頻率相同,內(nèi)核數(shù)不同,用于探究時內(nèi)核數(shù)對系統(tǒng)性能的影響;方案2、方案3架構(gòu)并行度相同,內(nèi)核數(shù)相同,時鐘頻率不同,用于探究時鐘頻率對系統(tǒng)性能的影響;方案4、方案5架構(gòu)并行度相同,內(nèi)核數(shù)相同,時鐘頻率不同,均使用相同數(shù)量的URAM代替部分BRAM,用于探究使用BRAM情況下時鐘頻率對系統(tǒng)性能的影響;方案6、方案7內(nèi)核數(shù)相同,時鐘頻率相同,架構(gòu)并行度不同,用于探究架構(gòu)平行度對系統(tǒng)性能的影響。除上述參數(shù)外,每種方案的激活函數(shù)開啟Leaky-ReLU,ReLU,ReLU6支持,開啟Softmax支持、Depthwise Conv支持、ElementWise Multiply支持、AveragePool支持,開啟channel augmentation,配置為低RAM使用率,高DSP使用率。
表1 DPU配置方式Tab.1 DPU configuration method
針對以上7種方案使用1 000張圖片對系統(tǒng)進行性能測試,測試結(jié)果包括各類型資源占用率(%)、系統(tǒng)功耗(W)以及運行速度(FPS),結(jié)果如圖4所示,對比方案1和方案3,在架構(gòu)并行度為B4096,時鐘頻率為300 MHz的情況下,增加一個DPU內(nèi)核,F(xiàn)PS提升51.68%,同時會增加約96.68%的功耗,各類別資源占用平均增加17.25%;對比方案2和方案3,在架構(gòu)并行度為B4096,內(nèi)核數(shù)為2的情況下,時鐘頻率增加50%,F(xiàn)PS可提升31.30%,同時會增加約31.71%的功耗,各類別資源占用平均減少0.33%;對比方案6和方案7,在內(nèi)核數(shù)為4,時鐘頻率為300 MHz的情況下,增加1.25倍的架構(gòu)并行度,F(xiàn)PS可提升44.84%,同時會增加約29.95%的功耗,各類別資源占用平均增加10.89%;對比方案4和方案5,在架構(gòu)并行度為B4096,內(nèi)核數(shù)為3且使用URAM的情況下,時鐘頻率增加50%,F(xiàn)PS可提升35.59%,同時會增加約22.33%的功耗,各類別資源占用平均增加5.34%;綜上所述,考慮到板卡功耗,資源占用以及系統(tǒng)性能等因素,本文使用方案5進行部署。
圖4 不同方案資源占用率及性能分析Fig.4 Analysis of resource occupancy of different schemes
本文采用更改SPP結(jié)構(gòu)的方式使得Yolo v3-SPP模型適用于ZYNQ端的部署,將原SPP結(jié)構(gòu)的池化核大小由1×1,5×5,9×9,13×13改為1×1,3×3,5×5,7×7,為探究更改后的SPP結(jié)構(gòu)與原SPP結(jié)構(gòu)對模型性能以及部署后模型運行速度的影響,使用不同的SPP結(jié)構(gòu)進行了測試,分別對包含二者的模型采用相同的訓(xùn)練方案進行訓(xùn)練,使用Pascal VOC 2007測試集對二者進行性能測試,測試指標為mAP,閾值取0.5;另外在ZYNQ端使用1 000張圖片分別對各模型進行推斷速度的測試,結(jié)果如表2所示,其中SPP-o表示使用原SPP結(jié)構(gòu),SPP-n表示使用更改后的SPP結(jié)構(gòu),可知,更改后的SPP結(jié)構(gòu)模型性能提升效果與原SPP結(jié)構(gòu)相當(dāng);表中還列出了每個DPU內(nèi)核推理一張圖片所需的平均時間(avg)以及3個DPU內(nèi)核推理一張圖片所需的平均時間(total avg),該時間由每個DPU內(nèi)核所需的平均時間計算得到,從表中可以看出,增加了SPP結(jié)構(gòu)以后,ZYNQ端的DPU內(nèi)核平均推斷速度由76.225 ms分別增加到76.391 ms與76.331 ms,平均推斷耗時分別增加了0.166 ms與0.106 ms,增加的SPP結(jié)構(gòu)對系統(tǒng)推斷速度影響較小,因此,本文采用包含SPP-n結(jié)構(gòu)的模型進行后續(xù)測試與部署。
表2 SPP結(jié)構(gòu)對運行速度的影響Tab.2 Influence of SPP structure on running speed
為探究各模型之間的性能差異,本文分別在PC端與ZYNQ端共部署了6個神經(jīng)網(wǎng)絡(luò)模型,分別是部署在PC端的Yolo v3-SPP,Yolo v3,Yolo v3-Tiny以及量化后的Yolo v3-SPP模型,部署在ZYNQ端的Yolo v3-SPP與Yolo v3-Tiny模型,針對各類別的AP值對各模型進行了測試,閾值取0.5,使用Pascal VOC 2007數(shù)據(jù)集進行測試,共20個物體類別,測試結(jié)果如圖5所示,圖中展示出了不同模型的各類別AP值以及不同模型的結(jié)果在該類別處的差值;其中,Diff 1為部署在ZYNQ端的Yolo v3-SPP模型與部署在PC端的Yolo v3模型所得結(jié)果的差值,Diff 2為部署在PC端的Yolo v3-SPP模型與Yolo v3模型所得結(jié)果的差值,Diff 3為部署在PC端的Yolo v3-SPP模型量化后與量化前所得結(jié)果的差值,整體來看,模型經(jīng)量化后其性能并未發(fā)生明顯下降,符合量化要求。
圖5 各模型性能對比及差值Fig.5 Analysis of model performance after quantification
部署在PC端的Yolo v3-SPP模型的mAP為83.55%,量化后的Yolo v3-SPP模型的mAP為82.62%,部署在PC端的Yolo v3模型的mAP為79.25%,Yolo v3-Tiny模型的mAP為69.75%;部署在ZYNQ端的Yolo v3-SPP模型的mAP為80.35%,部署在ZYNQ端的Yolo v3-Tiny模型的mAP為68.55%,部署在ZYNQ端的Yolov3-SPP模型的mAP相較于PC端有3.2%的下降,但仍高于PC端的Yolo v3模型,整體來看,ZYNQ端的模型檢測性能發(fā)生了少許下降,在可接受范圍之內(nèi),符合部署要求。
圖6為ZYNQ端運行的Yolo v3-SPP模型輸出結(jié)果與PC端運行的Yolo v3-SPP模型輸出對比,其中(a)為ZYNQ端執(zhí)行模型時輸出的結(jié)果,(b)為PC端執(zhí)行模型時輸出的結(jié)果,在簡單場景下,ZYNQ端的檢測結(jié)果與PC端結(jié)果無明顯區(qū)別,如圖片A,復(fù)雜場景下,ZYNQ端對圖片中小尺寸目標的檢測能力略差于PC端,如圖片B、圖片C、圖片D。
圖6 運行結(jié)果對比Fig.6 Comparison of running results
本文實現(xiàn)的Yolo v3-SPP模型可檢測類別個數(shù)為80,模型的最終輸出包含有3個輸出特征層,每個輸出特征層有255個維度,其計算方式為(80+4+1)×3,其中80為各類別對應(yīng)概率,模型每個輸出特征層中的每個特征點存在3個先驗框,故進行乘3操作,每個先驗框含有4個調(diào)整參數(shù),另外還有1個參數(shù)表示該先驗框內(nèi)是否含有物體,圖7展示了使用該模型對同一張圖片進行推斷時,每個輸出特征層上ZYNQ端的輸出結(jié)果、PC端的輸出結(jié)果以及二者的差值,橫坐標表示維度,縱坐標表示輸出值的大小,其中黃色折線表示ZYNQ端的輸出結(jié)果,藍色折線表示PC端的輸出結(jié)果,紅色折線表示二者的差值;可以看出,體現(xiàn)二者差值的紅色折線穩(wěn)定在0值附近,表明ZYNQ端的輸出結(jié)果與PC端的輸出結(jié)果基本保持一致,滿足實際部署要求(彩圖見期刊電子版)。
圖7 特征層輸出對比Fig.7 Feature layer output comparison
另外,將本文的實驗結(jié)果與其他文獻進行了比較,主要比較指標為檢測速度(FPS)、功耗(W)以及mAP(閾值取0.5),測試使用Pascal VOC 2007數(shù)據(jù)集;結(jié)果如表3所示,可知,對于Yolo v3-Tiny模型,本文實現(xiàn)了最高的FPS,為177FPS,分別是文獻[15]、文獻[16]的57.65倍和51倍,mAP僅 次 于GPU和 文 獻[9],為68.55%,實現(xiàn)的Yolov3-SPP模型達到了除GPU外了最高的mAP,為80.35%,較文獻[15]、文獻[9]、文獻[6]分別有21.95%,5.35%和12.75%的提升,檢測速度僅次于GPU和文獻[6],為38.44 FPS。
表3 與其他硬件平臺的性能對比Tab.3 Performance comparison with other hardware platforms
本文通過對Yolo v3-SPP網(wǎng)絡(luò)結(jié)構(gòu)進行優(yōu)化,使其目標檢測性能進一步提升的同時適用于ZYNQ端的部署,彌補了ZYNQ端部署模型時帶來的性能損失,使用Vitis AI工具對預(yù)訓(xùn)練網(wǎng)絡(luò)模型進行量化、編譯,生成板卡運行所需的模型文件,采用多線程思想編寫程序,充分利用板卡資源,完成了Yolo v3-Tiny和Yolo v3-SPP網(wǎng)絡(luò)模型在ZYNQ端的部署,然后對系統(tǒng)進行了性能測試,測試結(jié)果表明,本文所實現(xiàn)的系統(tǒng)在保證檢測速度和網(wǎng)絡(luò)性能的前提下完成了模型在ZYNQ端的部署,對于Pascal VOC 2007數(shù)據(jù)集,圖片輸入大小為(416,416),可檢測類別數(shù)為80,分別實現(xiàn)了177 FPS和38.44 FPS的性能,mAP分別為68.55%和80.35%,優(yōu)于以往部署在嵌入式設(shè)備的目標檢測系統(tǒng)的設(shè)計,本文所提出的設(shè)計有望促進邊緣設(shè)備實現(xiàn)實時目標檢測。