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