天天看點

使用Python+TensorFlow2建構基于卷積神經網絡(CNN)的ECG心電信号識别分類(二)讀取編号為data的一條心電資料

使用Python+TensorFlow2建構基于卷積神經網絡(CNN)的ECG心電信号識别分類(二)

心律失常資料庫

目前,國際上公認的标準資料庫包含四個,分别為美國麻省理工學院提供的MIT-BIH(Massachusetts Institute of Technology-Beth Israel Hospital Database, MIT-BIH)資料庫、美國心髒學會提供的AHA( American heart association,AHA)資料庫、歐共體CSE( Common Standards for Quantitative Electrocardiograph,CSE)資料庫、歐洲ST-T資料庫。

目前使用最廣泛且被學術界普遍認可的據庫為MIT-BIH心律失常資料庫。此資料庫中囊括了所有類型的心電信号并且數量豐富,為本文關于心電信号的自動分類研究提供了實驗資料。下面對該資料庫作詳細的說明。

MT-BIH心律失常資料庫擁有48條心電記錄,且每個記錄的時長是30分鐘。這些記錄來自于47名研究對象。這些研究對象包括25名男性和22名女性,其年齡介于23到89歲(其中記錄201與202來自于同一個人)。信号的采樣率為360赫茲,AD分辨率為11比特。對于每條記錄來說,均包含兩個通道的信号。第一個通道一般為MLⅡ導聯(記錄102和104為V5導聯);第二個通道一般為V1導聯(有些為V2導聯或V5導聯,其中記錄124号為Ⅴ4導聯)。為了保持導聯的一緻性,往往在研究中采用MLⅡ導聯。本文選取MLⅡ導聯心電信号進行研究分析。

資料庫中的每條記錄均包括三個檔案,即:頭檔案、資料檔案和注釋檔案。

(1)頭檔案頭檔案[.hea] 通過ASCII碼存儲方式記錄信号的采樣頻率、采樣頻率、資料格式使用的導聯資訊、采樣頻率、研究者的性别、年齡以及疾病種類等

(2)資料檔案資料檔案[.dat] 通過二進制的方式存儲信号,每三個位元組存儲兩個數值(兩導聯資料交替存儲),每個數值大小是12bit

(3)注釋檔案注釋檔案[.atr] 是由專家對信号進行人工标注,并且根據二進制格式進行資料的存儲

關于MIT-BIH資料庫的一些常用網站

MIT-BIH資料庫的官方網站:

https://ecg.mit.edu/ MIT-BIH資料庫下載下傳: https://www.physionet.org/content/mitdb/1.0.0/

ZIP包下載下傳連結:Download the ZIP file (73.5 MB)

官網上關于該資料庫的詳細介紹網址:

https://archive.physionet.org/physiobank/database/html/mitdbdir/intro.htm#symbols

百度百科上的介紹也較為詳細,需要對其格式做深入了解的讀者可以參考:

https://baike.baidu.com/item/MIT-BIH 每條信号的基礎資訊可以查詢 https://www.physionet.org/physiobank/database/html/mitdbdir/mitdbdir.htm 資料庫中每條心電信号中的心拍類型表: https://archive.physionet.org/physiobank/database/html/mitdbdir/tables.htm#allbeats MIT-BIH心電資料可視化網站: https://www.physionet.org/lightwave/?db=mitdb/1.0.0 官方網站的可視化工具讀取展示MIT-BIH資料: https://archive.physionet.org/cgi-bin/atm/ATM

官方網站提供的可視化工具中有許多資料庫,請選擇mitdb資料庫。

相比之下更推薦使用倒數第二個網站進行檢視。

統一術語稱呼

我在閱讀心電相關論文的時候,常常由于不同文章之間對同一事物的稱呼不同而感到困擾。為避免在本文中出現類似情況,現将術語稱呼統一如下。

一條心電資料(記錄、信号):将編号為100,101...的資料稱為一條心電資料(記錄),包含了該編号中的所有導聯資料。由于本文僅使用MLII導聯的資料作為深度學習的訓練資料,是以在本文中也特指一條心電資料中的MLII導聯部分。

心拍:如文章(一)中圖檔所示,将一個完整的心電波形稱為一個心拍。

信号點(值):連續的心電波形圖其實是由一系列頻率固定的不連續采樣點構成的,将每個采樣點稱為信号點(值)。

心電資料的讀取

下載下傳資料庫到本地後打開,你會發現.dat檔案中全部都是亂碼,這是由于MIT-BIH資料庫采用了自定義的format212格式進行編碼。是以在讀取心電資料的時候,我們需要用到Python中的一個工具包:wfdb。

在Pycharm中建立工程,并将下載下傳好的心電資料集按如圖所示的目錄結構進行放置。其中ecg_data為心電資料集的檔案夾。

在該工程配置的Python環境中安裝wfdb包。

pip install wfdb

關于wfdb包的詳細使用請參考其官方文檔,這裡用代碼的形式給出一些常用操作。

讀取編号為data的一條心電資料

def read_ecg_data(data):

'''
讀取心電信号檔案
sampfrom: 設定讀取心電信号的起始位置,sampfrom=0表示從0開始讀取,預設從0開始
sampto:設定讀取心電信号的結束位置,sampto = 1500表示從1500出結束,預設讀到檔案末尾
channel_names:設定設定讀取心電信号名字,必須是清單,channel_names=['MLII']表示讀取MLII導聯線
channels:設定讀取第幾個心電信号,必須是清單,channels=[0, 3]表示讀取第0和第3個信号,注意信号數不确定
'''
# 讀取所有導聯的信号
record = wfdb.rdrecord('../ecg_data/' + data, sampfrom=0, sampto=1500)
# 僅僅讀取“MLII”導聯的信号
# record = wfdb.rdrecord('../ecg_data/' + data, sampfrom=0, sampto=1500, channel_names=['MLII'])
# 僅僅讀取第0個信号(MLII)
# record = wfdb.rdrecord('../ecg_data/' + data, sampfrom=0, sampto=1500, channels=[0])

# 檢視record類型
print(type(record))
# 檢視類中的方法和屬性
print(dir(record))

# 獲得心電導聯線信号,本文獲得是MLII和V1信号資料
print(record.p_signal)
print(np.shape(record.p_signal))
# 檢視導聯線信号長度,本文信号長度1500
print(record.sig_len)
# 檢視檔案名
print(record.record_name)
# 檢視導聯線條數,本文為導聯線條數2
print(record.n_sig)
# 檢視信号名稱(清單),本文導聯線名稱['MLII', 'V1']
print(record.sig_name)
# 檢視采樣率
print(record.fs)

'''
讀取注解檔案
sampfrom: 設定讀取心電信号的起始位置,sampfrom=0表示從0開始讀取,預設從0開始
sampto:設定讀取心電信号的結束位置,sampto=1500表示從1500出結束,預設讀到檔案末尾
'''
annotation = wfdb.rdann('../ecg_data/' + data, 'atr')
# 檢視annotation類型
print(type(annotation))
# 檢視類中的方法和屬性
print(dir(annotation))

# 标注每一個心拍的R波的尖鋒位置的信号點,與心電信号對應
print(annotation.sample)
# 标注每一個心拍的類型N,L,R等等
print(annotation.symbol)
# 被标注的數量
print(annotation.ann_len)
# 被标注的檔案名
print(annotation.record_name)
# 檢視心拍的類型
print(wfdb.show_ann_labels())

# 畫出資料
draw_ecg(record.p_signal)
# 傳回一個numpy二維數組類型的心電信号,shape=(65000,1)
return record.p_signal           

在這些函數中,使用最多的是通過record=wfdb.rdrecord來擷取心電資料資訊,以及通過annotation=wfdb.rdann來擷取心拍類型資訊。需要注意的是record的類型是一個(65000,1)的二維數組,需要先将其轉換成一維數組才可以對其進行預處理,關于預處理的這部分内容将在下篇文章中進行叙述。

原文位址

https://www.cnblogs.com/lxy764139720/p/12831422.html