大俠好,歡迎來(lái)到FPGA技術(shù)江湖,江湖偌大,相見(jiàn)即是緣分。大俠可以關(guān)注FPGA技術(shù)江湖,在“闖蕩江湖”、"行俠仗義"欄里獲取其他感興趣的資源,或者一起煮酒言歡?!爸缶蒲詺g”進(jìn)入IC技術(shù)圈,這里有近50個(gè)IC技術(shù)公眾號(hào)。
第一部分 設(shè)計(jì)概述 /Design Introduction
目前主流的目標(biāo)檢測(cè)算法都是用CNN來(lái)提取數(shù)據(jù)特征,而CNN的計(jì)算復(fù)雜度比傳統(tǒng)算 法高出很多。同時(shí)隨著CNN不斷提高的精度,其網(wǎng)絡(luò)深度與參數(shù)的數(shù)量也在飛快地增長(zhǎng), 其所需要的計(jì)算資源和內(nèi)存資源也在不斷增加。目前通用CPU已經(jīng)無(wú)法滿(mǎn)足CNN的計(jì)算需 求,如今主要研究大多通過(guò)專(zhuān)用集成電路(ASIC),圖形處理器(GPU)或者現(xiàn)場(chǎng)可編程門(mén) 陣列(FPGA)來(lái)構(gòu)建硬件加速電路,來(lái)提升計(jì)算CNN的性能。
其中 ASIC 具備高性能、低功耗等特點(diǎn),但 ASIC 的設(shè)計(jì)周期長(zhǎng),制造成本高,而 GPU 的并行度高,計(jì)算速度快,具有深度流水線(xiàn)結(jié)構(gòu),非常適合加速卷積神經(jīng)網(wǎng)絡(luò),但與之對(duì) 應(yīng)的是 GPU 有著功耗高,空間占用大等缺點(diǎn),很多場(chǎng)合對(duì)功耗有嚴(yán)格的限制,而 GPU 難 以應(yīng)用于這類(lèi)需求。近些年來(lái) FPGA 性能的不斷提升,同時(shí) FPGA 具有流水線(xiàn)結(jié)構(gòu)和很強(qiáng) 的并行處理能力,還擁有低功耗、配置方便靈活的特性,可以根據(jù)應(yīng)用需要來(lái)編程定制硬 件,已成為研究實(shí)現(xiàn) CNN 硬件加速的熱門(mén)平臺(tái)。
綜上所述,使用功耗低、并行度高的 FPGA 平臺(tái)加速 CNN 更容易滿(mǎn)足實(shí)際應(yīng)用場(chǎng)景中 的低功耗、實(shí)時(shí)性要求。而且目標(biāo)檢測(cè)算法發(fā)展迅速,針對(duì) CNN 的硬件加速研究也大有可 為。所以本項(xiàng)目計(jì)劃使用 PYNQ-Z2 開(kāi)發(fā)板設(shè)計(jì)一個(gè)硬件電路來(lái)加速目標(biāo)檢測(cè)算法。
本項(xiàng)目設(shè)計(jì)的目標(biāo)檢測(cè)算法硬件加速電路可以應(yīng)用在智能導(dǎo)航、視頻監(jiān)測(cè)、手機(jī)拍照、 門(mén)禁識(shí)別等諸多方面,比如無(wú)人汽車(chē)駕駛技術(shù),高鐵站為方便乘客進(jìn)站而普遍采用的人臉 識(shí)別系統(tǒng),以及警察抓捕潛逃罪犯而使用的天網(wǎng)系統(tǒng)等都可以應(yīng)用本項(xiàng)目的設(shè)計(jì),加速目 標(biāo)檢測(cè)算法的運(yùn)算速度以及降低系統(tǒng)的功耗。
在本次項(xiàng)目的設(shè)計(jì)開(kāi)發(fā)過(guò)程中,我們參考 DAC 2019 低功耗目標(biāo)檢測(cè)系統(tǒng)設(shè)計(jì)挑戰(zhàn)賽
GPU、FPGA 組雙冠軍方案,學(xué)習(xí)到了基于 SkyNet 和 iSmart2 設(shè)計(jì)一個(gè)輕量級(jí)神經(jīng)網(wǎng)絡(luò)的 技巧,尤其是他們采用的自底向上的硬件電路設(shè)計(jì)思路給我們帶來(lái)了巨大的啟發(fā)。我們?cè)趯⒂?xùn)練好的神經(jīng)網(wǎng)絡(luò)部署在硬件平臺(tái)的過(guò)程中,加深了對(duì) HLS 的理解,開(kāi)始初步掌握使用 HLS 進(jìn)行并行性編程的方法。我們學(xué)習(xí)了 PYNQ 框架,在 PYNQ-Z2 上實(shí)現(xiàn)神經(jīng)網(wǎng)絡(luò)加速 電路,有了軟硬件協(xié)同開(kāi)發(fā)的經(jīng)歷。除此之外,我們還學(xué)習(xí)了 Vitis AI,雖然在項(xiàng)目中并沒(méi) 有使用到 Vitis Ai,但是對(duì)它的學(xué)習(xí)擴(kuò)寬的我們的視野。
第二部分 系統(tǒng)組成及功能說(shuō)明 /System Construction & Function Description
本項(xiàng)目針對(duì)DAC2019 System Design Contest測(cè)試集,計(jì)劃采用PYNQ-Z2開(kāi)發(fā)板加速目標(biāo) 檢測(cè)網(wǎng)絡(luò),綜合考慮數(shù)據(jù)訪問(wèn)、存儲(chǔ)、并行計(jì)算等問(wèn)題進(jìn)行優(yōu)化處理,設(shè)計(jì)出高速高精度 且低功耗的加速方案,并完成相關(guān)仿真和FPGA平臺(tái)的驗(yàn)證,實(shí)現(xiàn)一個(gè)可以框選出圖像中行 人或其他物體位置的硬件電路。
本項(xiàng)目的系統(tǒng)框圖如圖2-1所示,首先PS端從SD卡讀取圖片并壓縮,之后將圖片和參 數(shù)權(quán)重一起傳輸?shù)?DRAM中,PL端再?gòu)腄RAM中讀取數(shù)據(jù)并歸一化,經(jīng)過(guò)卷積和池化將輸 出特征圖傳回到DRAM中,再進(jìn)行下一層卷積運(yùn)算;直到網(wǎng)絡(luò)最后一層輸出送入到邊界框 輸出模塊中選擇置信度最高的邊界框傳輸?shù)紻RAM中,供PS端讀取。
2.1 神經(jīng)網(wǎng)絡(luò)模型的設(shè)計(jì)方案
針對(duì) DAC-SDC 數(shù)據(jù)集并結(jié)合 SkyNet 和 iSmart2 網(wǎng)絡(luò)設(shè)計(jì)原理,挑選出的基本單元Bundle 由 3×3 逐通道卷積(Depthwise Convolution),1×1 逐點(diǎn)卷積(Pointwise Convolution)和 激活函數(shù) ReLU6 組成。
其中 3×3 逐通道卷積和 1×1 逐點(diǎn)卷積的參數(shù)量和計(jì)算量遠(yuǎn)遠(yuǎn)少于傳統(tǒng)的卷積。如圖 2-2 和 2-3 所示,首先每個(gè) 3×3 逐通道卷積核與各自對(duì)應(yīng)的輸入通道數(shù)據(jù)進(jìn)行卷積運(yùn)算,所以 輸出通道數(shù)等于輸入通道數(shù);然后上一步運(yùn)算得到的特征圖繼續(xù)進(jìn)行 1×1 逐點(diǎn)卷積,每個(gè) 1×1 逐點(diǎn)卷積核對(duì)輸入的所有通道進(jìn)行卷積運(yùn)算,并將結(jié)果相加得到一個(gè)輸出特征圖,所以輸出通道數(shù)等于逐點(diǎn)卷積核的數(shù)量。
ReLU6 激活函數(shù)與傳統(tǒng)的 Relu 激活函數(shù)相比,當(dāng) ReLU6 函數(shù)的輸入值大于等于 6 時(shí) 輸出值恒為 6,可以使模型更快地收斂。同時(shí)網(wǎng)絡(luò)采用大小為 2×2,步長(zhǎng)也為 2 的最大池化 層(Max pooling)來(lái)降低運(yùn)算量并防止過(guò)擬合,特征圖每經(jīng)過(guò)一次最大池化層其寬和高都減小一半。
綜上所述本項(xiàng)目構(gòu)建的神經(jīng)網(wǎng)絡(luò)模型如圖 2-4 所示:
本項(xiàng)目構(gòu)建的網(wǎng)絡(luò)模型主要由四個(gè) Bundle 基本單元和三個(gè) Max pooling 層組成,其中每個(gè) Bundle 由 3×3 逐通道卷積,ReLU6 激活函數(shù),1×1 逐點(diǎn)卷積,ReLU6 激活函數(shù)依次排 列組成。通過(guò)每個(gè) Bundle 中的 1×1 逐點(diǎn)卷積實(shí)現(xiàn)輸出特征圖通道數(shù)翻倍,通過(guò) Bundle 其 后緊接著的 Max pooling 層實(shí)現(xiàn)輸出特征圖的尺寸減半。因?yàn)閿?shù)據(jù)集內(nèi)的樣本圖片分辨率均 為 3×360×640,為了降低計(jì)算量就選擇將圖片壓縮到 3×160×320,這個(gè)尺寸既可以盡量保 留圖片的信息以防止目標(biāo)檢測(cè)準(zhǔn)確率下降,又可以在神經(jīng)網(wǎng)絡(luò)運(yùn)算過(guò)程中很方便地通過(guò) Max pooling 進(jìn)行降采樣。經(jīng)過(guò)三層 Max pooling 后特征圖的大小為 20×40,再經(jīng)過(guò)最后一 層 1×1 逐點(diǎn)卷積后輸出為 10×20×40,是將輸入圖片分為 20×40 個(gè)分塊,又因?yàn)檩敵鐾ǖ罃?shù) 為 10,即每個(gè)分塊將會(huì)得到兩個(gè)邊界框和對(duì)應(yīng)的置信度,本項(xiàng)目設(shè)計(jì)的算法會(huì)遍歷所有分 塊的邊界框,選擇置信度最大的邊界框輸出。
2.2 FPGA加速電路設(shè)計(jì)方案
本項(xiàng)目設(shè)計(jì)的硬件電路主要有兩個(gè)模塊模塊:數(shù)據(jù)讀取與傳輸模塊。首先需要讀取圖片和模型參數(shù)的數(shù)據(jù),并對(duì)輸入的圖片數(shù)據(jù)進(jìn)行歸一化處理,然后送入到卷積運(yùn)算模塊中 進(jìn)行計(jì)算,接著將計(jì)算結(jié)果送入到邊界框輸出模塊,最后將得到的邊界框結(jié)果傳輸?shù)?a class="article-link" target="_blank" href="/baike/528706.html">DDR3內(nèi)存中。
2.2.1 數(shù)據(jù)讀取與傳輸模塊
優(yōu)化設(shè)計(jì)一個(gè)高效的數(shù)據(jù)讀取與傳輸模塊是完成目標(biāo)檢測(cè)任務(wù)的前提。首先考慮到FPGA 自身 BRAM 資源有限,所以在數(shù)據(jù)讀取模塊中會(huì)將每一層的特征圖切分成多個(gè)數(shù)據(jù) 塊逐次送入到運(yùn)算模塊中進(jìn)行運(yùn)算。每個(gè)數(shù)據(jù)塊的大小為 20×40,例如將大小為 3×160×320 的輸入圖片分成 64 個(gè) 3×20×40 的數(shù)據(jù)塊。
數(shù)據(jù)讀取時(shí)每次讀取 3×3 逐通道卷積核參數(shù)的大小為 16×3×3,讀取 1×1 逐點(diǎn)卷積核參 數(shù)的大小則為 16×16,兩者均為 16 通道,是因?yàn)榫矸e運(yùn)算模塊為提升運(yùn)算速度采用了 16 通道并行計(jì)算的結(jié)構(gòu)。數(shù)據(jù)傳輸過(guò)程中將特征圖,網(wǎng)絡(luò)參數(shù)通過(guò)指針連續(xù)地存儲(chǔ)在 DDR3 內(nèi)存中,方便數(shù)據(jù)存取,提高傳輸效率。
PYNQ-Z2 的 PS 端通過(guò) AXI4 總線(xiàn)與 PL 端進(jìn)行通信,AXI4 總線(xiàn)協(xié)議具有高性能,高 頻率等優(yōu)勢(shì)。在 Vivado HLS 中編寫(xiě)硬件代碼時(shí)需要將輸入圖片,模型參數(shù)和邊界框等 PS 端與 PL 端傳遞數(shù)據(jù)的接口定義為主或從接口,之后在 Vivado 中自動(dòng)連線(xiàn)時(shí)軟件會(huì)添加 AXI Interconnect 用于管理總線(xiàn),并自動(dòng)為接口分配地址。
在硬件代碼編寫(xiě)完成后,需要進(jìn)行 C 仿真和 C 綜合等步驟,最后導(dǎo)出 RTL,可以在導(dǎo) 出的 IP 核驅(qū)動(dòng)的頭文件中找到接口的地址,然后在 PS 端開(kāi)發(fā)時(shí)將圖片和網(wǎng)絡(luò)參數(shù)數(shù)據(jù)寫(xiě) 入對(duì)應(yīng)地址即可,并從相應(yīng)的接口地址讀取輸出數(shù)據(jù)。
2.2.2 卷積運(yùn)算模塊
設(shè)計(jì)卷積運(yùn)算模塊來(lái)加速卷積運(yùn)算是 FPGA 加速電路的關(guān)鍵,卷積運(yùn)算模塊由 3×3 逐 通道卷積運(yùn)算模塊和 1×1 逐點(diǎn)卷積運(yùn)算模塊組成。
首先為了讓設(shè)計(jì)的 3×3 逐通道卷積運(yùn)算模塊能夠在不同的卷積層間復(fù)用,需要保持 3×3 逐通道卷積前后數(shù)據(jù)塊大小不變,這需要對(duì)輸入和輸出數(shù)據(jù)塊進(jìn)行填充(padding)。輸入數(shù) 據(jù)塊原始大小為 20×40,本項(xiàng)目選擇 padding=1,則輸入數(shù)據(jù)塊大小變?yōu)?22×42,經(jīng)過(guò) 3×3 逐通道卷積后高和寬分別為 20 和 40,即輸出數(shù)據(jù)塊大小依舊為 20×40。如果接下來(lái)還需要 進(jìn)行 3×3 逐通道卷積,則再對(duì)輸出進(jìn)行填充使輸出數(shù)據(jù)塊大小也為 22×42,以保持運(yùn)算過(guò) 程中數(shù)據(jù)塊大小不變,這樣就能很方便地復(fù)用 3×3 逐通道卷積運(yùn)算模塊來(lái)節(jié)約硬件資源。
因?yàn)榫矸e運(yùn)算過(guò)程中特征圖的通道數(shù)逐步變?yōu)?48,96,192,384,均為 16 的倍數(shù), 所以綜合考慮 FPGA 的并行性?xún)?yōu)點(diǎn)和 PYNQ-Z2 自身資源情況,設(shè)計(jì)卷積運(yùn)算模塊為 16 個(gè) 通道并行計(jì)算來(lái)提升運(yùn)算速度。16 通道 3×3 逐通道卷積的輸入數(shù)據(jù)塊為 16×22×42,卷積核 為 16×3×3,輸出數(shù)據(jù)塊經(jīng)填充后也為 16×22×42。
因?yàn)?3×3 逐通道卷積由乘法和加法運(yùn)算構(gòu)成,所以其運(yùn)算模塊需要乘法器,加法器和 寄存器。針對(duì) 3×3 逐通道卷積運(yùn)算模塊,以第一個(gè)通道為例,首先把偏置??11 放入寄存器 中,接著在第一個(gè)時(shí)鐘周期內(nèi),送入數(shù)據(jù)塊的輸入??11和卷積核參數(shù)??11并相乘,將結(jié)果與寄 存器內(nèi)的??11相加并送入寄存器中。第二個(gè)時(shí)鐘周期內(nèi)送入??12和參數(shù)??12重復(fù)上述操作,經(jīng) 過(guò)九個(gè)時(shí)鐘周期后輸出??11,所以需要 9 個(gè)時(shí)鐘周期來(lái)完成一次 3×3 逐通道卷積,期間共進(jìn)行了 9 次相乘并累加操作。則 16 通道并行計(jì)算共需要 16 個(gè)乘法器和 16 個(gè)加法器,即需要 16 個(gè) DSP 資源。
同理可以設(shè)計(jì) 16 通道 1×1 逐點(diǎn)卷積運(yùn)算模塊,以第一個(gè)通道為例, 1×1 逐點(diǎn)卷積運(yùn) 算時(shí)可以不需要計(jì)算 padding 部分,直接從原始輸入數(shù)據(jù)塊開(kāi)始計(jì)算,輸入數(shù)據(jù)塊第一個(gè) 通道的??11與卷積核參數(shù)??11相乘并將結(jié)果保存在寄存器mul1中,則 16 個(gè)通道得到 mul1~mul16共 16 個(gè)乘積值,接著乘積值兩兩相加得到add1~add8共 8 個(gè)累加值,再將得到 的結(jié)果不斷兩兩相加直到僅有一個(gè)累加值add15,最后再加上偏置得到輸出O11,所以完成 一次 16 通道 1×1 逐點(diǎn)卷積共需要 16 次乘法和加法運(yùn)算。
本項(xiàng)目設(shè)計(jì)的硬件電路針對(duì) 1×1 逐點(diǎn)卷積運(yùn)算模塊提供了最大 16 通道并行的計(jì)算方 式。考慮到 PYNQ-Z2 的 DSP 資源共 220 個(gè),且 3×3 逐通道卷積運(yùn)算模塊和邊界框輸出模 塊均占用 DSP 資源,所以最多可以例化 9 個(gè) 16 通道 1×1 逐點(diǎn)卷積運(yùn)算模塊,需要乘法器 和加法器的數(shù)量均為 144 個(gè),即需要 144 個(gè) DSP 資源。
2.3 PS 端編程開(kāi)發(fā)
本項(xiàng)目使用的 PYNQ-Z2 的 PS 端安裝了 Linux 操作系統(tǒng),配置好了 Python 開(kāi)發(fā)環(huán)境,
并預(yù)裝了 Numpy 等常用庫(kù)和專(zhuān)用于 PYNQ 架構(gòu)的 PYNQ 開(kāi)發(fā)庫(kù)。本項(xiàng)目通過(guò) Micro SD 卡 啟動(dòng) PYNQ-Z2,借助網(wǎng)線(xiàn)將路由器與 PYNQ-Z2 相連,登陸路由器管理界面可以查看分配 給 PYNQ-Z2 的 IP 地址,讓電腦也連接路由器,使兩者的網(wǎng)絡(luò)段相同,就可以通過(guò)瀏覽器 登陸這個(gè) IP 地址來(lái)訪問(wèn) PS 端自帶的 Jupyter Notebook 并進(jìn)行 Python 編程開(kāi)發(fā)。
PS 端首先通過(guò) PYNQ 庫(kù)中的 Xlnk 類(lèi)來(lái)為輸入圖片,卷積核參數(shù),偏置,池化層輸出 和預(yù)測(cè)框等分配連續(xù)內(nèi)存,接著使用圖像庫(kù) PIL 中的 Image 類(lèi)從 Micro SD 卡中讀取 3×360×640 大小的輸入圖片,并將圖片壓縮為 3×160×320,再將壓縮后的圖片轉(zhuǎn)化為 numpy 數(shù)組后傳入 DDR3 內(nèi)存中。之前訓(xùn)練好的兩種卷積核參數(shù)和偏置數(shù)據(jù)都保存在了二進(jìn)制文件中,也需要從 SD 卡中分別讀取這些數(shù)據(jù)并按照卷積運(yùn)算模塊數(shù)據(jù)塊的大小和運(yùn)算順序 重新排列后送入 DDR3 內(nèi)存中。
數(shù)據(jù)傳輸完成后 PS 端通過(guò) PYNQ 庫(kù)中的 Overlay 類(lèi)燒寫(xiě)比特流文件和 tcl 文件來(lái)配置 PYNQ-Z2,然后當(dāng)輸入圖片和網(wǎng)絡(luò)參數(shù)寫(xiě)入到對(duì)應(yīng)地址時(shí)硬件電路就開(kāi)始工作,全部運(yùn)算 完成后 PS 端從相應(yīng)的地址讀取邊界框的值并在圖片上畫(huà)出邊界框。
第三部分 完成情況及性能參數(shù)/Final Design & Performance Parameters
3.1 實(shí)驗(yàn)設(shè)計(jì)
3.1.1 神經(jīng)網(wǎng)絡(luò)模型訓(xùn)練
為了提升神經(jīng)網(wǎng)絡(luò)的訓(xùn)練效率,本次實(shí)驗(yàn)把本地編寫(xiě)好的 PyTorch 代碼和數(shù)據(jù)集一起 傳輸?shù)?a class="article-link" target="_blank" href="/tag/%E4%BA%91%E6%9C%8D%E5%8A%A1/">云服務(wù)器中重復(fù)進(jìn)行訓(xùn)練直到滿(mǎn)足精度要求,接著在測(cè)試集上測(cè)試網(wǎng)絡(luò)的識(shí)別精度, 如果能夠滿(mǎn)足要求就將訓(xùn)練好的網(wǎng)絡(luò)參數(shù)保存下來(lái),并將格式轉(zhuǎn)化為二進(jìn)制文件。
3.1.2 硬件代碼仿真與綜合
本項(xiàng)目首先隨機(jī)選出幾張數(shù)據(jù)集中的圖片通過(guò)編程轉(zhuǎn)換成二進(jìn)制 bin 文件,進(jìn)行 C 仿 真時(shí) Test bench 先是讀取二進(jìn)制圖片文件和訓(xùn)練好的網(wǎng)絡(luò)模型參數(shù),然后送入編寫(xiě)好的 Test bench 網(wǎng)絡(luò)模型中計(jì)算并輸出結(jié)果,為了對(duì)比 Test bench 和硬件代碼的輸出結(jié)果,還需要將 網(wǎng)絡(luò)參數(shù)重排序后和圖片一起送入硬件代碼中計(jì)算并輸出結(jié)果,同時(shí)將重新排序后的網(wǎng)絡(luò) 參數(shù)保存成新的二進(jìn)制文件供給之后在 PS 端調(diào)用。對(duì)比 Test bench 和硬件代碼的輸出來(lái)判 斷硬件代碼邏輯功能的正確性。
實(shí)驗(yàn) C 仿真結(jié)果的報(bào)告如圖 3-1 所示,第 6 行顯示本次輸入圖片的編號(hào)為 0,第 9 行顯示輸入圖片第 10 行第 21 列這個(gè)數(shù)據(jù)塊的第二個(gè)邊界框的置信度最大,第 14 行顯示其值 近似為 0.897,第 10 至 13 行顯示了 Test bench 輸出邊界框歸一化后的坐標(biāo)和寬高,將這四 個(gè)值與數(shù)據(jù)塊的寬高 40 和 20 對(duì)應(yīng)相乘后得 21.24,10.34,3.99,6.04,與第 20 行顯示的 硬件代碼輸出邊界框的預(yù)測(cè)結(jié)果十分相近,同時(shí)硬件代碼輸出邊界框的置信度近似為 0.891, 與 Test bench 的結(jié)果也十分接近??梢钥吹?Test bench 和硬件代碼兩者輸出的邊界框和置信 度都非常相近,且經(jīng)過(guò)與真實(shí)輸入圖片中目標(biāo)的位置對(duì)比發(fā)現(xiàn)三者的結(jié)果基本一致,可以認(rèn)為硬件代碼的邏輯功能正確,能夠完成目標(biāo)檢測(cè)任務(wù)。C 仿真通過(guò)后接著進(jìn)行 C 綜合,C 綜合可以根據(jù)實(shí)驗(yàn)一開(kāi)始選擇的 PYNQ-Z2 的芯片型號(hào),編寫(xiě)的硬件代碼和 directives 指令自動(dòng)為硬件電路分配資源,并生成 Verilog 代碼。如 圖 3-2 所示,C 綜合結(jié)果的報(bào)告給出了硬件電路運(yùn)行所用的時(shí)間。
表 3-1 則給出了整個(gè)硬件電路所需要的 BRAM,DSP 等資源情況,可以根據(jù) C 綜合報(bào)告修改各個(gè)模塊的硬件代碼或者 directives 指令來(lái)調(diào)整資源利用率,直到滿(mǎn)足要求。可以看到本項(xiàng)目設(shè)計(jì)的硬件代碼已經(jīng)幾乎利用了全部 DSP 和 BRAM 資源。又因?yàn)?C 綜合時(shí)往往對(duì)所需 LUT 的資源預(yù)測(cè)值遠(yuǎn)超實(shí)際值,所以報(bào)告顯示 LUT 資源超出總額,更加真實(shí)的資源利用情況需要在 Vivado 中生成比特流文件后的報(bào)告中查看。
硬件代碼 C 綜合通過(guò)之后就可以開(kāi)始進(jìn)行 C/RTL 協(xié)同仿真,協(xié)同仿真主要是從時(shí)序角 度檢測(cè)硬件代碼是否正確,仿真結(jié)果會(huì)得到一個(gè)波形文件,可通過(guò)觀察波形來(lái)判斷硬件代 碼的執(zhí)行時(shí)序是否正確。通過(guò)觀察仿真波形可以確認(rèn)本項(xiàng)目設(shè)計(jì)的硬件代碼時(shí)序正確,仿真可以通過(guò)。
3.1.3 生成比特流文件
硬件代碼的仿真與綜合都通過(guò)之后就可以將硬件代碼封裝成 IP 導(dǎo)出,打開(kāi) Vivado 并選擇 PYNQ-Z2 開(kāi)發(fā)板新建工程,調(diào)用封裝好的 IP 和開(kāi)發(fā)板上的 RAM 芯片 ZYNQ7000。
因?yàn)?ZYNQ7000 的從 AXI_HP 接口默認(rèn)不使用,所以需要手動(dòng)配置好這個(gè)端口。PS 端還需 要引出一個(gè)時(shí)鐘信號(hào)提供給 PL 端,其他參數(shù)在添加 PYNQ-Z2 開(kāi)發(fā)板時(shí)已經(jīng)基本設(shè)置妥當(dāng), 通過(guò)自動(dòng)連線(xiàn)生成的電路如圖 3-3 所示。
電路連接完成后即可開(kāi)始生成比特流 bit 文件,接著導(dǎo)出 Block Design 來(lái)生成 tcl 文件,之后的 PS 端調(diào)試需要調(diào)用這兩個(gè)文件來(lái)配置 PYNQ-Z2。圖 3-4 是生成比特流后的報(bào)告, 可以得到比 C 綜合報(bào)告更為真實(shí)的資源利用情況,此時(shí) LUT 資源利用率從 157%降至 71%, 所以 PYNQ-Z2 能夠滿(mǎn)足本論文設(shè)計(jì)的硬件電路的要求。
圖 3-5 顯示硬件電路的總片上功耗為 2.322W,功耗表現(xiàn)滿(mǎn)足預(yù)設(shè)目標(biāo)。圖 3-6 則具體顯示了片上各部分的功耗情況,其中總功耗中動(dòng)態(tài)功耗占了絕大部分,而 RAM 芯片功耗 則占據(jù)了 60%左右的動(dòng)態(tài)功耗。
3.1.4 PS 端開(kāi)發(fā)驗(yàn)證
在生成比特流文件和導(dǎo)出 Block Design 之后,即可開(kāi)始本次實(shí)驗(yàn)的最后一步,在 PS 端 編程來(lái)驗(yàn)證硬件代碼在 PYNQ-Z2 上能否完成目標(biāo)檢測(cè)任務(wù)。首先用網(wǎng)線(xiàn)將 PYNQ-Z2 與路 由器相連并通過(guò) USB 線(xiàn)供電,這樣 PYNQ-Z2 能夠聯(lián)網(wǎng),可以隨時(shí)從網(wǎng)上下載各種開(kāi)發(fā)包 和環(huán)境。由于 PYNQ-Z2 可以通過(guò) Samba 服務(wù)來(lái)共享文件夾,所以可以很方便地將比特流 文件,tcl 文件,輸入圖片和重新排序的網(wǎng)絡(luò)參數(shù)二進(jìn)制文件直接傳到 SD 卡上的 Jupyter Notebook 文件夾內(nèi)。
實(shí)驗(yàn)可以準(zhǔn)確地識(shí)別出圖 3-8 中的行人和圖 3-9 中的游客,證明本項(xiàng)目設(shè)計(jì)的硬件電路能夠完成目標(biāo)檢測(cè)任務(wù)。
3.2 實(shí)現(xiàn)功能與性能指標(biāo)
本項(xiàng)目 PYNQ-Z2 開(kāi)發(fā)板加速目標(biāo)檢測(cè)網(wǎng)絡(luò),可以在輸入圖片上標(biāo)出邊界框。又因?yàn)?PYNQ-Z2 的資源有限,本項(xiàng)目設(shè)計(jì)的硬件電路運(yùn)算速度還不到 200MFLOPS。但是該電路 可以根據(jù)所選開(kāi)發(fā)板的資源情況來(lái)例化適合的 1×1 逐點(diǎn)卷積運(yùn)算模塊數(shù)量,以此來(lái)提升運(yùn) 算速度。
從生成比特流的報(bào)告中可知硬件電路的總片上功耗為 2.322W,遠(yuǎn)小于預(yù)設(shè)的功耗 8W, 所以本論文優(yōu)化設(shè)計(jì)的 FPGA 加速電路在功耗方面滿(mǎn)足預(yù)期目標(biāo)。
接著需要考察另一個(gè)指標(biāo) IoU,也稱(chēng)為交并比,需要通過(guò)“預(yù)估的邊界框”與“實(shí)際 的邊界框”之間交集和并集的比值來(lái)計(jì)算。又因其要求嚴(yán)格,所以一般認(rèn)為目標(biāo)檢測(cè)結(jié)果IoU 大于 0.5 即可滿(mǎn)足精度要求。本次實(shí)驗(yàn)利用 DAC-SDC 訓(xùn)練集來(lái)訓(xùn)練網(wǎng)絡(luò)參數(shù),接著用 準(zhǔn)備的測(cè)試集圖片對(duì)訓(xùn)練好的網(wǎng)絡(luò)進(jìn)行測(cè)試,得到 IoU 約等于 0.573,所以本項(xiàng)目構(gòu)建的網(wǎng) 絡(luò)模型的準(zhǔn)確率也滿(mǎn)足預(yù)設(shè)目標(biāo)。
第四部分 總結(jié)
項(xiàng)目總結(jié)
本項(xiàng)目依據(jù) SkyNet 和 iSmart 網(wǎng)絡(luò)的設(shè)計(jì)原理,合理地構(gòu)建了一個(gè)主要由 3×3 逐通道卷積和 1×1 逐點(diǎn)卷積組成的輕量級(jí)卷積神經(jīng)網(wǎng)絡(luò)用來(lái)完成目標(biāo)檢測(cè)任務(wù),并專(zhuān)門(mén)為這兩類(lèi)卷積優(yōu)化設(shè)計(jì)了 FPGA 硬件加速電路模塊來(lái)提升卷積運(yùn)算速度,同時(shí)通過(guò)對(duì)卷積運(yùn)算模塊 的充分復(fù)用較好地節(jié)約了開(kāi)發(fā)板資源。
本項(xiàng)目在 PYNQ-Z2 開(kāi)發(fā)板上設(shè)計(jì)的硬件加速電路可以很好地完成目標(biāo)檢測(cè)任務(wù),輸出 的邊界框能夠準(zhǔn)確地框選出圖片中的行人或者物體。硬件電路總片上功耗只有 2.322W,而 IoU 可以達(dá)到 0.573,基本滿(mǎn)足了設(shè)計(jì)目標(biāo)。
【QQ交流群】群號(hào):173560979,進(jìn)群暗語(yǔ):FPGA技術(shù)江湖粉絲。
多年的FPGA企業(yè)開(kāi)發(fā)、培訓(xùn)經(jīng)驗(yàn),各種通俗易懂的學(xué)習(xí)資料以及學(xué)習(xí)方法,濃厚的交流學(xué)習(xí)氛圍,QQ群目前已有6000多名志同道合的小伙伴,無(wú)廣告純凈模式,給技術(shù)交流一片凈土,從初學(xué)小白到行業(yè)精英業(yè)界大佬等,從軍工領(lǐng)域到民用企業(yè)等,從通信、圖像處理到人工智能等各個(gè)方向應(yīng)有盡有,F(xiàn)PGA技術(shù)江湖打造最純凈最專(zhuān)業(yè)的技術(shù)交流學(xué)習(xí)平臺(tái)。