粟 煒,宗 容,張 強(qiáng),奎皓然,楊宏波,王威廉+
(1.云南大學(xué) 信息學(xué)院,云南 昆明 650500;2.云南省阜外心血管病醫(yī)院 心血管內(nèi)科,云南 昆明 650102)
如今,先心病已經(jīng)成為嚴(yán)重危害青少年健康成長(zhǎng)的疾病,早預(yù)防、早發(fā)現(xiàn)、早診斷、早治療是減少先心病危害的4種重要途徑[1],早發(fā)現(xiàn)、早診斷是4個(gè)途徑中難以實(shí)現(xiàn)的。對(duì)先心病的早發(fā)現(xiàn)、早診段,僅能通過醫(yī)務(wù)人員的下鄉(xiāng)篩查、定點(diǎn)檢查等方式,帶來難度大、成本高等缺陷。隨著信息時(shí)代的發(fā)展,可以利用深度學(xué)習(xí)對(duì)心音進(jìn)行分類,然后將網(wǎng)絡(luò)模型移植進(jìn)低成本、高實(shí)時(shí)性的嵌入式端,進(jìn)行離線的輔助診斷,以此來緩解先心病篩查的壓力。
卷積神經(jīng)網(wǎng)絡(luò)(convolutional neural network,CNN)是目前在圖像處理領(lǐng)域應(yīng)用成熟,同時(shí)也被廣泛應(yīng)用在語音語義識(shí)別、生物醫(yī)學(xué)信號(hào)分類等方面的深度學(xué)習(xí)模型中[2-4]。CNN也被應(yīng)用在心音分類[5],有些研究者將心音數(shù)據(jù)變換得到聲譜圖、頻譜圖的形式,再利用卷積結(jié)構(gòu)提取圖像特征,這類方法的平均準(zhǔn)確率也達(dá)到0.8[6-8]。但此類研究也有局限:隱層中參數(shù)過多造成計(jì)算量大、實(shí)時(shí)性不高;該研究的架構(gòu)需依賴高功耗、高成本的硬件環(huán)境,難以移植進(jìn)低功耗、低成本嵌入式平臺(tái)。因此,針對(duì)這些問題,本文對(duì)先心病心音CNN分類算法和其并行執(zhí)行能力進(jìn)行了研究:首先,對(duì)心音信號(hào)進(jìn)行預(yù)處理;其次,設(shè)計(jì)CNN的網(wǎng)絡(luò)結(jié)構(gòu);最后,通過對(duì)卷積層中的循環(huán)進(jìn)行流水線的設(shè)計(jì),實(shí)現(xiàn)了先心病心音分類算法的硬件加速。本文在硬件加速的過程中,保證算法達(dá)到平均準(zhǔn)確率的前提下,損失部分計(jì)算精度以換取算法在硬件中執(zhí)行效率的提升。本文在多種嵌入式平臺(tái)上選用了ZYNQ系列片上系統(tǒng),本文采用的了Zynq-7020芯片(Zedboard)并在VIVADO HLS進(jìn)行綜合仿真。
CNN是一種深度前饋神經(jīng)網(wǎng)絡(luò),由輸入層、隱層、全連接層和輸出層組成。考慮到卷積神經(jīng)網(wǎng)絡(luò)具有高度并行性的特點(diǎn),十分契合FPGA的運(yùn)行機(jī)制,CNN也被證實(shí)了在心音分類上具有一定的優(yōu)勢(shì)。本文設(shè)計(jì)了一種適于先心病心音分類的CNN結(jié)構(gòu),該結(jié)構(gòu)由兩個(gè)卷積層、兩個(gè)池化層和一個(gè)全連接層所組成,如圖1所示。

圖1 先心病分類算法的CNN網(wǎng)絡(luò)結(jié)構(gòu)
其中模型的隱層由卷積層和池化層交替連接組成,通過卷積操作提取局部特征,通過池化操作對(duì)卷積層產(chǎn)生的特征向量進(jìn)行降維,并將其輸入到一個(gè)或多個(gè)全連接層。全連接層在整個(gè)CNN中起到分類器的作用,其將隱層中學(xué)習(xí)到的分布式特征映射到樣本標(biāo)記空間,最終經(jīng)過Softmax獲得輸出結(jié)果。Softmax函數(shù)公式如式(1)所示
(1)

卷積層與池化層之間都需要通過激活函數(shù)實(shí)現(xiàn)非線性變化,激活函數(shù)負(fù)責(zé)將上一層的輸出結(jié)果映射成非線性函數(shù),作為下一層網(wǎng)絡(luò)的輸入向量。相比于Sigmoid/tanH函數(shù),ReLU只需要一個(gè)門限值,即可得到激活值,計(jì)算速度更快。本文采用的ReLU做層間的激活函數(shù), ReLU函數(shù)可以很好地克服梯度的消失,ReLU函數(shù)公式如式(2)所示,式(2)中x為卷積后輸出的參數(shù)

(2)
從圖1中,可看出本文所用CNN網(wǎng)絡(luò)結(jié)構(gòu)簡(jiǎn)單和隱層的參數(shù)不多。因?yàn)轭A(yù)處理已經(jīng)顯化了數(shù)據(jù)的特征,因此不需要復(fù)雜的網(wǎng)絡(luò)結(jié)構(gòu)來處理數(shù)據(jù)。在對(duì)算法進(jìn)行硬件移植的過程中,隱層的參數(shù)帶來的計(jì)算量決定了算法在硬件上的執(zhí)行效率和硬件資源的使用率。因此,在保證分類準(zhǔn)確率的前提下,減少隱層的參數(shù),可以留有大量的硬件資源方便后期的在硬件上的優(yōu)化操作。在上述模型中,各層的權(quán)重值、偏置值、特征圖的個(gè)數(shù)及變量見表1。實(shí)驗(yàn)采用基于快速特征嵌入的卷積結(jié)構(gòu)(convolutional architecture for fast feature embedding,CAFFE)框架的CNN模型作為先心病分類算法的分類器。在圖1中,在卷積層、池化層、全連接層下面留有結(jié)構(gòu)體名稱,會(huì)在2.2節(jié)對(duì)其做解釋。

表1 各層權(quán)重值、偏置值、特征圖個(gè)數(shù)及變量
1.2.1 數(shù)據(jù)說明
本文中1020例心音數(shù)據(jù)樣本,用于訓(xùn)練和測(cè)試CNN模型,均為課題組從臨床(1歲到20歲)先心病患者,以及在先心病篩查中6歲到20歲志愿者實(shí)際采集所得。數(shù)據(jù)采樣率為5000 Hz,每個(gè)樣本長(zhǎng)度為20 s,病例樣本均為超聲心動(dòng)圖確診,即采用“金標(biāo)準(zhǔn)”[10]確認(rèn)過的數(shù)據(jù)。此數(shù)據(jù)集中包括:訓(xùn)練集900例,其中正常心音樣本450例,異常心音樣本450例;測(cè)試集為120例,其中正常心音樣本60例,異常心音樣本60例。研究樣本標(biāo)注為:正常心音標(biāo)簽為0,異常心音標(biāo)簽為1。
1.2.2 數(shù)據(jù)預(yù)處理
借鑒CNN在語音信號(hào)處理的研究,本文將一維心音信號(hào)[11]進(jìn)行短時(shí)傅里葉變換(short-time Fourier transform,STFT)[12],采用時(shí)頻分析的方法對(duì)心音信號(hào)進(jìn)行分析。在此研究中,將每例樣本平均截?cái)喑?0個(gè)片段,每段時(shí)長(zhǎng)為2 s,含2-3個(gè)完整心動(dòng)周期,如圖2所示。隨機(jī)對(duì)每例心音數(shù)據(jù)選出1個(gè)片段,在MATLAB上使用SPECGRAM函數(shù)對(duì)單個(gè)片段進(jìn)行短時(shí)傅里葉變換,用于顯化心動(dòng)周期的特征。考慮到心音信號(hào)的病理雜音通常發(fā)生在心臟的收縮期,時(shí)長(zhǎng)約為0.20 s-0.25 s,實(shí)施短時(shí)傅里葉變換的參數(shù)如下選擇,窗長(zhǎng)0.256 s(1280樣點(diǎn))可以包含一個(gè)S1至S2的時(shí)間片段;步進(jìn)128點(diǎn)(0.025 s),可最大限度捕獲病理特征,得到如圖3所示的時(shí)頻圖,該時(shí)頻圖像素大小為560*420,其反映了心音信號(hào)經(jīng)時(shí)域、頻域變換后,在相位、頻率和能量方面的特征。通過Linux下的BASH腳本中RESIZE函數(shù)對(duì)其進(jìn)行歸一化,歸一化后的特征圖像像素大小為64*64。心音數(shù)據(jù)采用上述方法預(yù)處理后,作為后期分類器的輸入樣本。

圖2 一個(gè)心音片段的心音原信號(hào)

圖3 一個(gè)心音片段的時(shí)頻圖
1.2.3 數(shù)據(jù)集制作
為對(duì)應(yīng)本文所設(shè)計(jì)的CNN模型結(jié)構(gòu),心音數(shù)據(jù)需做預(yù)處理才能放入CNN模型中進(jìn)行訓(xùn)練。原始的心音數(shù)據(jù)是一維信號(hào),而CAFFE框架中使用的數(shù)據(jù)類型為內(nèi)存映射數(shù)據(jù)庫(kù)(lightning memory-mapped database,LMDB),LMDB并不支持音頻信號(hào)數(shù)據(jù),因此需要將心音數(shù)據(jù)經(jīng)過預(yù)處理成圖像形式,再進(jìn)行歸一化,并生成數(shù)據(jù)集和均值文件,如圖4所示。

圖4 數(shù)據(jù)集制作流程
經(jīng)上述的方法,將時(shí)頻圖制作成訓(xùn)練集、測(cè)試集后,放入設(shè)計(jì)好的CNN模型,在PC上進(jìn)行訓(xùn)練和測(cè)試。數(shù)據(jù)樣本共有1020張時(shí)頻圖,其中訓(xùn)練集900張,正常和異常樣本各450張;測(cè)試集為120張,正常樣本有60張,異常樣本有60張;實(shí)驗(yàn)中在PC上訓(xùn)練900張時(shí)頻圖獲得了0.8222的準(zhǔn)確度,對(duì)120張時(shí)頻圖的分類獲得了0.8667的準(zhǔn)確度。PC端訓(xùn)練集結(jié)果見表2,其中訓(xùn)練集的準(zhǔn)確度、損失函數(shù)直接從終端顯示得知,測(cè)試集準(zhǔn)確度需要根據(jù)式(2)計(jì)算得出,PC上對(duì)測(cè)試集的結(jié)果見表3。

表2 PC訓(xùn)練和測(cè)試結(jié)果

表3 PC測(cè)試結(jié)果
其中損失函數(shù)采用的二分類中常見的對(duì)數(shù)損失,也稱為交叉熵?fù)p失,如式(3)所示
(3)

準(zhǔn)確度定義為式(4)所示
(4)
式中:TP為正確識(shí)別的正常心音,F(xiàn)P為錯(cuò)誤識(shí)別的正常心音,TN表示為正確識(shí)別的異常心音,F(xiàn)N表示為錯(cuò)誤識(shí)別的異常心音。
高層次綜合將硬件領(lǐng)域和軟件領(lǐng)域相結(jié)合,為軟件設(shè)計(jì)人員提供了高效的系統(tǒng)設(shè)計(jì),使得軟件開發(fā)者可以在FPGA上加速算法的密集型計(jì)算部分。本文通過以下3個(gè)步驟來保證算法在硬件上的適用性、高效性。首先是對(duì)模型進(jìn)行量化,降低計(jì)算精度,以應(yīng)對(duì)無浮點(diǎn)硬核的FPGA。然后,利用VIVAOD HLS中提供的編譯指令來提高算法在硬件上的工作效率。最后,在FPGA上,通過流水線約束的方法,去控制數(shù)據(jù)流在硬件中的運(yùn)行效率,來獲得更低的計(jì)算延時(shí)。
在對(duì)算法進(jìn)行硬件移植的過程中,研究發(fā)現(xiàn)大多數(shù)的FPGA上并沒有浮點(diǎn)硬核[13],因此保持如此高的計(jì)算精度并不明智。同時(shí)也考慮到今后的算法需要對(duì)不同版本的FPGA進(jìn)行移植,本文采用RISTRETTO固定點(diǎn)浮點(diǎn)數(shù)量化工具,對(duì)CNN模型的參數(shù)進(jìn)行量化,犧牲了算法部分精度。模型量化的目的是將32位浮點(diǎn)運(yùn)算轉(zhuǎn)換為16位定點(diǎn)運(yùn)算,用于適配大多數(shù)的FPGA,方便之后的移植。本文在Ubuntu OS下,完成對(duì)CNN模型的量化后,編寫python腳本用于提取模型參數(shù)的權(quán)重值和偏置值,并與卷積核數(shù)、輸入通道和卷積核尺寸保持對(duì)應(yīng)一致;然后將模型提取得到的參數(shù)保存為文本格式,使用CC++語言讀取文本格式中的內(nèi)容,用于算法在對(duì)數(shù)據(jù)集進(jìn)行處理、分類過程中的調(diào)用。
需要注意的是,在VIVADO HLS編程中,HLS提供了一種定點(diǎn)數(shù)據(jù)類型用于將數(shù)據(jù)建模為整數(shù)和小數(shù)位。在使用這種類型前,需要先導(dǎo)入AP_FIXED.H頭文件,才能使用ap_fixed.h
在VIVAOD HLS編程中,編譯指令(pragma)也是非常重要的一項(xiàng),因?yàn)槭褂肅C++高級(jí)綜合轉(zhuǎn)換到硬件電路是需要通過添加編譯指令來告訴編譯器一些額外的操作,這些操作將作為實(shí)現(xiàn)各種優(yōu)化設(shè)計(jì)的前提。
本文中使用了如下3類pragma編譯指令:
(1)接口類指令
代碼示例:#pragma HLS INTERFACE
其中
代碼示例:#pragma HLS INTERFACE register register_mode =
其中register_mode=
(2)數(shù)組類指令
代碼示例:#pragma HLS array_partition variable =
其中variable=
(3)數(shù)據(jù)流類指令
代碼示例:#pragma HLS stream variable =
其中variable=
本文在VIVADO HLS下采用CC++語言對(duì)已經(jīng)訓(xùn)練好的CNN前向過程進(jìn)行編程,使用CC++語言中的STRCUT類型(其中包含可以調(diào)用模型參數(shù)的函數(shù))存儲(chǔ)隱層參數(shù),通過求地址運(yùn)算符的方式調(diào)用參數(shù)。在圖1下方展示了模型各層結(jié)構(gòu)對(duì)應(yīng)的結(jié)構(gòu)體名稱。其中Strcut C1中存儲(chǔ)了卷積一層中的參數(shù),包含權(quán)重值的個(gè)數(shù)為600個(gè)(8*5*5*3),其中8為卷積核個(gè)數(shù),5*5為卷積核尺寸,3為輸入數(shù)據(jù)的通道數(shù),偏置值的個(gè)數(shù)為8個(gè)。Strcut P1用于存儲(chǔ)從經(jīng)池化一層池化后的結(jié)果,Strcut C2中存儲(chǔ)了卷積二層中的參數(shù),其包含的權(quán)重值的個(gè)數(shù)為2400個(gè)(8*12*5*5),其中12為卷積核個(gè)數(shù),5*5為卷積核尺寸,8為輸入數(shù)據(jù)的通道數(shù),偏置值的個(gè)數(shù)為12個(gè)。Strcut P2用于存儲(chǔ)經(jīng)池化二層池化后的結(jié)果;Strcut output中存儲(chǔ)了全連接層的參數(shù),Strcut Rst用于輸出分類結(jié)果。預(yù)處理后的數(shù)據(jù)導(dǎo)入進(jìn)HLS中,需要經(jīng)過以下的操作來獲取結(jié)果。
首先將64*64*3的時(shí)頻圖通過調(diào)用結(jié)構(gòu)體C1進(jìn)行卷積,經(jīng)過ReLU函數(shù)處理,得到大于0的數(shù)據(jù),再通過第一層的池化處理,將結(jié)果保存到結(jié)構(gòu)體P1中。同理,再次調(diào)用P1的地址,將參數(shù)輸入至卷積二層中進(jìn)行卷積,再進(jìn)行激活函數(shù)ReLU處理及第二層的池化處理,得到的結(jié)果數(shù)據(jù)存到結(jié)構(gòu)體P2中;通過調(diào)用P2的地址,將P2中保存的參數(shù)輸入到全連接層結(jié)構(gòu)體output進(jìn)行全局變量提取,再經(jīng)過結(jié)構(gòu)體Rst即可得到對(duì)心音數(shù)據(jù)的識(shí)別效果。在VIVADO高層次綜合中, FPGA加速CNN的測(cè)試文件遵從VIVADO高層次綜合的格式規(guī)范編寫[14],具體測(cè)試程序如圖5所示,運(yùn)行完成后在VIVADO HLS的仿真串口中查看運(yùn)行結(jié)果。

圖5 高層次綜合的TESTBENCH編寫流程
本文使用的CNN模型在1.1節(jié)中已經(jīng)介紹,在每一個(gè)卷積層內(nèi)采用6個(gè)for循環(huán)進(jìn)行相互嵌套循環(huán)。按照順序依次遍歷卷積核數(shù)量、通道數(shù)量、卷積圖像高度、卷積圖像寬度、卷積核行數(shù)、卷積核列數(shù)。為了便于討論,本文將卷積一層C1中部分代碼列出,其中for循環(huán)代碼如圖6所示,代碼對(duì)應(yīng)的約束方法如圖7所示。本文設(shè)定最內(nèi)層,即卷積核寬度作為第一層,自內(nèi)向外的層數(shù)依次遞增,用于說明在不同循環(huán)層進(jìn)行約束后與其所生成IP核的性能的關(guān)系。

圖6 卷積層for循環(huán)代碼示例

圖7 HLS中Directive配置
在FPGA上實(shí)現(xiàn)硬件加速算法,通常對(duì)卷積中的for循環(huán)層采用流水線(Pipeline)約束或者展開(Unroll)約束這類方法來提升算法的執(zhí)行能力[15]。相對(duì)于不采用任何約束的執(zhí)行方式,Pipeline約束可以減少整個(gè)數(shù)據(jù)的操作時(shí)間,且只增加少量的邏輯資源。Unroll約束是將循環(huán)完全展開,讓多個(gè)計(jì)算單元同時(shí)運(yùn)行,因此硬件資源消耗比Pipeline約束帶來的硬件資源消耗更大,效率也要比Pipeline約束更高。
在目前的研究中,平衡CNN_IP核的資源消耗和計(jì)算性能最優(yōu)的方法是對(duì)最內(nèi)層的循環(huán)采用Pipeline約束,使用Pipeline約束的特點(diǎn)是當(dāng)前層循環(huán)下的子循環(huán)都會(huì)執(zhí)行Unroll約束[16]。而只對(duì)最內(nèi)層的循環(huán)采用Pipeline約束時(shí),由于沒有子循環(huán),便不會(huì)執(zhí)行Unroll約束。在這種情況下,CNN_IP核的資源消耗將會(huì)是最小的,同時(shí),也可以為大多數(shù)應(yīng)用程序提供可接受的吞吐量。Pipeline約束的層數(shù)循環(huán)越高,其子循環(huán)執(zhí)行Unroll約束越多,消耗的計(jì)算和存儲(chǔ)資源將會(huì)越多,帶來吞吐量的增加和計(jì)算延時(shí)上的縮減。這就使得IP核的性能得到提高。首先,將卷積一層中的for循環(huán)從最內(nèi)層逐步向外層依次展開,通過HLS生成的綜合報(bào)告可以看到IP核的各方面的資源消耗;其次,確定好卷積一層的優(yōu)化后,再開始進(jìn)行對(duì)卷積二層的優(yōu)化;最后,根據(jù)資源消耗報(bào)告確定最終優(yōu)化方案。
在本文研究中,研發(fā)環(huán)境為Xilinx公司的VIVADO HLS v2019.1開發(fā)工具以及Zedboard開發(fā)板(主芯片是XCZ7020),芯片的PS部分的時(shí)鐘頻率為33.333 MHz,芯片的PL部分的時(shí)鐘頻率為100 MHz。PC端的操作系統(tǒng)為Ubnutu16.04 OS,其使用的中央處理器型號(hào)為Intel core i5-8300H CPU 2.30 GHz,分別對(duì)進(jìn)行預(yù)處理后的單張和多張心音數(shù)據(jù)樣本進(jìn)行測(cè)試,對(duì)獲得的結(jié)果進(jìn)行了分析。
本實(shí)驗(yàn)在VIVADO HLS中編程實(shí)現(xiàn)IP核。在卷積一層中,對(duì)不同的for循環(huán)層采用流水線約束綜合后對(duì)應(yīng)的計(jì)算延時(shí)和硬件資源消耗,見表4。在對(duì)卷積一層優(yōu)化的基礎(chǔ)上,對(duì)卷積二層優(yōu)化后IP核的計(jì)算延時(shí)和硬件資源消耗見表5。最終優(yōu)化目標(biāo)的時(shí)鐘頻率、時(shí)鐘不確定性、估計(jì)可達(dá)到的最快時(shí)鐘頻率的報(bào)告見表6。

表4 C1優(yōu)化后IP核的延時(shí)和資源消耗

表5 C2優(yōu)化后IP核的延時(shí)和資源消耗

表6 IP核的時(shí)鐘頻率報(bào)告
表4、表5中的DSP48E表示PL中的數(shù)字信號(hào)處理邏輯單元,共計(jì)220個(gè);LUT表示PL中的一種用于實(shí)現(xiàn)組合邏輯和時(shí)序邏輯的存儲(chǔ)資源,共計(jì)53 200個(gè);隨著并行度的增加,對(duì)數(shù)字信號(hào)處理器模塊(DSP)和LUT的資源消耗的使用會(huì)大大增加;從表5中可以看出,在卷積二層中,流水線處理第三層循環(huán)時(shí),綜合的IP具有最低的計(jì)算延時(shí),但是LUT消耗資源已經(jīng)達(dá)到飽和狀態(tài)。因此最終確定的優(yōu)化方法是同時(shí)對(duì)卷積一層中的第三層for循環(huán)和卷積二層中的第三層for循環(huán)采用流水線約束,計(jì)算延時(shí)周期數(shù)為3 168 322個(gè)(每個(gè)周期10 ns),單個(gè)周期計(jì)算延時(shí)預(yù)計(jì)可達(dá)8.621 ns,總體計(jì)算延時(shí)通過計(jì)算延時(shí)的周期數(shù)與單個(gè)周期計(jì)算延時(shí)相乘獲得,約為0.03 s。
在卷積一層和卷積二層中,約束不同的for循環(huán)層,對(duì)單張時(shí)頻圖進(jìn)行識(shí)別所消耗的時(shí)間見表7。結(jié)合表4,當(dāng)對(duì)卷積一層中的第一層for循環(huán)(最內(nèi)層循環(huán))做流水線約束后,DSP48E的資源消耗量增加約0.5%和LUT的資源消耗量增加約1%,將IP核的計(jì)算延時(shí)縮短了1.3倍;越往外層約束,資源利用率越高,得到效率也越高,在第三層時(shí)IP核的計(jì)算延時(shí)縮短了1.7倍;再結(jié)合表5,對(duì)第二層卷積中的第一層for循環(huán)進(jìn)行流水線約束后,DSP48E和LUT的資源消耗量增加約0.5%。在對(duì)卷積一層優(yōu)化后的時(shí)間基礎(chǔ)上,將IP核的計(jì)算延時(shí)縮短了1.73倍;對(duì)卷積二層中的第三層for循環(huán)優(yōu)化后,LUT的資源消耗達(dá)到飽和。對(duì)比于表4中,未對(duì)IP核作優(yōu)化產(chǎn)生計(jì)算延時(shí),優(yōu)化后的計(jì)算延時(shí)縮短了約7.4倍。

表7 PC與嵌入式設(shè)備實(shí)現(xiàn)算法對(duì)數(shù)據(jù)集測(cè)試的效率對(duì)比
在上述的基礎(chǔ)上,對(duì)模型實(shí)現(xiàn)流水線約束前后運(yùn)行效率對(duì)比PC上運(yùn)行效率進(jìn)行分析,見表7,其Zynq-7020(*)表示未采用任何約束,Zynq-7020表示采用流水線的約束。本文對(duì)兩個(gè)卷積層中的第三層for循環(huán)同時(shí)采用流水線約束,相比于PC提升了約2.38倍的識(shí)別速度。雖然識(shí)別率降低了,但是可以增加算法在FPGA中的普適性。
本文在已有研究的基礎(chǔ)上進(jìn)行了新的探索,對(duì)心音信號(hào)進(jìn)了預(yù)處理,設(shè)計(jì)了一種結(jié)構(gòu)簡(jiǎn)單、隱層參數(shù)少的先心病心音CNN分類算法。結(jié)合CNN內(nèi)部運(yùn)算特點(diǎn),在VIVADO HLS上將算法映射到FPGA中的并行硬件,仿真實(shí)現(xiàn)了對(duì)算法的硬件加速。解決了先心病心音分類算法需要依賴高成本、高功耗的硬件設(shè)備,實(shí)時(shí)性不高等問題,雖然過程中損失部分精度,但準(zhǔn)確率也達(dá)到這類方法的平均準(zhǔn)確度。本文適用于先心病下鄉(xiāng)篩查、定點(diǎn)篩查等場(chǎng)合,這類先心病篩查需要設(shè)備具有高效率、低成本等特點(diǎn)。此外,在硬件綜合的測(cè)試完成之后,可以把硬件加速先心病的分類識(shí)別的CC++程序,封裝為可供片上系統(tǒng)使用的IP核,這便于今后將先心病心音CNN分類算法向ZYNQ片上系統(tǒng)的移植。