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