謝文鑫,史紀廣,李宙童,黃啟俊
(1.武漢大學物理科學與技術學院,湖北武漢 430072;2.上海交通大學醫學院附屬第九人民醫院黃浦分院,上海 200011)
心血管疾病(CardioVascular Disease,CVD)是人類身體健康的首要威脅,具有發病率和死亡率高的特點,已成為重大的公共衛生問題[1],對其預防和診斷也越來越受到人們的重視。心電圖[2](Electrocardiogram,ECG)包含有各種心血管疾病的細微信息,是CVD 診斷的重要依據。隨著機器學習的發展,神經網絡算法逐漸應用于心電信號的自動識別[3]。因此,采用人工智能算法對ECG 信號進行自動分析,并將智能算法移植到便攜式心電檢測設備,實現大眾心臟健康的日常監護,成為一個亟待解決的問題。文中設計了一種適合硬件實現的輕量化殘差神經網絡結構,將其硬件化部署于FPGA 平臺上,并驗證該模塊的效果。該硬件IP 模塊具有準確率高、計算速度快的特點,易于硬件實現,可滿足便攜式心電檢測系統的需求。
數據庫樣本來源于上海某醫院心內科實際采集的心電圖,包含有七萬多名被檢測者的心電圖,為12導聯的完整心電數據,采樣率為1 000 Hz。通過對被檢測人的信息進行脫敏保密處理,心電圖數據只保留了信號波形和對應的疾病標簽。每個樣本都由專業醫生進行疾病診斷并做出標注,標注的診斷結果包含46 種心電信號類型,如正常心電圖、右心房擴大、左心室肥大、房性早搏、心動過速、心動過緩等。考慮到實際需求,文中主要對其中的心律失常疾病進行分類,因此選取了其中的正常心電圖(N)、房性早搏(A)、心動過速(T)、心動過緩(B)四種CVD進行分類[4]。由于一個樣本可能同時包含兩種以上的CVD類型,例如一條樣本含有房性早搏和心動過緩兩種疾病,所以文中選擇只包含四類獨立CVD 疾病類型的心電數據。為滿足分類算法硬件的輕量化要求,文中只使用了Ⅱ導聯數據進行心律失常的檢測。
心電信號是一種微弱的生物信號,易受各種環境因素的影響,所以原始心電信號會包含基線漂移、工頻干擾、肌電干擾等噪聲[5]。根據美國心臟協會的建議,文中采用0.5~150 Hz 的帶通濾波器對原始信號進行去噪[6]。
由于每個心電圖樣本的長度不固定,時間長度從11 s到92 s(即包含的采樣點數量為11 000~92 000個),因此要對心電數據進行片段分割處理。為了保證每個片段具有足夠的心電信號特征,將心電信號分割成固定長度為9 000 個采樣點的數據:
其中,num_sigment 為樣本切割后得到的片段數量,L0為原始樣本的長度。一條包含15 000 個采樣點的樣本數據可以被切割為兩段9 000 個采樣點的心拍片段,如圖1 所示,切割后的每個片段包含9 s 的信息,標簽與原始樣本的標簽相同。
由于數據庫的數據采樣率為1 000 Hz,因此在保證足夠信息和分類精度的前提下,對切割后的心拍片段進行了降采樣處理,將每段包含9 000 個采樣點的片段重采樣成1 000 個采樣點,即將9 s 的心電信號表示為1 000 個采樣點的數據。

圖1 心電信號片段分割
將原始心電信號經過上述預處理,得到尺寸為1 000×1 的輸入數據。其中,各類心電信號處理后的樣本量如表1所示,共計11 358個心拍片段,按照8∶1的比例劃分訓練集和測試集。

表1 各類片段樣本量及訓練集、測試集樣本量
原始的Ⅱ導聯數據經過去噪、片段分割、重采樣處理后,輸入神經網絡對心律失常進行疾病分類檢測。神經網絡結構如圖2 所示,輸入的心電信號經過神經網絡后得到4×1 的輸出數據,使用Softmax 作為輸出層的激活函數,輸出四個類別分別對應的概率,將概率最大的類別視作分類的結果。

圖2 神經網絡結構
殘差神經網絡(Resnet)[7]由何愷明等于2015 年提出,其中殘差模塊如圖3(a)所示,將Resnet 信息繞道傳輸到輸出端并將二者疊加,使輸出信息更加完全,在一定程度上解決了深層網絡的梯度消失或梯度爆炸問題[8]。文中在此基礎上提出了一種改進的殘差模塊,該模塊由卷積層、最大池化層和激活層組成,信號經過該殘差模塊可以縮小最大池化層對應的尺寸,有利于模塊硬件化時降低資源的使用,如圖3(b)所示。

圖3 殘差模塊與改進
圖2 所示的Resnet 輸入數據尺寸為1 000×1,使用卷積層、最大池化層、殘差模塊、全局平均池化層提取特征,并用全連接層和Softmax 激活函數進行CVD 的檢測分類。
基于Python 語言(v3.7)和TensorFlow(v2.4.1)深度學習框架完成網絡模塊設計,使用Nvidia RTX 3060進行訓練和神經網絡測試。測試結果的混淆矩陣如表2 所示,橫向為真實值,豎向為預測值。可由混淆矩陣計算得出分類準確率及F1-Score。F1-Score 為分類任務的一個重要衡量指標,是精確率和召回率的調和平均數,最大值為1,最小值為0,F1-Score 數值越大,則分類效果越好。

表2 混淆矩陣
經過計算,分類準確率為91.22%,N、A、T、B 四類心電信號的F1-Score 分別為91.70%、88.38%、93.97%、91.34%,均達到了90%左右,該網絡模型對于心律失常的誤診率較低,可滿足人們日常心電監護的需要。
使用Xilinx 公司的HLS 設計工具——高層次綜合(High-level Synthesis,HLS)對殘差神經網絡模塊進行硬件IP 設計[9]。將基于C/C++語言編寫的源代碼和仿真測試代碼導入HLS 設計工具中,可進行代碼層面的C 仿真,驗證算法功能的正確性。利用約束指令、優化指令進行綜合約束和優化[10],C 綜合器可以將C/C++軟件代碼綜合成寄存器傳輸級(Register-Transfer Level,RTL 級)的硬件,綜合完成之后進行硬件層面的RTL/C 聯合仿真,進一步驗證硬件IP 設計的正確性,仿真正確之后就可以將設計封裝為硬件IP,用于Vivado 設計工具中搭建硬件系統。
在keras 中,訓練的參數被保存為浮點類型,單精度浮點數在硬件中需要用32 位二進制數表示,數據位寬越高將會耗費巨大的硬件資源[11]。在滿足精度要求的前提下,選擇合適的位寬進行數據量化,將會減少硬件資源消耗并顯著提高硬件計算速度[12]。所以選取16 位有符號定點數對數據進行量化,小數位寬越大,精度越高,但小數部分的位寬過大會導致整數位數據溢出。最后文中定點化設計方案為:一位符號位,七位整數位,八位小數位。
神經網絡算法的計算過程復雜,卷積層是網絡結構的核心,也是設計的重點。心電信號是一維時間序列信號,與常用于圖像處理的二維卷積相比,一維的卷積模塊會顯著降低硬件模塊設計的復雜度[13]。圖4 所示為文中一維卷積運算的過程。首先將儲存在BRAM(Block Random Access Memory)中的數據和權重參數讀取到數據滑窗和參數滑窗,通過乘法器使兩個窗口對應位置數據相乘,將乘法運算的結果輸入到加法樹電路中,便可得到一次卷積運算的結果。整個卷積層的計算包含了四層循環,用來控制數據和權重參數的讀取及計算過程。在輸出通道和輸入通道的循環操作上,添加Unroll 優化指令作并行展開,可提高模塊計算速度[14]。對于第一層卷積層,輸入通道數為1,所以只在輸出通道上展開,設置并行度為8;對其余卷積層,輸出通道和輸入通道并行度均設置為4。
池化層的結構比較簡單,只需要池化窗口在輸入數據上滑動一遍,便能得到輸出數據。文中使用的池化函數均為最大池化,池化窗口的寬度應和池化的步長保持一致,用到的池化步長為2 和3。對于步長為2 的池化層,只需要一個比較器便可以實現最大池化,步長為3 的池化則需要兩級比較器來實現。圖5 所示為步長為3 的最大池化窗口結構。

圖4 卷積計算過程

圖5 最大池化窗口
全局平均池化層設計方法和最大池化層類似,計算過程如圖6 所示。將輸入數據輸入到累加器電路中進行累加,累加的次數通過計數器電路控制,最后將累加的運算結果輸入到平均值計算電路中進行運算,得到全局平均池化的結果。

圖6 全局平均池化計算過程
全連接層計算量較大,計算過程與卷積層類似,但是循環層數較少。全連接層的輸入數據經過Flatten 操作,可看成每個輸入通道只有一個數據,每個輸出通道也只會得到一個數據結果,因此只需要兩層循環即可完成。
殘差神經網絡各層設計好后,根據網絡結構完成硬件模塊連接,使用Dataflow 優化指令對網絡進行優化[15],使數據以數據流的形式在各層之間流動,實現各層的流水線操作,有效地提高了網絡的吞吐率。模塊使用AXI_M 數據接口,實現與ARM CPU 的數據交互。經過C 仿真、RTL/C 聯合仿真,模塊均能得到正確的計算結果,最后將模塊封裝成IP。
文中使用米聯客MZ7XA-7020 FPGA 開發板對算法進行硬件部署驗證,該板卡體積小、資源相對豐富且靈活度高,適合開發便攜式設備。
將設計完成的硬件模塊導入到Vivado 設計工具中,搭建圖7 所示的硬件系統,用于該模塊的驗證。整個系統可分為ZYNQ 和FPGA 兩個部分[16],FPGA的核心是Resnet 硬件模塊,用硬件實現心電信號的自動識別;ZYNQ 的核心是ARM 處理器,負責運行整個系統的控制程序。Resnet 模塊和ARM 之間的數據交互則通過AXI 總線完成[17]。系統中的BRAM 模塊用于數據的存儲,Resnet 硬件模塊和ARM 處理器可以通過AXI 總線對BRAM 進行數據的讀寫操作。整個系統的時鐘在ZYNQ 中設置產生,并提供給其他模塊使用。

圖7 硬件系統框圖
模塊硬件資源的使用情況如表3 所示,BRAM、DSP48E、FF(Flip-Flop)和LUT(Lookup Table)使用率分別為32.50%、32.27%、10.26%和28.64%。可看出IP 模塊對四種硬件資源的使用均未超過可用資源量的三分之一,剩余的硬件資源供ECG 系統的其他模塊使用,可以滿足便攜式心電檢測系統小型化的要求。

表3 資源占用情況
性能分析如表4 所示,表中記錄了硬件IP 模塊處理完1 264 條數據的總時間和每條數據的平均時間,并與在ARM Cortex-A9 CPU 中用純軟件模式實現運行的計算時間進行對比。從表4 可以看出,在100 MHz 的時鐘頻率下,處理同樣一條心電數據,硬件IP 模塊的速度是ARM CPU 純軟件實現速度的2.07 倍。

表4 FPGA與ARM CPU計算時間比較
在FPGA 嵌入式平臺對文中Resnet 網絡模型進行測試,輸入測試集1 264 條心電數據,將測試結果與keras 框架下的網絡測試結果相比較,其中,5 條數據輸出結果與軟件結果不一致,硬件計算的準確率達到了99.60%。

表5 FPGA計算準確率
文中針對實時心電數據的自動分類識別,設計了一種適用于便攜式心電檢測的殘差神經網絡硬件IP,可實現正常心電圖、房性早搏、心動過速、心動過緩四種心電信號的分類,分類準確率分別達到87.31%、89.40%、97.39%、95.24%。在FPGA 上搭建硬件系統,完成了硬件IP 模塊的驗證,與軟件計算結果相比,速度提升2 倍以上;且硬件資源消耗較少、準確率高,能夠滿足便攜式心電檢測系統的要求,具有實際應用價值。未來將用更大的數據集進行驗證,進一步提升算法的普適性。