

近些年隨著人工智能技術的發展,深度神經網絡算法逐步在星載、機載等遙感數據處理中得到廣泛應用,在災害預警及應急、海洋應用、環境監測、國土資源等方面起到越來越重要的作用,如圖 1 所示。但衛星、無人機等需要對遙感 圖像進行實時處理的應用場景,都對實現平臺具有嚴格的體積、重量、功耗的限制。而深度神經網絡又具有運算復雜度高、存儲帶寬需求大的特點。在高時效性要求與資源功耗等空間環境的強約束下,通用處理平臺難以支撐在軌人工智能 應用的計算需求。這都使得人工智能技術在上述領域應用面臨著巨大的挑戰。因此亟需開展支持星載、機載人工智能應用的核心硬件與基礎軟件技術研究。

為了解決上述問題,我們提出了基于 FPGA 的深度卷積神經網絡的核心硬件系統架構,并基于此架構搭建了遙感圖像智能處理系統。該系統具有高性能、低功耗、延時低等特點,可以為空間人工智能應用提供支撐。
本作品在 FPGA 上實現了改進后的 YOLOv2 目標檢測網絡,能夠完成對遙感場景下飛機、汽車、港口等多尺度、多類型目標的高精度快速檢測及分類,在海洋、水旱等監測與應急救災等多領域中都可以發揮重要作用。此外,本作品相比于與 CPU、GPU 通用處理平臺功耗更低,并且具有同等功率下運行效率高(能效比高)等優勢。在星載、機載等資源受限的條件下,作品可以滿足深度神經網絡的龐大的計算量與存儲需求,為遙感圖像的在線處理提供了可能。同時,本作品為我們后續研制相關 ASIC 芯片提供了前端驗證。衛星所獲取到的遙感圖像可以通過該芯片完成在軌實時處理,僅將有效信息下發地面站,從而減少星地鏈路的傳輸壓力。
本設計提出了一種用于光學遙感目標智能檢測識別的 FPGA 實現方法。
首先,我們選取 YOLOv2 作為基礎網絡,對該網絡的結構進行了優化。改進后的網絡在多尺度、多類型目標的遙感圖像處理任務中表現出更優的性能。并引入了基于對稱量化的混合精度運算,降低了網絡中的浮點運算規模,使該網絡更 適合部署在 FPGA 硬件平臺上。
其次,我們提出了一種卷積神經網絡處理引擎,該引擎可以實現卷積神經網絡中常見的操作,例如卷積、激活、池化等。該引擎還可以實現網絡中所涉及到 的多種卷積類型。在此基礎上,我們充分挖掘神經網絡中卷積運算的并行運算潛力,搭建運算流水線結構,提高了處理性能。此外,我們還提出了一種有效的數據存儲和訪問策略,該策略可實現低延遲計算和高存儲帶寬利用率。
最后,我們成功在 Xilinx VC709 上部署了改進的 YOLOv2 網絡。與傳統實 現平臺相比,該作品在保證檢測精度的同時,極大地降低了功耗和運算復雜度, 更加適合部署在低功耗應用場景。
(1) 面向 FPGA 對算法進行優化。采用混合精度神經網絡處理方法,利用低位寬的整數運算對部分浮點運算進行近似,從而優化硬件結構,降低邏輯資源與存儲資源開銷。
(2) 構建通用可配置的向量處理引擎。由于改進的 YOLOv2 網絡引入了空洞卷積、轉置卷積等多種類型的卷積運算,增大了部署在 FPGA 上的難度。因此我 們凝練多種卷積運算類型的共同處理特點,提出了一種可配置的向量處理引擎。該引擎可以在 FPGA 上實現多類型卷積運算,節省了資源,且極大提高了設計的靈活性。
(3) 構建適用于神經網絡的并行處理策略。本設計挖掘神經網絡中卷積運算的并行運算潛力,合理利用 FPGA 上的運算資源,搭建運算流水線結構,實現卷積神經網絡前向推斷的高效處理。提高了處理性能。
(4) 搭建了基于 FPGA 的低功耗遙感圖像處理系統。與傳統的卷積神經網絡的實現平臺 GPU 相比,該作品的功耗要低一個數量級。同時,在 DOTA 遙感數據集上的測試表明,本作品的檢測性能與 GPU 一致。因此本作品在功耗和處理速度之間取得折衷,在功耗受限的特定應用場景中部署更具優勢。
近年來,多種基于卷積神經網絡的方法被提出,例如 R-CNN、SSD和 YOLO 等,都被廣泛用于深度學習領域的目標檢測。與其他方法相比,YOLO 確保了準確性和速度之間的極佳折衷。在本作品中,我們選用了一種改進的 YOLOv2 網絡用于遙感物體檢測。該網絡采用了擴展卷積和轉置卷積,從而提高了復雜光學遙感場景中 多尺度物體的性能。該網絡在模型復雜度和對象檢測性能之間進行了權衡。其網絡 結構如圖 2 所示,其中,基礎工作包含多個計算層,它們相互連接在一起。主要層 是卷積層,池化層,批量歸一化層和激活函數。

目前,多數的卷積神經網絡訓練后的網絡模型為浮點類型。若采用該方式進行前向推斷,所有運算操作均為浮點類型,會給 FPGA 實現帶來巨大的存儲和計算壓力。
針對上述問題,我們采用了基于量化算法的深度神經網絡混合精度計算方法, 利用低位寬的數據類型進行數據表達與計算,從而有效優化硬件結構設計。量化算法可看作對卷積神經網絡模型進行近似線性變換,在不改變卷積神經網絡的運算類型與運算結構的前提下,將全浮點的網絡參數全部轉化為適合 FPGA 實現的整數型, 以此降低硬件加速器的復雜度;同時保持一定的浮點精度計算,支撐遙感圖像智能處理的海量計算需求。量化過程的示意圖如圖 3 所示。但是上述方法在訓練階段難以直接實現,這是由于整型表達導致了網絡不可導。此外,混合精度計算帶來一定的誤差,影響網絡處理性能。針對上述問題,我們采用了模擬硬件處理的量化神經網絡訓練方法,有效保證低位寬數據表達網絡的正常訓練,采用為了有效抑制量化推斷帶來的誤差。在前向推斷階段,應用上述方法設計混合精度處理引擎,相比于浮點計算引擎,能夠大幅降低計算引擎所需資源。在有限的邏輯資源條件下,所能集成的引擎集成度大幅調高,系統處理能力及效率也隨之提高。

1、卷積層
卷積層是卷積神經網絡的核心處理,一個二維卷積的操作如圖 4 所示。一個 卷積層的內部包含多個卷積核,每個卷積核的所有元素都對應一個參數,每個卷 積核對應一個偏置。我們用 y 來表示圖像卷積后的輸出,用 i 和 j 來表示輸出圖 像的行和列,用 x 表示輸入圖像,用 w 表示卷積核的參數,用m和n來表示卷 積核的行和列,M 和 N 表示卷積核的長和寬,則卷積的過程遵循公式 1:

卷積示意圖如圖 4 所示:

卷積運算是一種具有多層次循環的乘累加運算。在神經網絡中卷積運算涉及的數據量很大,FPGA 的運算單元有限,往往不能并行處理全部的輸入數據;同時 FPGA 片上存儲資源也是有限的,卷積運算的大量原始圖像、參數與中間結果也不能完全存在片上,因此需要將運算數據分塊處理。數據切分往往涉及多個維 度,并且當原始數據被分塊時,處理時會產生多個中間結果,中間結果可通過疊加得到最終結果。
2、批次規范化層
目前多數卷積神經網絡會在卷積層后插入批次規范化層,其的定義如公式 2 所示:

其中,μ 和 σ 表示輸入特征圖的均值和標準差估計值。γ 和 β 是批歸一化層的學習參數。從公式上看批次規范化層可分為兩部分,第一部分是輸入的規范化;第二部分是在此基礎上進行線性變換。從運算類型上來看,批次規范化層屬于像素級乘加運算。
3、激活函數
卷積神經網絡中每個神經元節點都是接收上一層網絡的輸出值作為本層網絡的輸入值,并將本層網絡的操作結果傳遞給下一層。在多層的卷積神經網絡之中,上一層的輸出值與下一層的輸入值之間會插入激活函數,如圖 5 所示。

常用的激活函數 ReLU 函數如公式 3 所示,圖 6 為 ReLU 激活函數示意圖。

ReLU 函數的本質是與 0 做比較,大于 0 的數字保持不變,小于零的數值激活為 0,計算過程簡單易于實現。但是 ReLU 函數也存在一定的問題,對于負數 輸入可能會導致梯度彌散,因此也有網絡采用 LeakyReLU 作為激活或函數。LeakyReLU 是原始 ReLU 的一個變體,如公式 4 所示:

4、池化層
池化操作分為最大值池化與均值池化。在卷積神經網絡中,卷積層后面往往跟著一個池化層。在卷積層提取完特征之后,會有一個池化層來對輸入特征圖像的信息進行過濾,并且進行特征選擇。
池化計算層的使用是模仿人類大腦提取信息時的降維和抽象的過程。它主要有三個作用:
1)池化采樣使網絡模型降低了對特征位置的敏感程度,容許特征學習過程中一些特征位置細微改變的存在,讓網絡在處理圖像扭曲方面的能力得到增強;
2)池化層又稱降采樣層,它降低了特征映射圖的維度,同時減小了下一層 計算輸入的數據規模,進而減小計算量和參數個數,這對于硬件實現是非常有利的;
3)池化層在一定程度上能夠降低數據過擬合的風險。池化操作主要是將單個點的結果替換為某個區域的特征統計量。均值池化在相鄰的 2×2 的區域內,將四個數求和再求平均值,得到輸出結果,用四個像素點 的平均值來代替這一區域的像素值;最大值池在相鄰 2×2 區域內的最大值來代替這一區域的像素值,如圖 7 所示。

神經網絡算法處理過程均具備可并行度高、可復用度高、處理數據量大、處理流程復雜的特點,可歸類為數據流驅動的運算密集型處理過程。為了滿足以上處理特點,需要設計大規模的處理陣列進行并行處理,為滿足這一條件本方案采用 Xilinx VC709 板卡作為實現平臺。Xilinx VC709 板卡上核心 FPGA 為 XC7V690T,配備獨立雙通道 DDR3(512bit@200MHz)。基于該平臺,本方案設計了神經網絡硬件加速系統架構,如圖 8 所示。

我們所提出的神經網絡硬件加速系統架構主要包括 3 個子系統:
1、處理引擎子系統
該子系統負責神經網絡具體算法的實施,主要完成計算處理的任務。神經網 絡處理引擎陣列由 32 個處理引擎組成,每個處理引擎由 32 個乘累加器構成,進行高并行向量乘加運算。
除引擎陣列外,該子系統配有相應的輸入與輸出控制,輸入控制負責從輸入存儲子系統獲取原始數據;輸出控制負責實現中間結果與最終結果的存儲路由。處理引擎子系統的所有控制需要與主狀態機進行交互。
2、存儲子系統
存儲子系統實現對內外部的存儲模塊進行管理,可分為存儲器單元以及存儲路由控制。
存儲器單元:用于實現數據緩沖,分為外部存儲器和內部存儲器。外部存儲器采用 2 片容量大、順序訪問速度快的 DDR 芯片,用于保存原始數據與模型參數,數據緩沖周期長的數據保存在其中,內部存儲器采用訪問速度快、位寬大、 功耗低、容量小、可隨機訪問的 BRAM,用于緩存部分數據及數據運算中間結果,數據緩沖周期短的數據保存在其中。為保證不同圖像處理引擎訪問存儲器單元時不發生數據堵塞,將存儲空間劃分成不同容量的獨立子存儲單元。內部緩存包括:輸入特征圖緩沖區、參數緩沖區、輸出特征圖緩沖區以及中間結果緩沖區。
存儲路由控制:每個子存儲單元通過輸入/輸出接口與存儲仲裁單元相連,處理引擎也通過數據訪問接口與存儲仲裁單元相連,可實現多通道引擎和存儲器之間的訪問映射。內部存儲器與處理引擎陣列子系統間的內存訪問映射由主狀態進行配置。
3、指令處理子系統
指令處理子系統又指令隊列、指令解碼器、主狀態機構成。指令隊列從外部接收指令需要處理的指令并儲存,所有指令順序排列,先入先出。指令解碼器負責從指令隊列中取出指令,進行指令解析并傳輸給主狀態機。主狀態機將存儲訪問指令傳輸至存儲子系統,用于配置該條指令的數據讀/寫通路;將處理指令傳輸至處理引擎子系統,用于選擇處理算法引擎與配置引擎參數。主狀態在算法處理過程中與存儲子系統和處理引擎子系統均進行交互,以實現流程控制。當指令隊列中所有指令全部處理完成后,從外部繼續接受下一批處理指令,直至指令全部處理完成。
接收解析后的指令,對各個模塊進行配置。主狀態機將存儲訪問指令傳輸至存儲子系統,用于配置該條指令的數據讀/寫通路;將處理指令傳輸至處理引擎子系統,用于選擇處理算法引擎與配置引擎參數。主狀態在算法處理過程中與存儲子系統和處理引擎子系統均進行交互,以實現流程控制。

如圖 9 所示,主狀態機由狀態切換模塊和狀態輸出模塊組成。用于配置信息和模塊間的握手。
該模塊包含三個功能,分別是卷積運算、批量標準化(BN)融合層運算、激活 融合層運算。本設計方案中的運算模塊最多可對 32 個輸入通道的數據進行乘累 加運算,并將 32 個輸出通道的結果并行輸出。
為了令我們的處理引擎子系統可以適用于多種卷積類型在 FPGA 上的實現, 我們對卷積運算進行了分析和改進。以常規卷積層為例,以單張圖計算 (BatchSize=1),其輸入特張圖張量為三維張量 Tensor(Nif, NH, NW),權重參數 為四維度張量 Tensor(Nof, Nif, Nkh, Nkw),輸出特征圖為三維張量 Tensor(Nof, NH, NW)。其中 Nif、NH、NW為分別表示輸入特征圖張量的輸入通道數、高、寬;Nkh、 Nkw為卷積核的高、寬;Nof為輸出特征圖張量的輸出通道數其計算公式

卷積運算可看為兩部分,上三層循環為輸出結果索引不參與疊加過程,下三 層循環為卷積計算核心部分。下三層循環計算可看作圖 12 中綠色立方體與紫色立方體的對應點乘法后再求和。目前已有的工程中我們按照上述循環展開方式進行設計,首先計算二維卷積核內部計算,而后通過循環疊加將所有輸入通道進行 組合。但是這種方案在支持多種卷積運算時需要進行數據讀取重排序,在硬件實現時數據流控制較難。此外,卷積運算是一種具有多層次循環的乘累加運算。在神經網絡中卷積運算涉及的數據量很大,FPGA 的運算單元有限,往往不能并行處理全部的輸入數據;同時 FPGA 片上存儲資源也是有限的,卷積運算的大量原始圖像、參數與中間結果也不能完全存在片上,因此需要將運算數據分塊處理。數據切分往往涉及多個維度,并且當原始數據被分塊時,處理時會產生多個中間結果,中間結果可通過疊加得到最終結果。
針對上述問題,本方案采用了循環變換。對圖 10 中公式進行循環變換,將 Loop{1, 2, 3, 4}的順序變換為 Loop{2, 3, 1, 4},循環變換后的卷積運算公式如圖 11 所示。

從上述公式可以看出,經過循環變換后的卷積計算在運算類型和運算數量上沒有任何變化,只改變了循環疊加順序。根據上述公式進行卷積運算可以分解為兩個步驟:
1、特征圖均按照輸入通道維度進行數據采樣,采樣的數據構成特征圖向量, 其維度為(1, Nif,)。卷積核采用按輸出通道進行同位置獨立采樣(第一次運算時為所有輸出通道卷積核第一行第一個點的所有輸入通道數據),采樣后的數據構成二維矩陣,其維度為(Nif, Nof)。采用后的特征圖向量與卷積核矩陣進行向量乘矩陣運算,即可得到特征圖結果向量,其維度為(1, Nof),這些結果對應輸出特征圖第一行第一個點的所有通道數據。該過程如圖 12 所示。
2、向右向下(向右至行尾后,從第二行第一個點開始)依次取特征圖向量, 此過程可以看作是步驟 1 中采樣位置在特征圖張量上的向右向下依次滑動。保持步驟 1 中的卷積核矩陣不變,重復步驟 1 即可獲得所有輸出特征圖中間結果,其 過程如圖 12 所示。

3、向右向下依次卷積核向量構成卷積核矩陣,重復步驟 1、2,獲得第二組中間結果,這些中間結果與步驟 2 中所有結果進行對應位置相加,最終獲得所有輸出結果。應用此方法能夠突破原有方案中卷積核尺寸限制以及卷積類型的限制,通過循環疊加次數來實現不同尺寸卷積運算。
卷積運算模塊主要由卷積輸入控制模塊、卷積輸出控制模塊、卷積計算陣列模塊和卷積狀態控制、BN 輸入控制模塊、BN 融合模塊、激活融合模塊組成。圖 13 為卷積運算模塊的結構框圖。

其中卷積計算陣列模塊包含 32 個計算單元(PE),每一個 PE 能一次完成 32 個數的乘累加運算。整個系統設計中包含 32 個并行排列的 PE。每個 PE 內部由 32 個乘累加器組成,接收輸入特征圖、卷積核及中間結果。如圖 14 所示,每 個 PE 內部的 32 個 MAC 相互級聯,主要針對常規的卷積運算。

BN 運算模塊中包含 32 個 BN 處理單元,可以同時計算 32 個點的批量標準化及反量化運算,分別對應 32 個計算通道。每個計算單元中主要執行 3 步運算。定點轉浮點、浮點乘法、浮點加法。如圖 15 所示:

激活運算模塊中包含 32 個激活處理單元,可以同時計算 32 個點的激活及量化運算。本層的兩個參數存儲在片上的兩塊 ROM 中,在換層時會提前被讀出, 通過判斷當前點的正負來參與運算。此外,本模塊還會進行一個定點轉浮點的運算。從而得到了 8bit 定點的輸出結果。如圖 16 所示:

輸入特征圖緩存模塊的功能是暫存來自 DDR 控制器發送的輸入特征圖數據,并對運算模塊發出的讀請求進行響應,按照所需的數據順序進行讀出。
輸入特征圖緩存模塊由寫控制、讀控制、請求處理控制、片上存儲體組成, 如圖 17 所示。其中,存儲體是一塊數據位寬為 256 的 BRAM 構成。大小為 1MB

卷積核緩存模塊的功能是對卷積核數據進行緩存,并處理來著卷積運算模塊的讀請求,將數據按特定的順序反復讀出。該緩存模塊能夠同時存儲 32 個輸出通道的卷積核。
卷積核緩存模塊由寫控制、讀控制、請求處理控制、片上存儲體組成,如圖 18 所示。其中,存儲體是 32 塊數據位寬為 256 的 BRAM 構成,大小為 1MB。

中間緩存模塊的功能是對卷積運算模塊輸出的中間結果進行緩沖,當卷積運算完成時,為卷積后續的 BN 模塊提供數據。
如圖 19 所示,中間緩存模塊由讀控制、寫控制以及 FIFO 存儲陣列組成,其中 FIFOs 由 32 個端口位寬位 32 的 FIFO 組成。總大小為 10243232b。

輸出緩存模塊用于存儲經過 BN,融合等操作的計算結果。當存儲的數據達到預設值時,向 DDR 發送數據,該緩沖區大小為 1MB。
輸出緩存模塊由參數配置、讀控制、寫控制、交互控制和存儲體組成,如圖 20 所示。

本作品在 Xilinx VC709 板卡上實現了改進版 YOLOv2 目標檢測算法。硬件 部分已完成了指令處理子系統、處理引擎子系統以及存儲子系統。其中,處理引擎子系統包含了普通、轉置、空洞卷積,以及池化、激活等操作,滿足本設計所采用的改進版 YOLOv2 的運算需求。
本作品的具體測試平臺包括上位機演示系統、Xilinx Zedboard 板卡以及 Xilinx VC709 板卡。其中,Zedboard 板卡和 VC709 板卡通過 FMC 連接器交互, 如圖 21 所示。本作品具體運行流程如下:
1、上位機演示系統負責前端界面的顯示,并完成待檢測圖片的加載、回傳結果的后處理及展示。待檢測圖片和回傳結果經由網線傳輸。
2、Zedboard 板卡負責 Linux 操作系統及驅動的加載,并接收上位機傳送的待測圖片,并將待測圖片、YOLOv2 配置指令和相關參數經由 FMC 連接器送與 VC709 板卡處理,檢測結果通過 FMC 連接器返回,并發往上位機。
3、VC709 板卡完成了指令處理子系統、處理引擎子系統以及存儲子系統的實現,該板卡根據卷積神經網絡的配置指令和參數,對待測圖像進行檢測,并通 過 FMC 連接器將檢測結果返回給 Zedboard。

1、FPGA 板卡:Xilinx Zedboard 和 Xilinx VC709
2、數據傳輸:雙絞線、FMC 連接器
3、設計軟件:Xilinx Vivado 2019.2
4、用于對網絡結果進行后處理及界面顯示的上位機
1、準確性:利用 GPU 平臺改進的 YOLOv2 網絡在 DOTA 遙感數據集上測試,mAP 指標可以達到 69.0。我們在 FPGA 上所實現的該深度卷積神經網絡的測試結果與 GPU 平臺運行結果一致,保證了作品的準確性。
2、運行效率:基于改進的 YOLOv2 網絡,對單張尺寸為 1024x1024 的圖像進行多目標檢測的處理時間為 0.9248 秒。若加上數據傳輸、結果后處理以及圖像顯示等過程,單張圖像的處理及展示時間約為 1.5 秒。(在視頻展示時,多張 圖測試過程中,由于作品的處理速度快于每張圖所展示的時長,所以可以看到原圖和檢測結果幾乎同時顯示。)
3、功耗:本作品在 200M 的時鐘頻率下,總功耗為 16W,單位功耗處理能力為 25GOPs/W。與 GPU 平臺相比,具有更低的功耗和更優的能耗比。因此本作品更適合部署在對實現平臺的體積、重量、功耗有限制的應用環境中。
本作品 FPGA 資源占用情況如表 1 所示,其中 DSP 占用了 65.78%,BRAM 占用了 54.01%,資源使用情況合理。該硬件平臺能夠有效部署 YOLOv2 目標檢測網絡,實現多尺度、多類型目標的高精度快速檢測及分類。

本作品基于改進的 YOLOv2 網絡,在實現飛機、車輛等多目標的檢測的同時, 可實現多檢測目標的分類,其上位機界面顯示結果如圖 23 所示。

(1)目前卷積神經網絡的部署仍采用人工方式生成對應的指令代碼,未來可結合軟件編譯工具,是指令代碼生成自動化,從而達到多種網絡的動態部署和資源的動態分配。
(2)目前該作品暫不支持深度可分離卷積、分組卷積和 Shortcut 等運算方式,未來可在處理引擎子系統上進行擴展,進一步提高該作品的通用性。
(3)目前我們在 FPGA 上實現了深度卷積神經網絡。但 FPGA 作為一種通用處理器,其處理性能和功耗控制都存在瓶頸。因此后續我們會以本作品為基礎, 設計與開發用于遙感圖像在軌實時處理的 ASIC 芯片。

END
往期精選?
?
?

FPGA技術江湖廣發江湖帖
無廣告純凈模式,給技術交流一片凈土,從初學小白到行業精英業界大佬等,從軍工領域到民用企業等,從通信、圖像處理到人工智能等各個方向應有盡有,QQ微信雙選,FPGA技術江湖打造最純凈最專業的技術交流學習平臺。
FPGA技術江湖微信交流群

加群主微信,備注姓名+學校/公司+專業/崗位進群
FPGA技術江湖QQ交流群

備注姓名+學校/公司+專業/崗位進群
