李靖超,王龍翔,董春蕾
(上海電機學院 電子信息學院,上海201306)
隨著我國綜合國力與人民生活水平的日益提升,人民健康的保障與衛生制度的建設越來越受到黨和政府的高度重視。但我國醫療領域起點較低,制度建設還不完善,長期存在著醫療資源分配不均、誤診漏診率較高、醫療成本過高、醫生資源供需不足以及醫生培養周期長等問題[1]。目前,醫院存儲的信息超過90%是影像信息,影像信息已形成了巨大的數據積累。據統計,醫學影像數據年增長率為63%,而放射科醫生數量年增長率僅為2%,這就意味著放射科的醫生在處理醫療影像數據時的壓力會越來越大,誤診漏診率也會不斷增大[2-3]。人工智能與醫療影像相結合有望緩解此類問題。隨著近年來以英偉達(NVIDIA)公司為代表的圖形處理器(GPU)技術的革新與普及,加上卷積神經網絡等理論的逐步完善,人工智能在各行各業掀起了新的熱潮,其中深度學習是人工智能領域中發展最好,應用最廣的方法之一。尤其在圖像識別方面,基于深度學習的方法取得了非常好的效果,甚至在很多領域超過了人類的識別準確度[4]。很多公司和互聯網社區都開源并維護著性能優異、交互性良好的深度學習框架系統,比如Google公司的Tensor Flow,Facebook 公司的Caffe與Py Torch等等,極大地推動了深度學習的發展與普及。深度學習理論的趨于完善與新的網絡結構、算法的不斷提出,為深度學習技術應用于醫療影像的輔助診斷奠定了堅實的基礎。
近幾年我國在人工智能醫療領域取得了應用層面的突破,但是醫療人工智能領域整體水平與發達國家相比仍存在差距,在前沿基礎設施建設、產業應用、人才培養和監管體系等方面都亟待建立和完善[4-5]。由于國內醫學影像數量年增長率很高,而相應的放射科醫師增長率較低,因此,供需缺口是推動國內人工智能技術在醫學影像應用的重要因素。人工智能領域的Tensor Flow、Caffe等工具與圖像處理的特征提取[6-7]技術相結合雖然在技術上能實現醫療輔助診斷,但其具有很強的專業性,計算機或者電子信息等專業領域人員在配置開發環境時都有一定難度,更何況醫療領域人員通過該工具進行醫療診斷。出于此目的,本文設計出一款基于ZYNQ 的醫療輔助診斷系統,該系統創造性地將目前熱門的機器學習算法移植到嵌入式軟硬件平臺上,通過現場可編程邏輯門陣列(Field Programmable Gate Array,FPGA)與ARM的協同工作,能極大提高運算效率,具有操作簡便、響應時間短、功耗低等優點,具有較好的應用價值[8]。
本技術采用Xilinx最新推出的ZYNQ Ultra-Scale+MPSoC作為處理器,將訓練好的網絡模型量化移植到嵌入式軟硬件平臺上,由ARM負責整個系統的調度和部分計算,FPGA 對卷積、池化等運算進行并行運算來減少運算時間,通過ARM與FPGA的協同工作,達到深度學習常用的處理器GPU 所不具備的性能,網絡模型采用GoogLeNet通過遷移學習得到,該網絡模型一共22層,每一層的算法都需要ARM 和FPGA的協同工作,使用開發環境SDSOC節省了大量的硬件設計時間。
由于本設計需要ZYNQ 中的ARM和FPGA協同工作,協同工作的前提是創建DSA文件的硬件平臺為整個系統提供硬件基礎[9]。本設計所使用的硬件開發板如圖1所示。為ZYNQ-7000 SoC處理器創建DSA設計的過程中,使用ZYNQ?-7000 SoC處理系統(PS)IP和時鐘向導IP為DSA創建可能使用到的多個時鐘。使用多處理器系統復位模塊用于將復位同步到這些不同的時鐘源[10-12]。

圖1 開發板硬件電路
在ZYNQ的開發環境SDSOC[13-15]中,有多種手段可以提高計算速度,如增加并行性、選擇合適的系統端口、直接存儲器訪問(Direct Memory Access,DMA)等。
由于深度卷積神經網絡的計算量較大,為減小計算時間,盡量提高運行過程中的并行度,本設計在SDSOC開發環境中對需要提高并行度的相關函數,特別是需要大量計算的卷積、池化等操作加入一定量的編譯指令以優化其軟硬件協同能力。
例如對矩陣進行并行計算時,加入指令“#pragma HLS pipeline II=1”,可以減小循環啟動時間,增加并行性。圖2為在運行func函數時,分別令循環啟動時間為3和1時的運行示意圖。
由圖2可知,當循環啟動時間為3時,在最后一個WR 操作前已經消耗了8個周期;而當循環啟動時間為1時,最后一個WR操作前僅消耗4個周期。由于在進行深度卷積神經網絡的矩陣計算時,各個循環之間無依賴性,因此大量使用該編譯指令增加并行度。

圖2 PIPELINE編譯指令圖解
ZYNQ-7000 All Programmable SoC在可編程邏輯和外部存儲器之間提供緩存一致性接口(S_AXI_ACP),以及用于非緩存一致性訪問(AFI)的高性能端口(S_AXI_HP)。
圖3為系統端口結構。ZYNQ器件中的處理系統(PS)模塊有3種系統端口,用于將數據從處理器存儲器傳輸到ZYNQ 器件可編程邏輯(PL)并返回。它們是加速器一致性端口(ACP),允許硬件以一致的方式直接訪問處理器的L2高速緩存,高性能端口0-3(HP0-3)可提供對DDR內存的直接緩沖存取,從硬件旁路使用異步FIFO 接口(AFI)的處理器高速緩存和允許處理器讀/寫硬件寄存器的通用IO 端口(GP0/GP1)。由于各種系統端口的性能不一樣,因此選擇合理的系統端口也在一定程度上影響整個程序的運行時間。

圖3 系統端口結構
在SDSOC的開發環境中,data_mover編譯指示可以用來指定FPGA和ARM 之間的數據傳輸DMA的選擇。該編譯指定了用于傳輸數組參數的硬件IP類型或DataMover。例如編譯指令“#pragma SDS data data_mover(A:AXIDMA_SG,B:AXIDMA_SIMPLE)”指定了在軟硬件傳輸矩陣A的數據時,使用AXI_SG 類型的DMA,在傳輸矩陣B時使用AXIDMA_SIMPLE類型的DMA。
在本設計中的算法流程主函數如圖4所示。系統為程序中所需的緩存創建相應的向量和進程隊列,為輸入圖像和輸出數據申請相應的內存。分別導入Caffe[16-17]中訓練神經網絡生成的caffemodule、prototxt、meanfile文件,初始化神經網絡中的相關參數,將待識別的圖片加載到緩沖區域中,對被識別圖片執行深度神經網絡,釋放緩存,至此整個識別過程結束。

圖4 主函數流程
其中,在對圖像執行神經網絡運行推斷時,系統對各層初始化,計算各矩陣層的大小。讀取緩沖區的待識別圖片數據,并將其分別執行caffemodule中所定義的卷積、池化等操作。各個層具體操作采用CHaiDNN深度卷積神經網絡庫。
CHaiDNN是Xilinx深度神經網絡庫,用于加速Xilinx Ultrascale MPSoC上的深度神經網絡。它旨在為16位整數數據類型提供最高的計算效率。CHaiDNN的設計目標是以最高的性能實現最佳精度。根據用戶指定的精度參數,將所有特征圖和訓練參數從單精度轉換為定點。精度參數可能因網絡、數據集甚至跨同一網絡中的各個層而有很大差異。網絡的精度取決于用于表示特征圖和訓練參數的精度參數。精心設計的精度參數預計會提供與從單個精度模型獲得的精度類似的精度。
由于難以獲取到用于訓練神經網絡的數據集,為避免在訓練過程中由于數據集過小而導致遷移學習過擬合,遷移學習主要包含域和任務的概念。每個域D由特征空間X以及邊際概率分布P(X)組成,且X=x1,x2…,xi。例如如果任務是對OCT圖像分類,那么每一個圖像特征則可以表示為二進制特征,X是所有圖像的特征空間,xi是第i個單詞的二進制特征。給定一個域D,一個任務T則可由一個標簽空間Y以及一個目標函數f組成。此目標函數可通過訓練集中的帶標簽數據訓練得到,用來預測新數據的標簽。從概率的角度來看,此目標函數可以被表示為條件概率分布的形式P(y|x),對于二分分類來說即為真或假,本設計采用數據增強技術的方法來避免過擬合。
本設計中進行數據增強采用了兩種方法,方法1的步驟如下:
步驟1將原始數據(未進行數據增強)制作成lmdb文件;
步驟2修改data_layer.cpp的load_batch()函數,將一個datum 轉換成一張Mat類型的圖片(轉換成Mat類型目的在于步驟3中使用opencv的函數對圖片進行數據增強處理);
步驟3使用opencv的函數對Mat進行數據增強處理;
步驟4將步驟3得到的新的Mat轉換回datum 的形式。
進行數據增強的方法2:由于數據集為圖片類型,依據已有的圖像進行隨機修改,例如尺度縮放、旋轉、平移、裁剪等。
測試集圖片共968張,每個種類242張圖片對模型進行測試。其中CNV為脈絡新生血管,DME為糖尿病黃斑水腫,DRUSE 為黃斑區玻璃膜疣,NORMAL為正常。混淆矩陣可以直觀衡量分類模型準確度中最基本直觀的表現形式(見表1)。其中有4個基礎1級指標,含義分別為
真實值是positive,模型認為是positive的數量(True Positive=TP);
真實值是positive,模型認為是negative的數量(False Negative=FN),這是統計學上認為的第1類錯誤;
真實值是negative,模型認為是positive的數量(False Positive=FP),這是統計學上認為的第2類錯誤;
真實值是negative,模型認為是negative的數量(True Negative=TN)。

表1 測試集混淆矩陣
混淆矩陣的2級指標分為準確率、精確率、召回率。準確率為
(242+239+239+236)/968=98.75%
CNV精確率為242/242=100%;DME 精確率為239/242=98.76%;DRUSE 精確率為239/242=98.76%;NORMAL精確率為236/242=97.52%。CNV召回率為242/(242+3+3)=97.85%;DME召回率為239/240=99.58%;DRUSE召回率為239/244=97.95%;NORMAL召回率為236/236=100%。
對GoogLeNet模型進行遷移學習,將獲取到的約8萬張圖片制作成Caffe所需的LMDB格式的數據集,在這個過程中加入參數“shuffle”使得制作數據集過程中隨機打亂圖片的順序,減小過擬合現象。根據隨機梯度下降法,選取每一個小批量的圖片數量,本設計根據訓練的硬件環境,設置小批量的圖片數據量為64張。訓練后的正確率曲線隨著迭代次數的變化趨勢如圖5所示。

圖5 正確率變化曲線
由圖5可知,正確率隨著迭代次數的增加逐漸增加,最終趨于1。該訓練過程中的正確率按照理想趨勢變化,僅僅在迭代次數為20 000次時發生減小的情況,這是由于此時的正確率變化已經趨緩,減小了學習率導致的,在之后的訓練過程中未發生正確率突變的情況。表明此次訓練整體較理想,可以利用該模型進行推理。
圖6為訓練過程中的誤差函數隨迭代次數的變化趨勢圖,loss表示誤差。由圖6可見,誤差函數有一定的振蕩,整體趨勢是“在輕微的振蕩中趨于下降”。誤差函數有小幅度的振蕩是正常現象,這是由于隨即梯度下降法(SGD)每次迭代僅選取一個小批量的數據代替整個數據集,而選取的這個小批量在有些情況下與數據集整體有一定的差異,這就造成了輕微的振蕩情況。由于振蕩并不嚴重,且最終的誤差函數已經達到0.2左右,達到本設計的要求,可以采用此次訓練的caffemodel文件。

圖6 loss變化曲線圖
本文針對正常人和糖尿病視網膜病變(DR)、黃斑水腫、玻璃膜疣病人的視網膜OCT圖像分類,在獲取不到足夠大的數據集情況下,進行了數據增強、打亂數據集順序、遷移學習的方法,將經典的Goog LeNet遷移學習到本項目對于視網膜OCT圖像的識別中。首先利用大量標注數據來訓練構建的深度卷積神經網絡,其次待模型完成訓練后,對模型的性能做測試,將評估測試結果與預期的模型結果進行對比,最后將訓練好的模型量化移植到采用ARM 與FPGA 的硬件平臺上實現云端的在線識別。其準確率高達98%,可以幫助醫生起到很好的輔助作用。