我們的目標(biāo)是為人類帶來適當(dāng)?shù)男呐K護(hù)理。及早發(fā)現(xiàn)這些病變對于有效治療至關(guān)重要。
背景
根據(jù)世界衛(wèi)生組織的數(shù)據(jù),中低收入國家的主要死因與心臟病有關(guān),即使在中高收入國家,也位居前三。
盡管高收入國家可以獲得醫(yī)療保健、控制和治療,但在發(fā)展中國家,這種獲得是有限且昂貴的。在這些情況下,人們會患上心臟病,如果在疾病的早期階段沒有得到適當(dāng)?shù)闹委煟赡軙旅?/p>
該項目的目的是制作出能夠檢測不同心臟疾病的功能性且具有成本效益的設(shè)備的第一個原型。該設(shè)備將允許人們進(jìn)行初步診斷。在每一分鐘都很重要的低收入國家,即使是醫(yī)生也可以提高他們的時間效率。
此外,在中高收入國家,該設(shè)備將有助于人們獲得初步診斷并鼓勵在發(fā)現(xiàn)某些情況時去看醫(yī)生,從而避免一些可避免的死亡。
解決方案
為了解決這個問題,我們正在構(gòu)建一種基于低成本部件的小型便攜式設(shè)備。該設(shè)備將包含一個具有處理能力的主板(如 STM32F407G-DISC1),用于讀取 ECG 信號的電子設(shè)備和一個顯示分析結(jié)果的小屏幕。
目前,真正的心電圖設(shè)備既重又昂貴。這些設(shè)備設(shè)計為高度可靠且信號清晰。由于我們的設(shè)備是為初步診斷而設(shè)計的,并且數(shù)據(jù)將通過軟件進(jìn)行分析,因此數(shù)據(jù)不需要人體需要的所有細(xì)節(jié)和信號清潔度。降低細(xì)節(jié)和過濾級別,該設(shè)備變得輕巧、便宜且實用。
由于其低功耗的特性,這將允許很容易地運(yùn)送到偏遠(yuǎn)的土地并使用電池甚至可再生能源(太陽能、風(fēng)能)供電。
如何工作
該設(shè)備有一些連接到患者身體的導(dǎo)線。這導(dǎo)致測量與心臟行為相關(guān)的體內(nèi)電壓變化。我們收到的這個信號通過 STM32F407G-DISC1 的模數(shù)轉(zhuǎn)換器進(jìn)行放大和測量。
然后數(shù)據(jù)由具有項目主要處理能力的微控制器處理。微控制器將有一個神經(jīng)網(wǎng)絡(luò),該網(wǎng)絡(luò)之前使用大量數(shù)據(jù)集進(jìn)行訓(xùn)練,將分析和分類心臟信號,并嘗試檢測可能的病變。
我們計劃對接收到的數(shù)據(jù)加上神經(jīng)網(wǎng)絡(luò)的輸出進(jìn)行可視化表示,以便將分析結(jié)果告知患者/醫(yī)生。
第一部分
第一部分旨在獲取和放大心電圖的信號,以便微控制器可以讀取它。一旦數(shù)據(jù)已經(jīng)數(shù)字化,微控制器會將其發(fā)送到 Raspberry Pi 3,神經(jīng)網(wǎng)絡(luò)將在其中提取參數(shù)并生成結(jié)果。
rPi 將不斷地將數(shù)據(jù)發(fā)送到 TFT,其中包含 ECG 的當(dāng)前測量值和神經(jīng)網(wǎng)絡(luò)分類的結(jié)果。
理論:心電圖
心電圖 (ECG/EKG) 是我們的心臟在跳動時產(chǎn)生的電壓信號。每個節(jié)拍都是一系列的收縮和放松,需要電信號以特定的順序流過肌肉。該信號在皮膚上傳播,可以使用正確的傳感器進(jìn)行測量。它們是用身體兩點之間的電壓差來計算的。
這些信號可以在我們身體的幾個點之間測量,產(chǎn)生不同的波。在我們的例子中,我們專注于展示更常見的模式,稱為 QRS 模式,前面是 P 波,然后是 Q 波。這個信號是使用 3 個電極測量的,兩個在肩膀附近,一個在臀部。
QRS 復(fù)合波的形狀可用于確定幾種病理和心率。心電圖中顯示的健康心臟和病變心臟之間的差異從細(xì)微的變化到完全不同的信號不等。此外,一些病理癥狀可能會隨機(jī)出現(xiàn)或在醫(yī)生未測量時出現(xiàn)。如果可以在沒有人為干預(yù)的情況下實時測量和分析 ECG 信號,則可以更早地診斷出許多疾病。
在其他方面,可以使用許多 AI 算法來完成心電圖信號的表征和早期診斷。在我們的例子中,為了簡單和易于實現(xiàn),我們選擇神經(jīng)網(wǎng)絡(luò)分類器。這些網(wǎng)絡(luò)的輸入是一組參數(shù),并基于此網(wǎng)絡(luò)生成輸出,即基于參數(shù)和學(xué)習(xí)過程的信號分類。
理論:神經(jīng)網(wǎng)絡(luò)
一個神經(jīng)網(wǎng)絡(luò)是由多個分層排列的神經(jīng)元組成的。每一層從上一層獲取輸入并計算其輸出,供下一層使用,直到最后一層輸出為信號的分類。
為了讓神經(jīng)網(wǎng)絡(luò)正常工作,我們需要對其進(jìn)行訓(xùn)練。我們需要一組信號,從中我們可以知道神經(jīng)網(wǎng)絡(luò)的預(yù)期輸出。例如,如果我們想判斷一個信號是健康的還是它有 AV 塊,我們需要醫(yī)生已經(jīng)分類的兩種情況的樣本信號。然后我們訓(xùn)練神經(jīng)網(wǎng)絡(luò),直到它知道什么是常規(guī)心電圖或不健康心電圖。然后我們可以傳遞真實的數(shù)據(jù)并得到輸出。
總而言之,為了使用神經(jīng)網(wǎng)絡(luò),我們需要:
定義網(wǎng)絡(luò),即每層有多少輸入?yún)?shù),多少輸出,層數(shù),神經(jīng)元
使用已知數(shù)據(jù)集訓(xùn)練網(wǎng)絡(luò)。
使用帶有訓(xùn)練階段參數(shù)的網(wǎng)絡(luò)。
這是對神經(jīng)網(wǎng)絡(luò)的一個非常簡單的解釋,深入了解其操作和不同類型需要更復(fù)雜的介紹,這與本項目的范圍相去甚遠(yuǎn)。
技術(shù)
由于語言的可靠性,代碼的核心主要用 ADA 編寫,這在處理與患者健康相關(guān)的項目時至關(guān)重要。
實現(xiàn):神經(jīng)網(wǎng)絡(luò)
第一步是在 ADA 中實現(xiàn)神經(jīng)網(wǎng)絡(luò),這是該項目的核心。尋找相關(guān)信息,我們發(fā)現(xiàn)使用這種語言的神經(jīng)網(wǎng)絡(luò)做得很少。所以我們發(fā)現(xiàn)在 ADA 中為神經(jīng)網(wǎng)絡(luò)開發(fā)一個通用庫非常有用,這樣它就可以在其他項目中使用。該庫包含創(chuàng)建神經(jīng)網(wǎng)絡(luò)、訓(xùn)練和執(zhí)行它的必要工具,對網(wǎng)絡(luò)的訓(xùn)練階段和生產(chǎn)階段都很有用。
對于網(wǎng)絡(luò)的訓(xùn)練,需要有一個具有適當(dāng)配置的“input.dat”文件,其中包含神經(jīng)網(wǎng)絡(luò)的輸入以及預(yù)期的輸出。在代碼中,必須在“config.adb”文件中配置必要的參數(shù),例如網(wǎng)絡(luò)的層數(shù)、所需的輸入和輸出的數(shù)量、每層的大小或?qū)W習(xí)速度。作為輸出,它生成一個“weights.dat”文件,其中包含為每個神經(jīng)元生成的權(quán)重,這對于在生產(chǎn)階段執(zhí)行是必需的。
我們提供了神經(jīng)元體和神經(jīng)元執(zhí)行器的一些基本函數(shù)、求和函數(shù)和 sigmoid 函數(shù)。該系統(tǒng)經(jīng)過規(guī)劃,因此可以輕松地為網(wǎng)絡(luò)包含和配置更多功能。
完整的庫位于“neural-network-lib”文件夾中。網(wǎng)絡(luò)的訓(xùn)練,作為使用和操作的例子,已經(jīng)在“neural-learning”文件夾內(nèi)的項目中開發(fā)。神經(jīng)網(wǎng)絡(luò)的生產(chǎn)模式示例可以在“example-run-net”文件夾中找到,其中還包括快速傅里葉變換的實現(xiàn),從 https://rosettacode.org/wiki/Fast_Fourier_transform#Ada 獲得,我們發(fā)現(xiàn)這對于處理神經(jīng)網(wǎng)絡(luò)的輸入信號非常有用。
STM32
該項目位于“STM32”文件夾中。對于STM32板子,我們不得不對神經(jīng)網(wǎng)絡(luò)進(jìn)行修改,因為代碼不兼容,主要是屏幕輸出和文件處理。由于這個原因,這個版本的STM32庫只適合生產(chǎn),不適合訓(xùn)練網(wǎng)絡(luò),神經(jīng)元的權(quán)重必須通過“.ads”文件引入。
此外,由于返回不受約束的元素和大量使用遞歸的問題,必須對快速傅里葉變換代碼進(jìn)行修改。
使用開發(fā)板的 USART 開發(fā)了一個控制臺模塊,以便能夠使用開發(fā)板的 PA2 和 PA3 引腳在屏幕上查看結(jié)果并將它們發(fā)送到 Raspberry Pi 模塊。USART 閱讀也通過中斷發(fā)展。它可以在文件“console.adb”中找到。
另一個必要的部分是使用 ADC,獲取心跳信息,分析它們并將它們發(fā)送到神經(jīng)網(wǎng)絡(luò)。為此,板上的 ADC 器件已配置在引腳 PA4 上,分辨率為 12 位,將輸入轉(zhuǎn)換為 0V 到 3.3V 之間的值。它在文件“ecgreader.adb”中。
ECG 數(shù)據(jù)處理的主要部分在文件“ecgprocess.adb”中。一旦接收到 0v 和 3.3V 之間的原始輸入,它會對信號執(zhí)行快速傅里葉變換,然后是模塊。從這個結(jié)果中,它從信號中提取一些參數(shù),這些參數(shù)稍后將用作神經(jīng)網(wǎng)絡(luò)的輸入。這些參數(shù)是:
最大
最低限度
意思是
方差
HaPo(將頻譜分成同一區(qū)域的兩個部分的頻率)
程序執(zhí)行的主要順序是:
控制臺、ADC 和神經(jīng)網(wǎng)絡(luò)的初始化。
讀取心電圖數(shù)據(jù)
數(shù)據(jù)處理
神經(jīng)網(wǎng)絡(luò)的執(zhí)行
將神經(jīng)網(wǎng)絡(luò)輸出和 ECG 數(shù)據(jù)發(fā)送到 Raspberry Pi
這是通過 20 毫秒的實時延遲完成的
實現(xiàn):Python
為了在屏幕上顯示數(shù)據(jù),選擇了一個 python 腳本。該腳本將從串口獲取數(shù)據(jù),使用 scipy 對其進(jìn)行過濾,然后使用 matplotlib 進(jìn)行繪圖。
我們正在應(yīng)用低通濾波器以消除主要來自主電源(50 Hz 波)的噪聲。我們可以在下圖中看到信號和頻譜的影響。
在上圖中,我們可以看到直接從 ADC 到繪圖儀的信號。由于不完美的采樣時間,頻譜的頻率在 X 軸上有偏移。但是,為了去除高頻,我們可以使用整數(shù)。使用 BW 為 30-40Hz 的低通濾波器進(jìn)行濾波,我們得到一個干凈的信號。
結(jié)果
結(jié)果是有希望的,并且該項目提供了信號捕獲以及用于實現(xiàn)、訓(xùn)練和使用神經(jīng)網(wǎng)絡(luò)的幾個工具。然而,為了完成這個項目,需要一位真正的醫(yī)生,有真實的信號和適當(dāng)?shù)姆答仭?/p>
在這個階段,我們需要一些已經(jīng)表征的數(shù)據(jù)和一些現(xiàn)實生活中的測試,如果沒有醫(yī)院或醫(yī)療數(shù)據(jù),就不可能進(jìn)行測試。
評論
查看更多