ECG+ML/DL --QRS心拍定位-解決識別對象問題

目錄
1 輸入–心拍
2. QRS波檢測
3. 心拍截取–¥¥¥¥

1.確定解決識別對象–心拍

我們在上一階段知道了數據是長什麼樣子的,但是我們可以利用這個數據來做什麼? 心電圖的知識錯綜複雜,如何使用機器學習去解決這些問題,關鍵是哪些問題在目前來看是可解的。
即最簡單的問題,輸入是什麼?
大多數研究的輸入都是基於心拍來進行的, 心拍是ECG的基本單位,一個心拍包括p 波,QRS段,T波的完整的信號段。
在上一講我們提到有48個樣本,每個樣本有連續30分鐘心電雙導聯記錄。這裏的48個樣本即是48個患者,且每個患者在30分鐘的記錄裏面有不同的標記,還不是固定的。
如果是用一個患者去輸入,其對應的輸出是混亂的。即1對多 —(不過這個是個好方向)
同時數據量也會偏少。但是以心拍來計算的話,一個心拍的持續時間差不多是1.5個大格子,即1.50.2=0.3s ,一個30分鐘,6000,600048=30萬左右樣本心拍。

(問題,這裏每個心拍標籤有些都不同,最終醫生是如何下結論的呢??投票原則?)

總之記住,我們在這裏直接處理的是心拍,而非一整條記錄。

那麼問題來了我們讀到Matlab中的ECG數據都是以記錄形式存在的,包含了形態各異,數量不等的心拍,例如下圖給出了100,114,119信號的一部分,我們怎麼樣才能定位提取這些心拍呢?如何將每個心拍都提取出來呢?

在這裏插入圖片描述

標題2.心拍定位

心拍中有用的有p波,QRS波,T波,這裏我們以QRS波爲例子進行試驗。

QRS檢測是處理ECG信號的基礎,不管最後實現什麼樣的功能,QRS波的檢測都是前提。所以準確的檢測QRS波是特徵提取的前提。
1)爲什麼是QRS波?
直觀來看,各類型心拍的各波段中,QRS波往往是最大、最明顯的、最尖銳的,本身就利於檢測;而在數學上,稱爲QRS波的“奇異性”,表現爲斜率的突變,存在不可導的點,即波峯(或波谷)點。利用該性質可配合多種處理手法,如差分法,小波變換法等等進行有效檢測。
2)基本步驟
預處理+自適應閾值。預處理的目的在於兩點:
(1) 消除噪聲和其他的雜波(P波,T波)等。
(2) 同時使波形模式變得更爲單一,QRS波的變化更爲突出。
預處理完成後,配合自適應閾值完成QRS波的定位。自適應的意思是能夠適應不同類型的記錄。自適應機制越好的算法,能夠在各種類型的記錄下良好地區分目標與非目標,從而達到很高的準確率和可用度。自適應閾值的設計原則,個人總結如下:
(1) 自適應閾值變換機制中的經驗參數需固定。在自適應閾值的變化機制中,有些參數可能需要我們根據經驗提前設定好。這沒有問題。但是一旦確定好之後檢測性能時,對於不同的記錄,這些經驗參數不可以再重新設定。
(2) 自適應閾值要跟隨波形實時地,穩健地變化。自適應閾值,並不是至給一整條記錄計算好一個閾值後就一成不變了,而是要跟隨波形實時地變化,例如當檢測到的QRS波振幅呈總體上升態勢時,自適應閾值也要相應地提高,反之則要相應降低;自適應閾值的變化往往不可過於劇烈,可通過設定上下限的方式使其變化更加穩健。
(3) 自適應閾值要有針對性地防錯檢、漏檢的機制。例如可以回溯之前的波形,再次進行檢測防止漏檢;利用“不應期”(當一個QRS波出現後,短時間(~0.24s)內不會再出現第二個)的含義,在檢測到一個QRS波後短時間內不再檢出QRS波,防止錯檢。當然並不是說有了這些機制就完全可以避免錯檢漏檢,而是有效地減少。
以上幾條關鍵點是本人自己總結的,可能有所疏漏,僅供參考。另外這些所謂目的和原則對於初學者來說都過於抽象,而且往往在閾值的設計中交織在一起。下面一部分我們將結合具體算法來進行講解。

下面是以一個簡單的QRS波定位算法進行分析。
在這裏插入圖片描述
(1)我們對心電信號進行40階FIR帶通濾波,通帶爲15~25Hz,大致爲QRS波所在頻段。關於濾波器的設計可以使用Matlab的Fdatool工具,得到相應的濾波器係數,然後套用filter內建函數完成濾波。以數據庫的103號信號爲例,濾波前後的波形示意如下:
![在這裏插入圖片描述](https://i在這裏插入圖片描述
通過對比可以看到,濾波後P波,T波被明顯削弱,體現了上一部分中預處理目的的第(1)點。
對濾波後的波形進行雙斜率處理,所謂雙斜率基本思想是分別在一個點的左右兩側的某個區間內尋找最大平均斜率與最小平均斜率,然後分別用左側最大斜率減去右側最小斜率,用右側最大斜率減去左側最小斜率,再求取兩者中的最大者。過程有些複雜,但其實其基本動機就是利用QRS波兩側較陡的性質,只有QRS波這樣的尖峯在經過上述處理時纔會有很大的響應。在這裏,我們設定這個尋找斜率的區間是左右兩側0.015s~0.060s處,此爲經驗參數。經過處理,可對比前後波形:
在這裏插入圖片描述
可以看到,雙斜率處理後,波形模式更爲單一,體現了預處理目的的第(2)點。但是,波形出現了雙峯現象,一定程度上不利於精準檢測。因此,在雙斜率處理後繼續低通濾波(截止頻率5Hz,經驗參數),使得波形更光滑:
在這裏插入圖片描述
可以看到,低通濾波後的波形變得非常光滑,雜波基本消失,模式也非常單一,基本上已經達到了進一步閾值處理的要求。
(3)滑動窗口積分。仔細觀察前幾步,每一步得到的波形由於濾波或是求斜率的因素,其幅度值越來越小,而過小的幅值其實不利於檢測。這裏我們利用滑動窗口積分,使得絕對振幅增大,並使波形進一步光滑,滑動窗口寬度設爲17個採樣點,爲經驗參數:
在這裏插入圖片描述

積分後,波形幅值明顯增大(注意縱座標),體現了預處理目的的第(2)點。至此,預處理階段完成,經過處理後,原始的心電信號變成了一個個模式單一的波峯組成的信號,每個波峯對應一個QRS波。相比原信號,預處理後的信號更易定位檢測,可以說達到了預處理的目的。

2)自適應閾值設計
與上述所說的自適應閾值設計原則相契合,這個算法的思路是:
(1)自適應閾值要跟隨信號實時變化。問題是如何決策此時閾值的變化。這裏我採用了一種常用的策略:雙閾值。一高一低,當某個波峯超過低閾值時,我們認爲檢測到了一個QRS波,然後通過比較波峯振幅與高低閾值的關係,調整閾值。
(2)爲了保證變化的穩健,閾值需要根據前面已經檢測到的正確波峯振幅變化,另外設定下限,以確保不會過高或過低。
通過以上兩點,我設計自適應機制如下(THR1爲高閾值,THR2爲低閾值):
在這裏插入圖片描述
其中,peak指檢測到的峯值,peak_buffer指存儲了當前峯值之前8個峯值,mean(.)則是求均值。THR1_lim與THR2_lim爲兩個經驗常數,代表兩個閾值變化的下限,在這裏分別取值爲0.3和0.23。
具體來說,噹噹前波峯高於高閾值時,我們傾向於認爲此時閾值偏低,閾值變化爲之前檢測到的8個波峯平均值的0.7倍,0.25倍(均爲經驗係數),如果相比最近的8個峯值,閾值確實偏低程度很大,則就算乘上了一個小於1的係數(例如0.7,0.25),自適應閾值還是會增大,如果偏低程度不大,則不一定增大。之所以乘上係數還是因爲要保持變化的穩健,保證只有閾值明顯偏低時纔會明顯增大;噹噹前波峯在高低閾值之間,我們傾向於調低高閾值,而低閾值要與高閾值保持距離,因此也傾向於調低一些,不過我們傾向於認爲此時的波形較爲異常(因爲較小,在兩閾值之間),不宜根據前面的平均峯值變化,因此此時閾值變化與當前波峯的值相關。具體變化機制可以參考上面的公式,體現實時變化原則。另外重複一下,當波峯低於低閾值時,認爲是噪聲。

(3)防漏檢與錯檢。其實本身雙閾值的設計一定程度上就可以防漏檢。因爲一高一低的閾值,相比只有一個閾值,可以捕捉到更多層次的波峯。另外在防錯檢方面,我採用了“不應期”的方式,當兩個波峯過於靠近時,只取較大的波峯。這個“過近”指的是距離低於0.24s,即不應期的長度;雙閾值的變化存在下限,也防止了一些噪聲被錯檢爲QRS波。
另外,雙閾值的初始值是被提前設定好的經驗係數,與其他經驗係數一樣,一旦確定就不會因記錄的不同而變化。體現了上述自適應閾值設計的第(1)原則。

原文:https://blog.csdn.net/qq_15746879/article/details/80340671

以上閾值的操作,均在原信號預處理後的特徵信號上進行,檢測到的波峯都認爲對應於原信號中的一個QRS波。另外預處理中的兩次濾波都造成了信號的延遲,我們檢測到特徵信號的波峯後,可減去延遲,即可得到原信號中的QRS波的位置。
在這裏插入圖片描述
上圖這是以100號信號爲例。由於本身信號比較穩定,因此閾值的變化主要在信號開始。可以看到初始時閾值明顯偏低,自適應閾值很快向上變化找到了合適的值。下面再看一條變化比較大的信號119:

在這裏插入圖片描述
可以看出雙閾值可以很好地跟隨信號變化,從而正確檢出QRS波的位置。注意,這裏檢測的"正確"並非是指精準地落在QRS波的波峯或波谷中,儘管精確的人工標註往往就是在波峯或波谷上.美國EC38標準提供了一個評判標準:與人工標準差距在150ms內,即可認爲定位成功.事實上,這個標準相當寬鬆,以至於現在的QRS波定位算法的準確率普遍在99%以上(以MIT-BIH數據庫爲測試數據), 而一些出色的算法甚至達到了99.9%以上.
以上原創算法已開源,放在本人的github上: DS_detect.m, 已封裝爲函數。以上的算法可能理解起來相當抽象,建議結合代碼(有註釋)體會。

上一部分中曾說過,目前QRS波定位檢測算法的“準確率”已經普遍在99%以上。但這麼說其實不準確,因爲衡量QRS波檢測算法的指標並非我們印象中的準確率,而是有兩個常用指標:敏感度(SE)和正預測率(P+),定義如下:
在這裏插入圖片描述

其中TP代表檢測正確的心拍個數,FN代表漏檢的心拍個數,FP代表錯檢的心拍個數。我們嘗試對整個MIT-BIH數據庫跑一遍,統計算法的性能參數。這一部分不是算法的核心,所以在這裏不再講具體的實現步驟,不過已經開源了測試代碼:DS_test.m,爲Matlab腳本文件。在運行之前注意數據庫路徑的設置。注意在代碼的第164行,調用了上面的算法DS_detect。
DS_test程序完成後,在工作空間中可以找到名爲INFO的變量,雙擊打開:
在這裏插入圖片描述
從左到右,第一列:記錄編號,第二列:人工標記心拍數,第三列:算法正確檢出心拍數,第四列:算法錯檢心拍數,第五列:算法漏檢心拍數,第六列:Se,第七列:P+。看最後一行:
可以看出算法共錯檢648個心拍,漏檢380個心拍,總體Se達到了99.65%,P+達到了99.41%,彙總如下:
在這裏插入圖片描述
在我的筆記本電腦上,該算法處理一條30min,採樣率360Hz的記錄需要14s左右。各項指標雖達不到頂尖,但也不算差,算是有一定的可用度了。接下來,我們將使用該算法將我們需要的心拍截取出來。

3.心拍截取

在上面我們可以檢測到心拍,很難100%將人工標註過的所有心拍定位準確,必然有錯檢和漏檢。這就導致我們無法100%利用好人工標記的心拍。這裏我們採用一個折衷的手段:忽略漏檢的心拍,而錯檢和正確檢出的心拍都截取出來。由於QRS定位算法的、性能已經夠好了,所以截取出來的心拍絕大多數是正確檢出的心拍,只有少部分爲錯檢心拍。而我們接下來所要使用的機器/深度學習算法都具有一定的魯棒性,較少的錯檢心拍數不會對結果產生太大影響。至於心拍的類型(標籤),我們以距離該心拍最近的人工標記的類型爲準。

粗魯截取—另外,我們截取心拍其實不是精確截取,即從P波起點到T波終點,而是採取一種較爲粗略的手段:以QRS波的位置爲基準,分別向前向後包括若干點,然後將這一段數據點截取出來作爲心拍。
如下圖所示爲什麼不精確截取呢?是因爲檢測P波和T波及其起始點或終點非常困難,目前也沒有一個性能足夠好的算法滿足應用需求。所以,大部分文獻採用的是這種粗略截取的方法,只不過前後包括的點數有區別:
在這裏插入圖片描述
這裏我們向左包含100個點,向右包含150個點,即截取的每個心拍長度爲250個點(約0.7s)這一部分的實現代碼也已開源:SegBeat.m 爲腳本文件。同樣,數據庫路徑,代碼文件存放位置要正確。該代碼與DS_test.m有類似之處,也調用了DS_detect算法進行QRS檢測(第164行,同樣也可以置換爲其他QRS波定位算法)。

運行完成後(時間可能會比較長),在工作空間可以找到4個變量,Nb,Lb,Rb,Vb,爲我們接下來的目標類型心拍數據集合,分別爲“正常(N)”,“左束支阻滯(LBBB)”,“右束支阻滯(RBBB)”,“室性早搏(PVC)”,示例如下(可能橫座標表示有些不準確,請忽略):

在這裏插入圖片描述
這裏是否可以換成圖像截取的方式。但是如何打標籤呢???

實際上,同一類型的心拍間變化非常大,並非只是示例的四個心拍那麼簡單,這也就是我們爲什麼後面要使用高大上的機器/深度學習算法來分辨。我們以.mat的形式將這四個變量保存(N_dat.mat,L_dat.mat,R_dat.mat,V_dat.mat),它們各自包含了一種類型的心拍,是我們接下來使用機器/深度學習算法要進行分類識別的目標。至此,我們所需要的識別對象已經成功準備好了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章