大俠好,歡迎來(lái)到FPGA技術(shù)江湖,江湖偌大,相見(jiàn)即是緣分。大俠可以關(guān)注FPGA技術(shù)江湖,在“闖蕩江湖”、"行俠仗義"欄里獲@取其他感興趣的資源,或者一起煮酒言歡?!爸缶蒲詺g”進(jìn)入IC技術(shù)圈,這里有近50個(gè)IC技術(shù)公眾號(hào)。
第一部分 設(shè)計(jì)概述
1.1 設(shè)計(jì)目的
近些年隨著人工智能技術(shù)的發(fā)展,深度神經(jīng)網(wǎng)絡(luò)算法逐步在星載、機(jī)載等遙感數(shù)據(jù)處理中得到廣泛應(yīng)用,在災(zāi)害預(yù)警及應(yīng)急、海洋應(yīng)用、環(huán)境監(jiān)測(cè)、國(guó)土資源等方面起到越來(lái)越重要的作用,如圖 1 所示。但衛(wèi)星、無(wú)人機(jī)等需要對(duì)遙感 圖像進(jìn)行實(shí)時(shí)處理的應(yīng)用場(chǎng)景,都對(duì)實(shí)現(xiàn)平臺(tái)具有嚴(yán)格的體積、重量、功耗的限制。而深度神經(jīng)網(wǎng)絡(luò)又具有運(yùn)算復(fù)雜度高、存儲(chǔ)帶寬需求大的特點(diǎn)。在高時(shí)效性要求與資源功耗等空間環(huán)境的強(qiáng)約束下,通用處理平臺(tái)難以支撐在軌人工智能 應(yīng)用的計(jì)算需求。這都使得人工智能技術(shù)在上述領(lǐng)域應(yīng)用面臨著巨大的挑戰(zhàn)。因此亟需開(kāi)展支持星載、機(jī)載人工智能應(yīng)用的核心硬件與基礎(chǔ)軟件技術(shù)研究。
為了解決上述問(wèn)題,我們提出了基于 FPGA 的深度卷積神經(jīng)網(wǎng)絡(luò)的核心硬件系統(tǒng)架構(gòu),并基于此架構(gòu)搭建了遙感圖像智能處理系統(tǒng)。該系統(tǒng)具有高性能、低功耗、延時(shí)低等特點(diǎn),可以為空間人工智能應(yīng)用提供支撐。
1.2 應(yīng)用領(lǐng)域
本作品在 FPGA 上實(shí)現(xiàn)了改進(jìn)后的 YOLOv2 目標(biāo)檢測(cè)網(wǎng)絡(luò),能夠完成對(duì)遙感場(chǎng)景下飛機(jī)、汽車(chē)、港口等多尺度、多類(lèi)型目標(biāo)的高精度快速檢測(cè)及分類(lèi),在海洋、水旱等監(jiān)測(cè)與應(yīng)急救災(zāi)等多領(lǐng)域中都可以發(fā)揮重要作用。此外,本作品相比于與 CPU、GPU 通用處理平臺(tái)功耗更低,并且具有同等功率下運(yùn)行效率高(能效比高)等優(yōu)勢(shì)。在星載、機(jī)載等資源受限的條件下,作品可以滿足深度神經(jīng)網(wǎng)絡(luò)的龐大的計(jì)算量與存儲(chǔ)需求,為遙感圖像的在線處理提供了可能。同時(shí),本作品為我們后續(xù)研制相關(guān) ASIC 芯片提供了前端驗(yàn)證。衛(wèi)星所獲取到的遙感圖像可以通過(guò)該芯片完成在軌實(shí)時(shí)處理,僅將有效信息下發(fā)地面站,從而減少星地鏈路的傳輸壓力。
1.3 主要技術(shù)特點(diǎn)
本設(shè)計(jì)提出了一種用于光學(xué)遙感目標(biāo)智能檢測(cè)識(shí)別的 FPGA 實(shí)現(xiàn)方法。
首先,我們選取 YOLOv2 作為基礎(chǔ)網(wǎng)絡(luò),對(duì)該網(wǎng)絡(luò)的結(jié)構(gòu)進(jìn)行了優(yōu)化。改進(jìn)后的網(wǎng)絡(luò)在多尺度、多類(lèi)型目標(biāo)的遙感圖像處理任務(wù)中表現(xiàn)出更優(yōu)的性能。并引入了基于對(duì)稱量化的混合精度運(yùn)算,降低了網(wǎng)絡(luò)中的浮點(diǎn)運(yùn)算規(guī)模,使該網(wǎng)絡(luò)更 適合部署在 FPGA 硬件平臺(tái)上。
其次,我們提出了一種卷積神經(jīng)網(wǎng)絡(luò)處理引擎,該引擎可以實(shí)現(xiàn)卷積神經(jīng)網(wǎng)絡(luò)中常見(jiàn)的操作,例如卷積、激活、池化等。該引擎還可以實(shí)現(xiàn)網(wǎng)絡(luò)中所涉及到 的多種卷積類(lèi)型。在此基礎(chǔ)上,我們充分挖掘神經(jīng)網(wǎng)絡(luò)中卷積運(yùn)算的并行運(yùn)算潛力,搭建運(yùn)算流水線結(jié)構(gòu),提高了處理性能。此外,我們還提出了一種有效的數(shù)據(jù)存儲(chǔ)和訪問(wèn)策略,該策略可實(shí)現(xiàn)低延遲計(jì)算和高存儲(chǔ)帶寬利用率。
最后,我們成功在 Xilinx VC709 上部署了改進(jìn)的 YOLOv2 網(wǎng)絡(luò)。與傳統(tǒng)實(shí) 現(xiàn)平臺(tái)相比,該作品在保證檢測(cè)精度的同時(shí),極大地降低了功耗和運(yùn)算復(fù)雜度, 更加適合部署在低功耗應(yīng)用場(chǎng)景。
1.4 主要?jiǎng)?chuàng)新點(diǎn)
(1) 面向 FPGA 對(duì)算法進(jìn)行優(yōu)化。采用混合精度神經(jīng)網(wǎng)絡(luò)處理方法,利用低位寬的整數(shù)運(yùn)算對(duì)部分浮點(diǎn)運(yùn)算進(jìn)行近似,從而優(yōu)化硬件結(jié)構(gòu),降低邏輯資源與存儲(chǔ)資源開(kāi)銷(xiāo)。
(2) 構(gòu)建通用可配置的向量處理引擎。由于改進(jìn)的 YOLOv2 網(wǎng)絡(luò)引入了空洞卷積、轉(zhuǎn)置卷積等多種類(lèi)型的卷積運(yùn)算,增大了部署在 FPGA 上的難度。因此我 們凝練多種卷積運(yùn)算類(lèi)型的共同處理特點(diǎn),提出了一種可配置的向量處理引擎。該引擎可以在 FPGA 上實(shí)現(xiàn)多類(lèi)型卷積運(yùn)算,節(jié)省了資源,且極大提高了設(shè)計(jì)的靈活性。
(3) 構(gòu)建適用于神經(jīng)網(wǎng)絡(luò)的并行處理策略。本設(shè)計(jì)挖掘神經(jīng)網(wǎng)絡(luò)中卷積運(yùn)算的并行運(yùn)算潛力,合理利用 FPGA 上的運(yùn)算資源,搭建運(yùn)算流水線結(jié)構(gòu),實(shí)現(xiàn)卷積神經(jīng)網(wǎng)絡(luò)前向推斷的高效處理。提高了處理性能。
(4) 搭建了基于 FPGA 的低功耗遙感圖像處理系統(tǒng)。與傳統(tǒng)的卷積神經(jīng)網(wǎng)絡(luò)的實(shí)現(xiàn)平臺(tái) GPU 相比,該作品的功耗要低一個(gè)數(shù)量級(jí)。同時(shí),在 DOTA 遙感數(shù)據(jù)集上的測(cè)試表明,本作品的檢測(cè)性能與 GPU 一致。因此本作品在功耗和處理速度之間取得折衷,在功耗受限的特定應(yīng)用場(chǎng)景中部署更具優(yōu)勢(shì)。
第二部分 系統(tǒng)組成及功能說(shuō)明
2.1 算法介紹
2.1.1 改進(jìn)的 YOLOv2 網(wǎng)絡(luò)結(jié)構(gòu)
近年來(lái),多種基于卷積神經(jīng)網(wǎng)絡(luò)的方法被提出,例如 R-CNN、SSD和 YOLO 等,都被廣泛用于深度學(xué)習(xí)領(lǐng)域的目標(biāo)檢測(cè)。與其他方法相比,YOLO 確保了準(zhǔn)確性和速度之間的極佳折衷。在本作品中,我們選用了一種改進(jìn)的 YOLOv2 網(wǎng)絡(luò)用于遙感物體檢測(cè)。該網(wǎng)絡(luò)采用了擴(kuò)展卷積和轉(zhuǎn)置卷積,從而提高了復(fù)雜光學(xué)遙感場(chǎng)景中 多尺度物體的性能。該網(wǎng)絡(luò)在模型復(fù)雜度和對(duì)象檢測(cè)性能之間進(jìn)行了權(quán)衡。其網(wǎng)絡(luò) 結(jié)構(gòu)如圖 2 所示,其中,基礎(chǔ)工作包含多個(gè)計(jì)算層,它們相互連接在一起。主要層 是卷積層,池化層,批量歸一化層和激活函數(shù)。
2.1.2 面向 FPGA 的量化策略
目前,多數(shù)的卷積神經(jīng)網(wǎng)絡(luò)訓(xùn)練后的網(wǎng)絡(luò)模型為浮點(diǎn)類(lèi)型。若采用該方式進(jìn)行前向推斷,所有運(yùn)算操作均為浮點(diǎn)類(lèi)型,會(huì)給 FPGA 實(shí)現(xiàn)帶來(lái)巨大的存儲(chǔ)和計(jì)算壓力。
針對(duì)上述問(wèn)題,我們采用了基于量化算法的深度神經(jīng)網(wǎng)絡(luò)混合精度計(jì)算方法, 利用低位寬的數(shù)據(jù)類(lèi)型進(jìn)行數(shù)據(jù)表達(dá)與計(jì)算,從而有效優(yōu)化硬件結(jié)構(gòu)設(shè)計(jì)。量化算法可看作對(duì)卷積神經(jīng)網(wǎng)絡(luò)模型進(jìn)行近似線性變換,在不改變卷積神經(jīng)網(wǎng)絡(luò)的運(yùn)算類(lèi)型與運(yùn)算結(jié)構(gòu)的前提下,將全浮點(diǎn)的網(wǎng)絡(luò)參數(shù)全部轉(zhuǎn)化為適合 FPGA 實(shí)現(xiàn)的整數(shù)型, 以此降低硬件加速器的復(fù)雜度;同時(shí)保持一定的浮點(diǎn)精度計(jì)算,支撐遙感圖像智能處理的海量計(jì)算需求。量化過(guò)程的示意圖如圖 3 所示。但是上述方法在訓(xùn)練階段難以直接實(shí)現(xiàn),這是由于整型表達(dá)導(dǎo)致了網(wǎng)絡(luò)不可導(dǎo)。此外,混合精度計(jì)算帶來(lái)一定的誤差,影響網(wǎng)絡(luò)處理性能。針對(duì)上述問(wèn)題,我們采用了模擬硬件處理的量化神經(jīng)網(wǎng)絡(luò)訓(xùn)練方法,有效保證低位寬數(shù)據(jù)表達(dá)網(wǎng)絡(luò)的正常訓(xùn)練,采用為了有效抑制量化推斷帶來(lái)的誤差。在前向推斷階段,應(yīng)用上述方法設(shè)計(jì)混合精度處理引擎,相比于浮點(diǎn)計(jì)算引擎,能夠大幅降低計(jì)算引擎所需資源。在有限的邏輯資源條件下,所能集成的引擎集成度大幅調(diào)高,系統(tǒng)處理能力及效率也隨之提高。
2.1.3 卷積神經(jīng)網(wǎng)絡(luò)基本功能層
1、卷積層
卷積層是卷積神經(jīng)網(wǎng)絡(luò)的核心處理,一個(gè)二維卷積的操作如圖 4 所示。一個(gè) 卷積層的內(nèi)部包含多個(gè)卷積核,每個(gè)卷積核的所有元素都對(duì)應(yīng)一個(gè)參數(shù),每個(gè)卷 積核對(duì)應(yīng)一個(gè)偏置。我們用 y 來(lái)表示圖像卷積后的輸出,用 i 和 j 來(lái)表示輸出圖 像的行和列,用 x 表示輸入圖像,用 w 表示卷積核的參數(shù),用m和n來(lái)表示卷 積核的行和列,M 和 N 表示卷積核的長(zhǎng)和寬,則卷積的過(guò)程遵循公式 1:
卷積示意圖如圖 4 所示:
卷積運(yùn)算是一種具有多層次循環(huán)的乘累加運(yùn)算。在神經(jīng)網(wǎng)絡(luò)中卷積運(yùn)算涉及的數(shù)據(jù)量很大,F(xiàn)PGA 的運(yùn)算單元有限,往往不能并行處理全部的輸入數(shù)據(jù);同時(shí) FPGA 片上存儲(chǔ)資源也是有限的,卷積運(yùn)算的大量原始圖像、參數(shù)與中間結(jié)果也不能完全存在片上,因此需要將運(yùn)算數(shù)據(jù)分塊處理。數(shù)據(jù)切分往往涉及多個(gè)維 度,并且當(dāng)原始數(shù)據(jù)被分塊時(shí),處理時(shí)會(huì)產(chǎn)生多個(gè)中間結(jié)果,中間結(jié)果可通過(guò)疊加得到最終結(jié)果。
2、批次規(guī)范化層
目前多數(shù)卷積神經(jīng)網(wǎng)絡(luò)會(huì)在卷積層后插入批次規(guī)范化層,其的定義如公式 2 所示:
其中,μ 和 σ 表示輸入特征圖的均值和標(biāo)準(zhǔn)差估計(jì)值。γ 和 β 是批歸一化層的學(xué)習(xí)參數(shù)。從公式上看批次規(guī)范化層可分為兩部分,第一部分是輸入的規(guī)范化;第二部分是在此基礎(chǔ)上進(jìn)行線性變換。從運(yùn)算類(lèi)型上來(lái)看,批次規(guī)范化層屬于像素級(jí)乘加運(yùn)算。
3、激活函數(shù)
卷積神經(jīng)網(wǎng)絡(luò)中每個(gè)神經(jīng)元節(jié)點(diǎn)都是接收上一層網(wǎng)絡(luò)的輸出值作為本層網(wǎng)絡(luò)的輸入值,并將本層網(wǎng)絡(luò)的操作結(jié)果傳遞給下一層。在多層的卷積神經(jīng)網(wǎng)絡(luò)之中,上一層的輸出值與下一層的輸入值之間會(huì)插入激活函數(shù),如圖 5 所示。
常用的激活函數(shù) ReLU 函數(shù)如公式 3 所示,圖 6 為 ReLU 激活函數(shù)示意圖。
ReLU 函數(shù)的本質(zhì)是與 0 做比較,大于 0 的數(shù)字保持不變,小于零的數(shù)值激活為 0,計(jì)算過(guò)程簡(jiǎn)單易于實(shí)現(xiàn)。但是 ReLU 函數(shù)也存在一定的問(wèn)題,對(duì)于負(fù)數(shù) 輸入可能會(huì)導(dǎo)致梯度彌散,因此也有網(wǎng)絡(luò)采用 LeakyReLU 作為激活或函數(shù)。LeakyReLU 是原始 ReLU 的一個(gè)變體,如公式 4 所示:
4、池化層
池化操作分為最大值池化與均值池化。在卷積神經(jīng)網(wǎng)絡(luò)中,卷積層后面往往跟著一個(gè)池化層。在卷積層提取完特征之后,會(huì)有一個(gè)池化層來(lái)對(duì)輸入特征圖像的信息進(jìn)行過(guò)濾,并且進(jìn)行特征選擇。
池化計(jì)算層的使用是模仿人類(lèi)大腦提取信息時(shí)的降維和抽象的過(guò)程。它主要有三個(gè)作用:
1)池化采樣使網(wǎng)絡(luò)模型降低了對(duì)特征位置的敏感程度,容許特征學(xué)習(xí)過(guò)程中一些特征位置細(xì)微改變的存在,讓網(wǎng)絡(luò)在處理圖像扭曲方面的能力得到增強(qiáng);
2)池化層又稱降采樣層,它降低了特征映射圖的維度,同時(shí)減小了下一層 計(jì)算輸入的數(shù)據(jù)規(guī)模,進(jìn)而減小計(jì)算量和參數(shù)個(gè)數(shù),這對(duì)于硬件實(shí)現(xiàn)是非常有利的;
3)池化層在一定程度上能夠降低數(shù)據(jù)過(guò)擬合的風(fēng)險(xiǎn)。池化操作主要是將單個(gè)點(diǎn)的結(jié)果替換為某個(gè)區(qū)域的特征統(tǒng)計(jì)量。均值池化在相鄰的 2×2 的區(qū)域內(nèi),將四個(gè)數(shù)求和再求平均值,得到輸出結(jié)果,用四個(gè)像素點(diǎn) 的平均值來(lái)代替這一區(qū)域的像素值;最大值池在相鄰 2×2 區(qū)域內(nèi)的最大值來(lái)代替這一區(qū)域的像素值,如圖 7 所示。
2.2 整體系統(tǒng)介紹
神經(jīng)網(wǎng)絡(luò)算法處理過(guò)程均具備可并行度高、可復(fù)用度高、處理數(shù)據(jù)量大、處理流程復(fù)雜的特點(diǎn),可歸類(lèi)為數(shù)據(jù)流驅(qū)動(dòng)的運(yùn)算密集型處理過(guò)程。為了滿足以上處理特點(diǎn),需要設(shè)計(jì)大規(guī)模的處理陣列進(jìn)行并行處理,為滿足這一條件本方案采用 Xilinx VC709 板卡作為實(shí)現(xiàn)平臺(tái)。Xilinx VC709 板卡上核心 FPGA 為 XC7V690T,配備獨(dú)立雙通道 DDR3(512bit@200MHz)?;谠撈脚_(tái),本方案設(shè)計(jì)了神經(jīng)網(wǎng)絡(luò)硬件加速系統(tǒng)架構(gòu),如圖 8 所示。
我們所提出的神經(jīng)網(wǎng)絡(luò)硬件加速系統(tǒng)架構(gòu)主要包括 3 個(gè)子系統(tǒng):
1、處理引擎子系統(tǒng)
該子系統(tǒng)負(fù)責(zé)神經(jīng)網(wǎng)絡(luò)具體算法的實(shí)施,主要完成計(jì)算處理的任務(wù)。神經(jīng)網(wǎng) 絡(luò)處理引擎陣列由 32 個(gè)處理引擎組成,每個(gè)處理引擎由 32 個(gè)乘累加器構(gòu)成,進(jìn)行高并行向量乘加運(yùn)算。
除引擎陣列外,該子系統(tǒng)配有相應(yīng)的輸入與輸出控制,輸入控制負(fù)責(zé)從輸入存儲(chǔ)子系統(tǒng)獲取原始數(shù)據(jù);輸出控制負(fù)責(zé)實(shí)現(xiàn)中間結(jié)果與最終結(jié)果的存儲(chǔ)路由。處理引擎子系統(tǒng)的所有控制需要與主狀態(tài)機(jī)進(jìn)行交互。
2、存儲(chǔ)子系統(tǒng)
存儲(chǔ)子系統(tǒng)實(shí)現(xiàn)對(duì)內(nèi)外部的存儲(chǔ)模塊進(jìn)行管理,可分為存儲(chǔ)器單元以及存儲(chǔ)路由控制。
存儲(chǔ)器單元:用于實(shí)現(xiàn)數(shù)據(jù)緩沖,分為外部存儲(chǔ)器和內(nèi)部存儲(chǔ)器。外部存儲(chǔ)器采用 2 片容量大、順序訪問(wèn)速度快的 DDR 芯片,用于保存原始數(shù)據(jù)與模型參數(shù),數(shù)據(jù)緩沖周期長(zhǎng)的數(shù)據(jù)保存在其中,內(nèi)部存儲(chǔ)器采用訪問(wèn)速度快、位寬大、 功耗低、容量小、可隨機(jī)訪問(wèn)的 BRAM,用于緩存部分?jǐn)?shù)據(jù)及數(shù)據(jù)運(yùn)算中間結(jié)果,數(shù)據(jù)緩沖周期短的數(shù)據(jù)保存在其中。為保證不同圖像處理引擎訪問(wèn)存儲(chǔ)器單元時(shí)不發(fā)生數(shù)據(jù)堵塞,將存儲(chǔ)空間劃分成不同容量的獨(dú)立子存儲(chǔ)單元。內(nèi)部緩存包括:輸入特征圖緩沖區(qū)、參數(shù)緩沖區(qū)、輸出特征圖緩沖區(qū)以及中間結(jié)果緩沖區(qū)。
存儲(chǔ)路由控制:每個(gè)子存儲(chǔ)單元通過(guò)輸入/輸出接口與存儲(chǔ)仲裁單元相連,處理引擎也通過(guò)數(shù)據(jù)訪問(wèn)接口與存儲(chǔ)仲裁單元相連,可實(shí)現(xiàn)多通道引擎和存儲(chǔ)器之間的訪問(wèn)映射。內(nèi)部存儲(chǔ)器與處理引擎陣列子系統(tǒng)間的內(nèi)存訪問(wèn)映射由主狀態(tài)進(jìn)行配置。
3、指令處理子系統(tǒng)
指令處理子系統(tǒng)又指令隊(duì)列、指令解碼器、主狀態(tài)機(jī)構(gòu)成。指令隊(duì)列從外部接收指令需要處理的指令并儲(chǔ)存,所有指令順序排列,先入先出。指令解碼器負(fù)責(zé)從指令隊(duì)列中取出指令,進(jìn)行指令解析并傳輸給主狀態(tài)機(jī)。主狀態(tài)機(jī)將存儲(chǔ)訪問(wèn)指令傳輸至存儲(chǔ)子系統(tǒng),用于配置該條指令的數(shù)據(jù)讀/寫(xiě)通路;將處理指令傳輸至處理引擎子系統(tǒng),用于選擇處理算法引擎與配置引擎參數(shù)。主狀態(tài)在算法處理過(guò)程中與存儲(chǔ)子系統(tǒng)和處理引擎子系統(tǒng)均進(jìn)行交互,以實(shí)現(xiàn)流程控制。當(dāng)指令隊(duì)列中所有指令全部處理完成后,從外部繼續(xù)接受下一批處理指令,直至指令全部處理完成。
2.3 各模塊介紹
2.3.1 指令處理子系統(tǒng)
接收解析后的指令,對(duì)各個(gè)模塊進(jìn)行配置。主狀態(tài)機(jī)將存儲(chǔ)訪問(wèn)指令傳輸至存儲(chǔ)子系統(tǒng),用于配置該條指令的數(shù)據(jù)讀/寫(xiě)通路;將處理指令傳輸至處理引擎子系統(tǒng),用于選擇處理算法引擎與配置引擎參數(shù)。主狀態(tài)在算法處理過(guò)程中與存儲(chǔ)子系統(tǒng)和處理引擎子系統(tǒng)均進(jìn)行交互,以實(shí)現(xiàn)流程控制。
如圖 9 所示,主狀態(tài)機(jī)由狀態(tài)切換模塊和狀態(tài)輸出模塊組成。用于配置信息和模塊間的握手。
2.3.2 處理引擎子系統(tǒng)
該模塊包含三個(gè)功能,分別是卷積運(yùn)算、批量標(biāo)準(zhǔn)化(BN)融合層運(yùn)算、激活 融合層運(yùn)算。本設(shè)計(jì)方案中的運(yùn)算模塊最多可對(duì) 32 個(gè)輸入通道的數(shù)據(jù)進(jìn)行乘累 加運(yùn)算,并將 32 個(gè)輸出通道的結(jié)果并行輸出。
為了令我們的處理引擎子系統(tǒng)可以適用于多種卷積類(lèi)型在 FPGA 上的實(shí)現(xiàn), 我們對(duì)卷積運(yùn)算進(jìn)行了分析和改進(jìn)。以常規(guī)卷積層為例,以單張圖計(jì)算 (BatchSize=1),其輸入特張圖張量為三維張量 Tensor(Nif, NH, NW),權(quán)重參數(shù) 為四維度張量 Tensor(Nof, Nif, Nkh, Nkw),輸出特征圖為三維張量 Tensor(Nof, NH, NW)。其中 Nif、NH、NW為分別表示輸入特征圖張量的輸入通道數(shù)、高、寬;Nkh、 Nkw為卷積核的高、寬;Nof為輸出特征圖張量的輸出通道數(shù)其計(jì)算公式
卷積運(yùn)算可看為兩部分,上三層循環(huán)為輸出結(jié)果索引不參與疊加過(guò)程,下三 層循環(huán)為卷積計(jì)算核心部分。下三層循環(huán)計(jì)算可看作圖 12 中綠色立方體與紫色立方體的對(duì)應(yīng)點(diǎn)乘法后再求和。目前已有的工程中我們按照上述循環(huán)展開(kāi)方式進(jìn)行設(shè)計(jì),首先計(jì)算二維卷積核內(nèi)部計(jì)算,而后通過(guò)循環(huán)疊加將所有輸入通道進(jìn)行 組合。但是這種方案在支持多種卷積運(yùn)算時(shí)需要進(jìn)行數(shù)據(jù)讀取重排序,在硬件實(shí)現(xiàn)時(shí)數(shù)據(jù)流控制較難。此外,卷積運(yùn)算是一種具有多層次循環(huán)的乘累加運(yùn)算。在神經(jīng)網(wǎng)絡(luò)中卷積運(yùn)算涉及的數(shù)據(jù)量很大,F(xiàn)PGA 的運(yùn)算單元有限,往往不能并行處理全部的輸入數(shù)據(jù);同時(shí) FPGA 片上存儲(chǔ)資源也是有限的,卷積運(yùn)算的大量原始圖像、參數(shù)與中間結(jié)果也不能完全存在片上,因此需要將運(yùn)算數(shù)據(jù)分塊處理。數(shù)據(jù)切分往往涉及多個(gè)維度,并且當(dāng)原始數(shù)據(jù)被分塊時(shí),處理時(shí)會(huì)產(chǎn)生多個(gè)中間結(jié)果,中間結(jié)果可通過(guò)疊加得到最終結(jié)果。
針對(duì)上述問(wèn)題,本方案采用了循環(huán)變換。對(duì)圖 10 中公式進(jìn)行循環(huán)變換,將 Loop{1, 2, 3, 4}的順序變換為 Loop{2, 3, 1, 4},循環(huán)變換后的卷積運(yùn)算公式如圖 11 所示。
從上述公式可以看出,經(jīng)過(guò)循環(huán)變換后的卷積計(jì)算在運(yùn)算類(lèi)型和運(yùn)算數(shù)量上沒(méi)有任何變化,只改變了循環(huán)疊加順序。根據(jù)上述公式進(jìn)行卷積運(yùn)算可以分解為兩個(gè)步驟:
1、特征圖均按照輸入通道維度進(jìn)行數(shù)據(jù)采樣,采樣的數(shù)據(jù)構(gòu)成特征圖向量, 其維度為(1, Nif,)。卷積核采用按輸出通道進(jìn)行同位置獨(dú)立采樣(第一次運(yùn)算時(shí)為所有輸出通道卷積核第一行第一個(gè)點(diǎn)的所有輸入通道數(shù)據(jù)),采樣后的數(shù)據(jù)構(gòu)成二維矩陣,其維度為(Nif, Nof)。采用后的特征圖向量與卷積核矩陣進(jìn)行向量乘矩陣運(yùn)算,即可得到特征圖結(jié)果向量,其維度為(1, Nof),這些結(jié)果對(duì)應(yīng)輸出特征圖第一行第一個(gè)點(diǎn)的所有通道數(shù)據(jù)。該過(guò)程如圖 12 所示。
2、向右向下(向右至行尾后,從第二行第一個(gè)點(diǎn)開(kāi)始)依次取特征圖向量, 此過(guò)程可以看作是步驟 1 中采樣位置在特征圖張量上的向右向下依次滑動(dòng)。保持步驟 1 中的卷積核矩陣不變,重復(fù)步驟 1 即可獲得所有輸出特征圖中間結(jié)果,其 過(guò)程如圖 12 所示。
3、向右向下依次卷積核向量構(gòu)成卷積核矩陣,重復(fù)步驟 1、2,獲得第二組中間結(jié)果,這些中間結(jié)果與步驟 2 中所有結(jié)果進(jìn)行對(duì)應(yīng)位置相加,最終獲得所有輸出結(jié)果。應(yīng)用此方法能夠突破原有方案中卷積核尺寸限制以及卷積類(lèi)型的限制,通過(guò)循環(huán)疊加次數(shù)來(lái)實(shí)現(xiàn)不同尺寸卷積運(yùn)算。
卷積運(yùn)算模塊主要由卷積輸入控制模塊、卷積輸出控制模塊、卷積計(jì)算陣列模塊和卷積狀態(tài)控制、BN 輸入控制模塊、BN 融合模塊、激活融合模塊組成。圖 13 為卷積運(yùn)算模塊的結(jié)構(gòu)框圖。
其中卷積計(jì)算陣列模塊包含 32 個(gè)計(jì)算單元(PE),每一個(gè) PE 能一次完成 32 個(gè)數(shù)的乘累加運(yùn)算。整個(gè)系統(tǒng)設(shè)計(jì)中包含 32 個(gè)并行排列的 PE。每個(gè) PE 內(nèi)部由 32 個(gè)乘累加器組成,接收輸入特征圖、卷積核及中間結(jié)果。如圖 14 所示,每 個(gè) PE 內(nèi)部的 32 個(gè) MAC 相互級(jí)聯(lián),主要針對(duì)常規(guī)的卷積運(yùn)算。
BN 運(yùn)算模塊中包含 32 個(gè) BN 處理單元,可以同時(shí)計(jì)算 32 個(gè)點(diǎn)的批量標(biāo)準(zhǔn)化及反量化運(yùn)算,分別對(duì)應(yīng) 32 個(gè)計(jì)算通道。每個(gè)計(jì)算單元中主要執(zhí)行 3 步運(yùn)算。定點(diǎn)轉(zhuǎn)浮點(diǎn)、浮點(diǎn)乘法、浮點(diǎn)加法。如圖 15 所示:
激活運(yùn)算模塊中包含 32 個(gè)激活處理單元,可以同時(shí)計(jì)算 32 個(gè)點(diǎn)的激活及量化運(yùn)算。本層的兩個(gè)參數(shù)存儲(chǔ)在片上的兩塊 ROM 中,在換層時(shí)會(huì)提前被讀出, 通過(guò)判斷當(dāng)前點(diǎn)的正負(fù)來(lái)參與運(yùn)算。此外,本模塊還會(huì)進(jìn)行一個(gè)定點(diǎn)轉(zhuǎn)浮點(diǎn)的運(yùn)算。從而得到了 8bit 定點(diǎn)的輸出結(jié)果。如圖 16 所示:
2.3.3 輸入特征圖緩存模塊
輸入特征圖緩存模塊的功能是暫存來(lái)自 DDR 控制器發(fā)送的輸入特征圖數(shù)據(jù),并對(duì)運(yùn)算模塊發(fā)出的讀請(qǐng)求進(jìn)行響應(yīng),按照所需的數(shù)據(jù)順序進(jìn)行讀出。
輸入特征圖緩存模塊由寫(xiě)控制、讀控制、請(qǐng)求處理控制、片上存儲(chǔ)體組成, 如圖 17 所示。其中,存儲(chǔ)體是一塊數(shù)據(jù)位寬為 256 的 BRAM 構(gòu)成。大小為 1MB
2.3.4 卷積核緩沖模塊
卷積核緩存模塊的功能是對(duì)卷積核數(shù)據(jù)進(jìn)行緩存,并處理來(lái)著卷積運(yùn)算模塊的讀請(qǐng)求,將數(shù)據(jù)按特定的順序反復(fù)讀出。該緩存模塊能夠同時(shí)存儲(chǔ) 32 個(gè)輸出通道的卷積核。
卷積核緩存模塊由寫(xiě)控制、讀控制、請(qǐng)求處理控制、片上存儲(chǔ)體組成,如圖 18 所示。其中,存儲(chǔ)體是 32 塊數(shù)據(jù)位寬為 256 的 BRAM 構(gòu)成,大小為 1MB。
2.3.5 中間緩存模塊
中間緩存模塊的功能是對(duì)卷積運(yùn)算模塊輸出的中間結(jié)果進(jìn)行緩沖,當(dāng)卷積運(yùn)算完成時(shí),為卷積后續(xù)的 BN 模塊提供數(shù)據(jù)。
如圖 19 所示,中間緩存模塊由讀控制、寫(xiě)控制以及 FIFO 存儲(chǔ)陣列組成,其中 FIFOs 由 32 個(gè)端口位寬位 32 的 FIFO 組成??偞笮?10243232b。
2.3.6 輸出緩存模塊
輸出緩存模塊用于存儲(chǔ)經(jīng)過(guò) BN,融合等操作的計(jì)算結(jié)果。當(dāng)存儲(chǔ)的數(shù)據(jù)達(dá)到預(yù)設(shè)值時(shí),向 DDR 發(fā)送數(shù)據(jù),該緩沖區(qū)大小為 1MB。
輸出緩存模塊由參數(shù)配置、讀控制、寫(xiě)控制、交互控制和存儲(chǔ)體組成,如圖 20 所示。
第三部分 完成情況及性能參數(shù)
3.1 測(cè)試平臺(tái)搭建
本作品在 Xilinx VC709 板卡上實(shí)現(xiàn)了改進(jìn)版 YOLOv2 目標(biāo)檢測(cè)算法。硬件 部分已完成了指令處理子系統(tǒng)、處理引擎子系統(tǒng)以及存儲(chǔ)子系統(tǒng)。其中,處理引擎子系統(tǒng)包含了普通、轉(zhuǎn)置、空洞卷積,以及池化、激活等操作,滿足本設(shè)計(jì)所采用的改進(jìn)版 YOLOv2 的運(yùn)算需求。
本作品的具體測(cè)試平臺(tái)包括上位機(jī)演示系統(tǒng)、Xilinx Zedboard 板卡以及 Xilinx VC709 板卡。其中,Zedboard 板卡和 VC709 板卡通過(guò) FMC 連接器交互, 如圖 21 所示。本作品具體運(yùn)行流程如下:
1、上位機(jī)演示系統(tǒng)負(fù)責(zé)前端界面的顯示,并完成待檢測(cè)圖片的加載、回傳結(jié)果的后處理及展示。待檢測(cè)圖片和回傳結(jié)果經(jīng)由網(wǎng)線傳輸。
2、Zedboard 板卡負(fù)責(zé) Linux 操作系統(tǒng)及驅(qū)動(dòng)的加載,并接收上位機(jī)傳送的待測(cè)圖片,并將待測(cè)圖片、YOLOv2 配置指令和相關(guān)參數(shù)經(jīng)由 FMC 連接器送與 VC709 板卡處理,檢測(cè)結(jié)果通過(guò) FMC 連接器返回,并發(fā)往上位機(jī)。
3、VC709 板卡完成了指令處理子系統(tǒng)、處理引擎子系統(tǒng)以及存儲(chǔ)子系統(tǒng)的實(shí)現(xiàn),該板卡根據(jù)卷積神經(jīng)網(wǎng)絡(luò)的配置指令和參數(shù),對(duì)待測(cè)圖像進(jìn)行檢測(cè),并通 過(guò) FMC 連接器將檢測(cè)結(jié)果返回給 Zedboard。
3.2 軟硬件環(huán)境介紹
1、FPGA 板卡:Xilinx Zedboard 和 Xilinx VC709
2、數(shù)據(jù)傳輸:雙絞線、FMC 連接器
3、設(shè)計(jì)軟件:Xilinx Vivado 2019.2
4、用于對(duì)網(wǎng)絡(luò)結(jié)果進(jìn)行后處理及界面顯示的上位機(jī)
3.3 性能指標(biāo)
1、準(zhǔn)確性:利用 GPU 平臺(tái)改進(jìn)的 YOLOv2 網(wǎng)絡(luò)在 DOTA 遙感數(shù)據(jù)集上測(cè)試,mAP 指標(biāo)可以達(dá)到 69.0。我們?cè)?FPGA 上所實(shí)現(xiàn)的該深度卷積神經(jīng)網(wǎng)絡(luò)的測(cè)試結(jié)果與 GPU 平臺(tái)運(yùn)行結(jié)果一致,保證了作品的準(zhǔn)確性。
2、運(yùn)行效率:基于改進(jìn)的 YOLOv2 網(wǎng)絡(luò),對(duì)單張尺寸為 1024x1024 的圖像進(jìn)行多目標(biāo)檢測(cè)的處理時(shí)間為 0.9248 秒。若加上數(shù)據(jù)傳輸、結(jié)果后處理以及圖像顯示等過(guò)程,單張圖像的處理及展示時(shí)間約為 1.5 秒。(在視頻展示時(shí),多張 圖測(cè)試過(guò)程中,由于作品的處理速度快于每張圖所展示的時(shí)長(zhǎng),所以可以看到原圖和檢測(cè)結(jié)果幾乎同時(shí)顯示。)
3、功耗:本作品在 200M 的時(shí)鐘頻率下,總功耗為 16W,單位功耗處理能力為 25GOPs/W。與 GPU 平臺(tái)相比,具有更低的功耗和更優(yōu)的能耗比。因此本作品更適合部署在對(duì)實(shí)現(xiàn)平臺(tái)的體積、重量、功耗有限制的應(yīng)用環(huán)境中。
3.4 FPGA 資源利用率
本作品 FPGA 資源占用情況如表 1 所示,其中 DSP 占用了 65.78%,BRAM 占用了 54.01%,資源使用情況合理。該硬件平臺(tái)能夠有效部署 YOLOv2 目標(biāo)檢測(cè)網(wǎng)絡(luò),實(shí)現(xiàn)多尺度、多類(lèi)型目標(biāo)的高精度快速檢測(cè)及分類(lèi)。
3.5 結(jié)果演示
本作品基于改進(jìn)的 YOLOv2 網(wǎng)絡(luò),在實(shí)現(xiàn)飛機(jī)、車(chē)輛等多目標(biāo)的檢測(cè)的同時(shí), 可實(shí)現(xiàn)多檢測(cè)目標(biāo)的分類(lèi),其上位機(jī)界面顯示結(jié)果如圖 23 所示。
第四部分 總結(jié)
可擴(kuò)展之處
(1)目前卷積神經(jīng)網(wǎng)絡(luò)的部署仍采用人工方式生成對(duì)應(yīng)的指令代碼,未來(lái)可結(jié)合軟件編譯工具,是指令代碼生成自動(dòng)化,從而達(dá)到多種網(wǎng)絡(luò)的動(dòng)態(tài)部署和資源的動(dòng)態(tài)分配。
(2)目前該作品暫不支持深度可分離卷積、分組卷積和 Shortcut 等運(yùn)算方式,未來(lái)可在處理引擎子系統(tǒng)上進(jìn)行擴(kuò)展,進(jìn)一步提高該作品的通用性。
(3)目前我們?cè)?FPGA 上實(shí)現(xiàn)了深度卷積神經(jīng)網(wǎng)絡(luò)。但 FPGA 作為一種通用處理器,其處理性能和功耗控制都存在瓶頸。因此后續(xù)我們會(huì)以本作品為基礎(chǔ), 設(shè)計(jì)與開(kāi)發(fā)用于遙感圖像在軌實(shí)時(shí)處理的 ASIC 芯片。