1. 程式人生 > >使用Python+TensorFlow2構建基於卷積神經網路(CNN)的ECG心電訊號識別分類(二)

使用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/](https://ecg.mit.edu/) * MIT-BIH資料庫下載:[https://www.physionet.org/content/mitdb/1.0.0/](https://www.physionet.org/content/mitdb/1.0.0/) * ZIP包下載連結:[Download the ZIP file](https://storage.googleapis.com/mitdb-1.0.0.physionet.org/mit-bih-arrhythmia-database-1.0.0.zip) (73.5 MB) * 官網上關於該資料庫的詳細介紹網址:[https://archive.physionet.org/physiobank/database/html/mitdbdir/intro.htm#symbols](https://archive.physionet.org/physiobank/database/html/mitdbdir/intro.htm#symbols)。 * 百度百科上的介紹也較為詳細,需要對其格式做深入瞭解的讀者可以參考:[https://baike.baidu.com/item/MIT-BIH](https://baike.baidu.com/item/MIT-BIH)。 * 每條訊號的基礎資訊可以查詢[https://www.physionet.org/physiobank/database/html/mitdbdir/mitdbdir.htm](https://www.physionet.org/physiobank/database/html/mitdbdir/mitdbdir.htm) * 資料庫中每條心電訊號中的心拍型別表:[https://archive.physionet.org/physiobank/database/html/mitdbdir/tables.htm#allbeats](https://archive.physionet.org/physiobank/database/html/mitdbdir/tables.htm#allbeats) * MIT-BIH心電資料視覺化網站:[https://www.physionet.org/lightwave/?db=mitdb/1.0.0](https://www.physionet.org/lightwave/?db=mitdb/1.0.0) * 官方網站的視覺化工具讀取展示MIT-BIH資料:[https://archive.physionet.org/cgi-bin/atm/ATM](https://archive.physionet.org/cgi-bin/atm/ATM) > 官方網站提供的視覺化工具中有許多資料庫,請選擇mitdb資料庫。 > > 相比之下更推薦使用倒數第二個網站進行檢視。 ![官方網站請選擇mitdb資料庫](https://raw.githubusercontent.com/lxy764139720/Figurebed/master/img/20200505121720.png) ## 統一術語稱呼 我在閱讀心電相關論文的時候,常常由於不同文章之間對同一事物的稱呼不同而感到困擾。為避免在本文中出現類似情況,現將術語稱呼統一如下。 * 一條心電資料(記錄、訊號):將編號為100,101...的資料稱為一條心電資料(記錄),包含了該編號中的所有導聯資料。由於本文僅使用MLII導聯的資料作為深度學習的訓練資料,因此在本文中也特指一條心電資料中的MLII導聯部分。 * 心拍:如文章(一)中圖片所示,將一個完整的心電波形稱為一個心拍。 * 訊號點(值):連續的心電波形圖其實是由一系列頻率固定的不連續取樣點構成的,將每個取樣點稱為訊號點(值)。 ## 心電資料的讀取 下載資料庫到本地後開啟,你會發現.dat檔案中全部都是亂碼,這是由於MIT-BIH資料庫採用了自定義的format212格式進行編碼。所以在讀取心電資料的時候,我們需要用到Python中的一個工具包:wfdb。 在Pycharm中新建工程,並將下載好的心電資料集按如圖所示的目錄結構進行放置。其中ecg_data為心電資料集的資料夾。 ![Snipaste_2020-05-05_12-31-06](https://raw.githubusercontent.com/lxy764139720/Figurebed/master/img/20200505123336.png) 在該工程配置的Python環境中安裝wfdb包。 ``` shell pip install wfdb ``` 關於wfdb包的詳細使用請參考其官方文件,這裡用程式碼的形式給出一些常用操作。 ``` python # 讀取編號為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)的二維陣列,需要先將其轉換成一維陣列才可以對其進行預處理,關於預處理的這部分內容將在下篇文章中進行