謝文鑫,史紀(jì)廣,李宙童,黃啟俊
(1.武漢大學(xué)物理科學(xué)與技術(shù)學(xué)院,湖北武漢 430072;2.上海交通大學(xué)醫(yī)學(xué)院附屬第九人民醫(yī)院黃浦分院,上海 200011)
心血管疾?。–ardioVascular Disease,CVD)是人類身體健康的首要威脅,具有發(fā)病率和死亡率高的特點(diǎn),已成為重大的公共衛(wèi)生問題[1],對(duì)其預(yù)防和診斷也越來越受到人們的重視。心電圖[2](Electrocardiogram,ECG)包含有各種心血管疾病的細(xì)微信息,是CVD 診斷的重要依據(jù)。隨著機(jī)器學(xué)習(xí)的發(fā)展,神經(jīng)網(wǎng)絡(luò)算法逐漸應(yīng)用于心電信號(hào)的自動(dòng)識(shí)別[3]。因此,采用人工智能算法對(duì)ECG 信號(hào)進(jìn)行自動(dòng)分析,并將智能算法移植到便攜式心電檢測(cè)設(shè)備,實(shí)現(xiàn)大眾心臟健康的日常監(jiān)護(hù),成為一個(gè)亟待解決的問題。文中設(shè)計(jì)了一種適合硬件實(shí)現(xiàn)的輕量化殘差神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu),將其硬件化部署于FPGA 平臺(tái)上,并驗(yàn)證該模塊的效果。該硬件IP 模塊具有準(zhǔn)確率高、計(jì)算速度快的特點(diǎn),易于硬件實(shí)現(xiàn),可滿足便攜式心電檢測(cè)系統(tǒng)的需求。
數(shù)據(jù)庫樣本來源于上海某醫(yī)院心內(nèi)科實(shí)際采集的心電圖,包含有七萬多名被檢測(cè)者的心電圖,為12導(dǎo)聯(lián)的完整心電數(shù)據(jù),采樣率為1 000 Hz。通過對(duì)被檢測(cè)人的信息進(jìn)行脫敏保密處理,心電圖數(shù)據(jù)只保留了信號(hào)波形和對(duì)應(yīng)的疾病標(biāo)簽。每個(gè)樣本都由專業(yè)醫(yī)生進(jìn)行疾病診斷并做出標(biāo)注,標(biāo)注的診斷結(jié)果包含46 種心電信號(hào)類型,如正常心電圖、右心房擴(kuò)大、左心室肥大、房性早搏、心動(dòng)過速、心動(dòng)過緩等??紤]到實(shí)際需求,文中主要對(duì)其中的心律失常疾病進(jìn)行分類,因此選取了其中的正常心電圖(N)、房性早搏(A)、心動(dòng)過速(T)、心動(dòng)過緩(B)四種CVD進(jìn)行分類[4]。由于一個(gè)樣本可能同時(shí)包含兩種以上的CVD類型,例如一條樣本含有房性早搏和心動(dòng)過緩兩種疾病,所以文中選擇只包含四類獨(dú)立CVD 疾病類型的心電數(shù)據(jù)。為滿足分類算法硬件的輕量化要求,文中只使用了Ⅱ?qū)?lián)數(shù)據(jù)進(jìn)行心律失常的檢測(cè)。
心電信號(hào)是一種微弱的生物信號(hào),易受各種環(huán)境因素的影響,所以原始心電信號(hào)會(huì)包含基線漂移、工頻干擾、肌電干擾等噪聲[5]。根據(jù)美國(guó)心臟協(xié)會(huì)的建議,文中采用0.5~150 Hz 的帶通濾波器對(duì)原始信號(hào)進(jìn)行去噪[6]。
由于每個(gè)心電圖樣本的長(zhǎng)度不固定,時(shí)間長(zhǎng)度從11 s到92 s(即包含的采樣點(diǎn)數(shù)量為11 000~92 000個(gè)),因此要對(duì)心電數(shù)據(jù)進(jìn)行片段分割處理。為了保證每個(gè)片段具有足夠的心電信號(hào)特征,將心電信號(hào)分割成固定長(zhǎng)度為9 000 個(gè)采樣點(diǎn)的數(shù)據(jù):
其中,num_sigment 為樣本切割后得到的片段數(shù)量,L0為原始樣本的長(zhǎng)度。一條包含15 000 個(gè)采樣點(diǎn)的樣本數(shù)據(jù)可以被切割為兩段9 000 個(gè)采樣點(diǎn)的心拍片段,如圖1 所示,切割后的每個(gè)片段包含9 s 的信息,標(biāo)簽與原始樣本的標(biāo)簽相同。
由于數(shù)據(jù)庫的數(shù)據(jù)采樣率為1 000 Hz,因此在保證足夠信息和分類精度的前提下,對(duì)切割后的心拍片段進(jìn)行了降采樣處理,將每段包含9 000 個(gè)采樣點(diǎn)的片段重采樣成1 000 個(gè)采樣點(diǎn),即將9 s 的心電信號(hào)表示為1 000 個(gè)采樣點(diǎn)的數(shù)據(jù)。
圖1 心電信號(hào)片段分割
將原始心電信號(hào)經(jīng)過上述預(yù)處理,得到尺寸為1 000×1 的輸入數(shù)據(jù)。其中,各類心電信號(hào)處理后的樣本量如表1所示,共計(jì)11 358個(gè)心拍片段,按照8∶1的比例劃分訓(xùn)練集和測(cè)試集。
表1 各類片段樣本量及訓(xùn)練集、測(cè)試集樣本量
原始的Ⅱ?qū)?lián)數(shù)據(jù)經(jīng)過去噪、片段分割、重采樣處理后,輸入神經(jīng)網(wǎng)絡(luò)對(duì)心律失常進(jìn)行疾病分類檢測(cè)。神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)如圖2 所示,輸入的心電信號(hào)經(jīng)過神經(jīng)網(wǎng)絡(luò)后得到4×1 的輸出數(shù)據(jù),使用Softmax 作為輸出層的激活函數(shù),輸出四個(gè)類別分別對(duì)應(yīng)的概率,將概率最大的類別視作分類的結(jié)果。
圖2 神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)
殘差神經(jīng)網(wǎng)絡(luò)(Resnet)[7]由何愷明等于2015 年提出,其中殘差模塊如圖3(a)所示,將Resnet 信息繞道傳輸?shù)捷敵龆瞬⒍忒B加,使輸出信息更加完全,在一定程度上解決了深層網(wǎng)絡(luò)的梯度消失或梯度爆炸問題[8]。文中在此基礎(chǔ)上提出了一種改進(jìn)的殘差模塊,該模塊由卷積層、最大池化層和激活層組成,信號(hào)經(jīng)過該殘差模塊可以縮小最大池化層對(duì)應(yīng)的尺寸,有利于模塊硬件化時(shí)降低資源的使用,如圖3(b)所示。
圖3 殘差模塊與改進(jìn)
圖2 所示的Resnet 輸入數(shù)據(jù)尺寸為1 000×1,使用卷積層、最大池化層、殘差模塊、全局平均池化層提取特征,并用全連接層和Softmax 激活函數(shù)進(jìn)行CVD 的檢測(cè)分類。
基于Python 語言(v3.7)和TensorFlow(v2.4.1)深度學(xué)習(xí)框架完成網(wǎng)絡(luò)模塊設(shè)計(jì),使用Nvidia RTX 3060進(jìn)行訓(xùn)練和神經(jīng)網(wǎng)絡(luò)測(cè)試。測(cè)試結(jié)果的混淆矩陣如表2 所示,橫向?yàn)檎鎸?shí)值,豎向?yàn)轭A(yù)測(cè)值。可由混淆矩陣計(jì)算得出分類準(zhǔn)確率及F1-Score。F1-Score 為分類任務(wù)的一個(gè)重要衡量指標(biāo),是精確率和召回率的調(diào)和平均數(shù),最大值為1,最小值為0,F(xiàn)1-Score 數(shù)值越大,則分類效果越好。
表2 混淆矩陣
經(jīng)過計(jì)算,分類準(zhǔn)確率為91.22%,N、A、T、B 四類心電信號(hào)的F1-Score 分別為91.70%、88.38%、93.97%、91.34%,均達(dá)到了90%左右,該網(wǎng)絡(luò)模型對(duì)于心律失常的誤診率較低,可滿足人們?nèi)粘P碾姳O(jiān)護(hù)的需要。
使用Xilinx 公司的HLS 設(shè)計(jì)工具——高層次綜合(High-level Synthesis,HLS)對(duì)殘差神經(jīng)網(wǎng)絡(luò)模塊進(jìn)行硬件IP 設(shè)計(jì)[9]。將基于C/C++語言編寫的源代碼和仿真測(cè)試代碼導(dǎo)入HLS 設(shè)計(jì)工具中,可進(jìn)行代碼層面的C 仿真,驗(yàn)證算法功能的正確性。利用約束指令、優(yōu)化指令進(jìn)行綜合約束和優(yōu)化[10],C 綜合器可以將C/C++軟件代碼綜合成寄存器傳輸級(jí)(Register-Transfer Level,RTL 級(jí))的硬件,綜合完成之后進(jìn)行硬件層面的RTL/C 聯(lián)合仿真,進(jìn)一步驗(yàn)證硬件IP 設(shè)計(jì)的正確性,仿真正確之后就可以將設(shè)計(jì)封裝為硬件IP,用于Vivado 設(shè)計(jì)工具中搭建硬件系統(tǒng)。
在keras 中,訓(xùn)練的參數(shù)被保存為浮點(diǎn)類型,單精度浮點(diǎn)數(shù)在硬件中需要用32 位二進(jìn)制數(shù)表示,數(shù)據(jù)位寬越高將會(huì)耗費(fèi)巨大的硬件資源[11]。在滿足精度要求的前提下,選擇合適的位寬進(jìn)行數(shù)據(jù)量化,將會(huì)減少硬件資源消耗并顯著提高硬件計(jì)算速度[12]。所以選取16 位有符號(hào)定點(diǎn)數(shù)對(duì)數(shù)據(jù)進(jìn)行量化,小數(shù)位寬越大,精度越高,但小數(shù)部分的位寬過大會(huì)導(dǎo)致整數(shù)位數(shù)據(jù)溢出。最后文中定點(diǎn)化設(shè)計(jì)方案為:一位符號(hào)位,七位整數(shù)位,八位小數(shù)位。
神經(jīng)網(wǎng)絡(luò)算法的計(jì)算過程復(fù)雜,卷積層是網(wǎng)絡(luò)結(jié)構(gòu)的核心,也是設(shè)計(jì)的重點(diǎn)。心電信號(hào)是一維時(shí)間序列信號(hào),與常用于圖像處理的二維卷積相比,一維的卷積模塊會(huì)顯著降低硬件模塊設(shè)計(jì)的復(fù)雜度[13]。圖4 所示為文中一維卷積運(yùn)算的過程。首先將儲(chǔ)存在BRAM(Block Random Access Memory)中的數(shù)據(jù)和權(quán)重參數(shù)讀取到數(shù)據(jù)滑窗和參數(shù)滑窗,通過乘法器使兩個(gè)窗口對(duì)應(yīng)位置數(shù)據(jù)相乘,將乘法運(yùn)算的結(jié)果輸入到加法樹電路中,便可得到一次卷積運(yùn)算的結(jié)果。整個(gè)卷積層的計(jì)算包含了四層循環(huán),用來控制數(shù)據(jù)和權(quán)重參數(shù)的讀取及計(jì)算過程。在輸出通道和輸入通道的循環(huán)操作上,添加Unroll 優(yōu)化指令作并行展開,可提高模塊計(jì)算速度[14]。對(duì)于第一層卷積層,輸入通道數(shù)為1,所以只在輸出通道上展開,設(shè)置并行度為8;對(duì)其余卷積層,輸出通道和輸入通道并行度均設(shè)置為4。
池化層的結(jié)構(gòu)比較簡(jiǎn)單,只需要池化窗口在輸入數(shù)據(jù)上滑動(dòng)一遍,便能得到輸出數(shù)據(jù)。文中使用的池化函數(shù)均為最大池化,池化窗口的寬度應(yīng)和池化的步長(zhǎng)保持一致,用到的池化步長(zhǎng)為2 和3。對(duì)于步長(zhǎng)為2 的池化層,只需要一個(gè)比較器便可以實(shí)現(xiàn)最大池化,步長(zhǎng)為3 的池化則需要兩級(jí)比較器來實(shí)現(xiàn)。圖5 所示為步長(zhǎng)為3 的最大池化窗口結(jié)構(gòu)。
圖4 卷積計(jì)算過程
圖5 最大池化窗口
全局平均池化層設(shè)計(jì)方法和最大池化層類似,計(jì)算過程如圖6 所示。將輸入數(shù)據(jù)輸入到累加器電路中進(jìn)行累加,累加的次數(shù)通過計(jì)數(shù)器電路控制,最后將累加的運(yùn)算結(jié)果輸入到平均值計(jì)算電路中進(jìn)行運(yùn)算,得到全局平均池化的結(jié)果。
圖6 全局平均池化計(jì)算過程
全連接層計(jì)算量較大,計(jì)算過程與卷積層類似,但是循環(huán)層數(shù)較少。全連接層的輸入數(shù)據(jù)經(jīng)過Flatten 操作,可看成每個(gè)輸入通道只有一個(gè)數(shù)據(jù),每個(gè)輸出通道也只會(huì)得到一個(gè)數(shù)據(jù)結(jié)果,因此只需要兩層循環(huán)即可完成。
殘差神經(jīng)網(wǎng)絡(luò)各層設(shè)計(jì)好后,根據(jù)網(wǎng)絡(luò)結(jié)構(gòu)完成硬件模塊連接,使用Dataflow 優(yōu)化指令對(duì)網(wǎng)絡(luò)進(jìn)行優(yōu)化[15],使數(shù)據(jù)以數(shù)據(jù)流的形式在各層之間流動(dòng),實(shí)現(xiàn)各層的流水線操作,有效地提高了網(wǎng)絡(luò)的吞吐率。模塊使用AXI_M 數(shù)據(jù)接口,實(shí)現(xiàn)與ARM CPU 的數(shù)據(jù)交互。經(jīng)過C 仿真、RTL/C 聯(lián)合仿真,模塊均能得到正確的計(jì)算結(jié)果,最后將模塊封裝成IP。
文中使用米聯(lián)客MZ7XA-7020 FPGA 開發(fā)板對(duì)算法進(jìn)行硬件部署驗(yàn)證,該板卡體積小、資源相對(duì)豐富且靈活度高,適合開發(fā)便攜式設(shè)備。
將設(shè)計(jì)完成的硬件模塊導(dǎo)入到Vivado 設(shè)計(jì)工具中,搭建圖7 所示的硬件系統(tǒng),用于該模塊的驗(yàn)證。整個(gè)系統(tǒng)可分為ZYNQ 和FPGA 兩個(gè)部分[16],F(xiàn)PGA的核心是Resnet 硬件模塊,用硬件實(shí)現(xiàn)心電信號(hào)的自動(dòng)識(shí)別;ZYNQ 的核心是ARM 處理器,負(fù)責(zé)運(yùn)行整個(gè)系統(tǒng)的控制程序。Resnet 模塊和ARM 之間的數(shù)據(jù)交互則通過AXI 總線完成[17]。系統(tǒng)中的BRAM 模塊用于數(shù)據(jù)的存儲(chǔ),Resnet 硬件模塊和ARM 處理器可以通過AXI 總線對(duì)BRAM 進(jìn)行數(shù)據(jù)的讀寫操作。整個(gè)系統(tǒng)的時(shí)鐘在ZYNQ 中設(shè)置產(chǎn)生,并提供給其他模塊使用。
圖7 硬件系統(tǒng)框圖
模塊硬件資源的使用情況如表3 所示,BRAM、DSP48E、FF(Flip-Flop)和LUT(Lookup Table)使用率分別為32.50%、32.27%、10.26%和28.64%??煽闯鯥P 模塊對(duì)四種硬件資源的使用均未超過可用資源量的三分之一,剩余的硬件資源供ECG 系統(tǒng)的其他模塊使用,可以滿足便攜式心電檢測(cè)系統(tǒng)小型化的要求。
表3 資源占用情況
性能分析如表4 所示,表中記錄了硬件IP 模塊處理完1 264 條數(shù)據(jù)的總時(shí)間和每條數(shù)據(jù)的平均時(shí)間,并與在ARM Cortex-A9 CPU 中用純軟件模式實(shí)現(xiàn)運(yùn)行的計(jì)算時(shí)間進(jìn)行對(duì)比。從表4 可以看出,在100 MHz 的時(shí)鐘頻率下,處理同樣一條心電數(shù)據(jù),硬件IP 模塊的速度是ARM CPU 純軟件實(shí)現(xiàn)速度的2.07 倍。
表4 FPGA與ARM CPU計(jì)算時(shí)間比較
在FPGA 嵌入式平臺(tái)對(duì)文中Resnet 網(wǎng)絡(luò)模型進(jìn)行測(cè)試,輸入測(cè)試集1 264 條心電數(shù)據(jù),將測(cè)試結(jié)果與keras 框架下的網(wǎng)絡(luò)測(cè)試結(jié)果相比較,其中,5 條數(shù)據(jù)輸出結(jié)果與軟件結(jié)果不一致,硬件計(jì)算的準(zhǔn)確率達(dá)到了99.60%。
表5 FPGA計(jì)算準(zhǔn)確率
文中針對(duì)實(shí)時(shí)心電數(shù)據(jù)的自動(dòng)分類識(shí)別,設(shè)計(jì)了一種適用于便攜式心電檢測(cè)的殘差神經(jīng)網(wǎng)絡(luò)硬件IP,可實(shí)現(xiàn)正常心電圖、房性早搏、心動(dòng)過速、心動(dòng)過緩四種心電信號(hào)的分類,分類準(zhǔn)確率分別達(dá)到87.31%、89.40%、97.39%、95.24%。在FPGA 上搭建硬件系統(tǒng),完成了硬件IP 模塊的驗(yàn)證,與軟件計(jì)算結(jié)果相比,速度提升2 倍以上;且硬件資源消耗較少、準(zhǔn)確率高,能夠滿足便攜式心電檢測(cè)系統(tǒng)的要求,具有實(shí)際應(yīng)用價(jià)值。未來將用更大的數(shù)據(jù)集進(jìn)行驗(yàn)證,進(jìn)一步提升算法的普適性。