Lời mở đầu

EEG classification - sử dụng sóng não EEG để nhận ra và điều hành và kiểm soát giấc ngủ của bé người.

Bạn đang xem: Phát hiện và loại bỏ nhiễu dữ liệu (Data Noise Detection and Removal)

*

Các nội dung sẽ tiến hành đề cập trong bài blog lần này

EEG (Electroencephalography) là gì?1 số lí thuyết cơ bạn dạng về EEGBài toán Sleep-state classification
Các phía tiếp cận và luồng up date cơ bạn dạng khác
Tiền xử lí dữ liệu (Data preprocessing)Trích rút đặc trưng (Feature Extraction)Chọn lọc đặc trưng (Feature Selection)Phân lớp (Classification)Kết quả
Các khó khăn trong quy trình thực hiện
Các hướng cách tân và phát triển với dữ liệu EEGKết luận
Tài liệu tham khảo

EEG (Electroencephalography) là gì?!

EEG - Electroencephalography (Electro + encephalography) hay năng lượng điện não đồ là 1 trong hệ thống có tác dụng ghi lại các xung điện được phát ra từ những neuron thần kinh, chào đón qua vỏ não của nhỏ người. Bộc lộ này là bình luận điện sinh học tập được tiếp nhận ngay tức tự khắc của tế bào não thông qua vỏ não. Là 1 trong những trong những bộ phận phức tạp duy nhất trên khung người người, não tín đồ khi có những tác rượu cồn từ những giác quan liêu như: thị giác, thính giác, xúc giác, .v.v. Sẽ sản sinh ra các tín hiệu năng lượng điện rất bé dại phản hồi lại và được trao đổi thông qua các neuron thần kinh. Việc triển khai đo đạc EEG hay được thực hiện bằng phương pháp gắn nhiều điện cực rải ráp bao bọc đầu, từng điện rất sẽ thu dấn được những xung năng lượng điện tại từng khoanh vùng riêng biệt, mỗi năng lượng điện cực được nhìn nhận như là 1 trong những kênh (channel). Thường có phong cách thiết kế với mũ đội đầu gán điện cực như hình bên dưới:

*

1 số lí thuyết cơ bản

Tín hiệu điện của sóng óc khá bé xíu nên trước khi triển khai lưu trữ thường được qua 1 bộ phận khuếch đại tín hiệu. Về cơ bản, dải tần của sóng não EEG thường nằm trong vòng từ 0.5Hz - 40Hz và được chia nhỏ tuổi thành các loại sóng như sau:

Sóng Delta (Sóng Theta (4-7Hz): cũng chính là sóng với biên độ tương đối thấp, thường được phát hiện tại khi con bạn ngủ.Sóng Alpha (8-15Hz): là nhiều loại sóng thường lộ diện ở bạn trưởng thành, lộ diện nhiều hơn tại vùng sau vỏ não người. Thường lộ diện khi nhỏ người thoải mái và nhắm mắt.Sóng Beta (16-31Hz): mở ra đồng đều cả về độ tuổi và gia tốc tại các vùng vỏ não. Là sóng cùng với biên độ thấp tuy thế tần số khá lớn, thường xuất hiện thêm lúc con bạn đang tập trung quan tâm đến hay băn khoăn lo lắng cao độ.Sóng Gamma (> 32Hz): là sóng cùng với tần số lớn số 1 và biên độ thấp nhất, là một số loại sóng tương quan mật thiết tới những tác vụ cấp cao của con bạn như những công dụng của nhận thức. Sóng Gamma xuất hiện thỉnh thoảng con người chạm mặt stress, stress và hay được tra cứu thấy ở những thiên tài về hội họa, thi ca, .v.v....

Vì các điện rất được đặt rải ráp bao quanh đầu yêu cầu để ráng thể, từng channel đo tại một vùng riêng lẻ sẽ có 1 quy mong đặt thương hiệu riêng. Trong thực tế, số lượng điện cực gán trên vỏ mũ không chũm định, thường thì sẽ là 32 hoặc 64 channel, mỗi phiên bản thiết kế điện cực sẽ có 1 tên riêng biệt quy chuẩn chỉnh và con số channel cũng không giống nhau và được gọi tầm thường là các montage. Ví dụ, cùng với montage Standard 1005:

*

1 số lấy một ví dụ khác:

*

Reference: từng điện cực đo xung điện đều dựa trên sự chênh lệch năng lượng điện thế với cùng một điểm gọi là reference. Việc chọn điểm reference trên đâu bên trên đầu cũng số đông gây tác động tới kết quả thu được của tín hiệu. Vậy nên, để thống tuyệt nhất và tạo thành 1 quy chuẩn chỉnh nhất định, tại các vị trí sau hay được lựa chọn làm reference:2 dái tai (earlobes)2 xương cầm cố (mastoid bonds) - phần xương lồi lên ngay sau tai
Đỉnh đầu (vertex)

*

Epochs: tài liệu EEG được đo đạc và tích lũy trong 1 khoảng tầm thời gian thường xuyên và tốt nhất định, tại từng điểm thời gian sẽ có được tín hiệu năng lượng điện não thu được tại mỗi điện cực. 1 Epoch được quan niệm là biểu lộ thu được trong 1 khoảng thời hạn nhất định. Ví dụ, biểu đạt với sampling rate là 100Hz đo vào 10s thu được 1 epochs cùng với 100 x 10 = 1000 samples.

*

Evoked: đơn giản là trung bình giá trị của khá nhiều epoch trong 1 khoảng thời hạn nhất định ứng với nhiều channels.

*

Đối với những bài toàn EEG classification sẽ có khá nhiều các giải pháp tiếp cận nhằm xử lí bài bác toán. Hoàn toàn có thể xử lí bằng việc xây dựng các feature dạng time-domain, dạng frequency-domain hoặc cả 2 như time-frequency-domain, thậm chí còn dùng cả mạng CNN (với tài liệu là ma trận thu được khi đổi khác tín hiệu EEG), ..v.v. Các công đoạn chính bao gồm:

EDA & Data Preprocessing: điều tra dữ liệu, visualize cùng tiền xử lí dữ liệu (lọc giới hạn miền tần số, sút thiểu nhiễu, giảm thiểu những tín hiệu phía bên ngoài hay remove artifact như nhịp đập của tim, chớp mắt, ...)Feature Extraction: dữ liệu thuở đầu gọi là raw data, sau khoản thời gian được tiền up load cần tiến hành 1 số các làm việc để rất có thể trích rút các feature núm thể, trường đoản cú đó quy mô sau này sẽ dựa vào đó để "học" từ bỏ dữ liệu. Có rất nhiều các phương pháp về feature extraction với tài liệu EEG dành riêng và tài liệu về bộc lộ (signal) nói chung. 1 số từ khóa mình đã đề cập dưới như: time-domain, frequency-domain, time-frequency-domain, DFT với FFT (Fast Fourier Transform), Wavelet Transform, .v.v.Feature Selection: tương quan đến việc tinh lọc và sút thiểu con số feature, một số ít khái niệm đã đề cập như: PCA, ICA, ..Classification: mô hình phân các loại dựa trên những feature đã trích rút được mặt trên, bất kì mô hình classification nào chúng ta có thể thử với áp dụng: SVM, Tree-based model, CNN, ...

Bài toán Sleep-state classification

Dữ liệu sleep-state tất cả 5 class: W, N1, N2, N3 với REM, được phát âm như sau:

W (Stage Wake): tâm trạng con bạn tỉnh táo.N1 (Stage 1): giai đoạn bước đầu của giấc mộng hay ngủ nông, là quy trình chuyển tiếp giữa thức và ngủ, dễ dàng bị ngăn cách và cực nhọc nhận biết.N2 (Stage 2): tiến trình con người bắt đầu chìm vào tinh thần ngủ sâu, sóng não nhanh dần đều, sức nóng độ khung người giảm, nhịp tim chậm rì rì lại, thừa nhận thức của con fan với môi trường phía bên ngoài gần như ko còn.N3 (Stage 3): quá trình ngủ sâu, con fan ít bao gồm phản ứng với tiếng ồn ào và vận động bên ngoài. Nếu bị đánh thức đột ngột thì hoàn toàn có thể sẽ mất vài phút để "định thần" lại
*
REM (Rapid Eye Movement): vào kì này sẽ bước đầu trong thời hạn rất ngắn, cũng chính là lúc là niềm mơ ước xuất hiện. Là quy trình tiến độ mà mắt sẽ hoạt động nhanh cùng liên tục, cơ bắp cơ liệt; nhịp tim, hơi thở, sức nóng độ khung người không kiểm soát. Đôi khi, cũng xuất hiện thêm hiện tượng "bóng đè" khi một người đột nhiên thức giấc ở tinh thần REM.

Reference: https://www.facebook.com/notes/tempur-việt-nam/dream-cuture-blog1-cấu-trúc-giấc-ngủ-của-con-người/1795160670771669/

Dữ liệu ban sơ gọi là raw data và cần được thực hiện tiền xử lí trước lúc đưa vào model. Hiện nay tại, đối với data sleep state này chỉ gồm duy duy nhất 1 channel nên không cần phải tiền up load quá nhiều, 1 số ít bước cơ bạn dạng như: bandpass filter, scaling, ... Để thấy rõ sự công dụng của preprocess data, mình sẽ tiến hành training mã sản phẩm 2 lần, 1 cùng với raw data với 1 với preprocessed data.

X = np.zeros((0, 3000, 1))y = <>for fn in total_fs: samples = np.load(fn) X_data = samples<"x"> X = np.concatenate((X, X_data), axis=0) y.extend(samples<"y">)y = np.array(y)# X.shape = (42308, 3000, 1)# y.shape = (42308, )Thực hiện phân tách train, test, val:X_train, X_test, y_train, y_test = train_test_split( X, y, test_size=0.2, random_state=42)X_train, X_val, y_train, y_val = train_test_split( X_train, y_train, test_size=0.2, random_state=42)# X_train.shape, X_test.shape, X_val.shape# ((27076, 3000, 1), (8462, 3000, 1), (6770, 3000, 1))Thực hiện tại tiền xử lí dữ liệu, filter signal theo bandpass filter (lọc theo cận trên + cận dưới)from scipy.signal import butter, lfilterdef butter_bandpass(lowcut, highpass, fs, order=4): nyq = 0.5 * fs # low = lowcut / nyq high = highpass / nyq b, a = butter(order, high, btype="highpass") return b, a def butter_bandpass_filter(data, highpass, fs, order=4): b, a = butter_bandpass(0, highpass, fs, order=order) y = lfilter(b, a, data) return y pp_X_train = np.array()pp_X_val = np.array()pp_X_test = np.array()

*

Model

def model_baseline_2017(n_classes=5, use_sub_layer=False, summary=True): # two conv-nets in parallel for feature learning, # one with fine resolution another with coarse resolution # network to learn fine features input
Layer = Input(shape=(3000, 1), name="in
Layer") conv
Fine = Conv1D(filters=64, kernel_size=int(Fs/2), strides=int(Fs/16), padding="same", activation="relu", name="f
Conv1")(input
Layer) conv
Fine = Max
Pool1D(pool_size=8, strides=8, name="f
Max
P1")(conv
Fine) conv
Fine = Dropout(rate=0.5, name="f
Drop1")(conv
Fine) conv
Fine = Conv1D(filters=128, kernel_size=8, padding="same", activation="relu", name="f
Conv2")(conv
Fine) conv
Fine = Conv1D(filters=128, kernel_size=8, padding="same", activation="relu", name="f
Conv3")(conv
Fine) conv
Fine = Conv1D(filters=128, kernel_size=8, padding="same", activation="relu", name="f
Conv4")(conv
Fine) conv
Fine = Max
Pool1D(pool_size=4, strides=4, name="f
Max
P2")(conv
Fine) fine
Shape = conv
Fine.get_shape() conv
Fine = Flatten(name="f
Flat1")(conv
Fine) # network to lớn learn coarse features conv
Coarse = Conv1D(filters=32, kernel_size=Fs*4, strides=int(Fs/2), padding="same", activation="relu", name="c
Conv1")(input
Layer) conv
Coarse = Max
Pool1D(pool_size=4, strides=4, name="c
Max
P1")(conv
Coarse) conv
Coarse = Dropout(rate=0.5, name="c
Drop1")(conv
Coarse) conv
Coarse = Conv1D(filters=128, kernel_size=6, padding="same", activation="relu", name="c
Conv2")(conv
Coarse) conv
Coarse = Conv1D(filters=128, kernel_size=6, padding="same", activation="relu", name="c
Conv3")(conv
Coarse) conv
Coarse = Conv1D(filters=128, kernel_size=6, padding="same", activation="relu", name="c
Conv4")(conv
Coarse) conv
Coarse = Max
Pool1D(pool_size=2, strides=2, name="c
Max
P2")(conv
Coarse) coarse
Shape = conv
Coarse.get_shape() conv
Coarse = Flatten(name="c
Flat1")(conv
Coarse) # concatenate coarse and fine cnns merge
Layer = concatenate(Fine, conv
Coarse>, name="merge_1") out
Layer = Dropout(rate=0.5, name="m
Drop1")(merge
Layer) if use_sub_layer: sub_layer = Dense(1024, activation="relu", name="sub_layer")(out
Layer) # model = Model(input
Layer, merge
Layer) # LSTM out
Layer = Reshape((1, int(fine
Shape<1>*fine
Shape<2> + coarse
Shape<1>*coarse
Shape<2>)), name="reshape1")(out
Layer) out
Layer = Bidirectional(LSTM(128, activation="relu", dropout=0.5, name="b
Lstm1"))(out
Layer) out
Layer = Reshape((1, int(out
Layer.get_shape()<1>)))(out
Layer) out
Layer = Bidirectional(LSTM(128, activation="relu", dropout=0.5, name="b
Lstm2"))(out
Layer) # merge out_layer & sub_layer if use_sub_layer: out
Layer = concatenate(Layer, sub_layer>, name="merge_2") out
Layer = Dropout(rate=0.5, name="m
Drop2")(out
Layer) out
Layer = Dense(256, activation="relu", name="sub_layer_2")(out
Layer) out
Layer = Dropout(rate=0.5, name="merge_out_sub")(out
Layer) # Classify out
Layer = Dense(n_classes, activation="softmax", name="out
Layer")(out
Layer) model = Model(input
Layer, out
Layer) optimizer = keras.optimizers.Adam(lr=1e-4) model.compile(optimizer=optimizer, loss="categorical_crossentropy", metrics=<"acc">) if summary: model.summary() return modelmodel_2017 = model_baseline_2017(use_sub_layer=False, summary=True)Reference: deepsleepnet & deepsleepnet-paper

Calbacks:

checkpoint = Model
Checkpoint("model_cps", monitor="val_loss", verbose=1, save_best_only=True, mode="max")early = Early
Stopping(monitor="val_loss", mode="max", patience=20, verbose=1)redonplat = Reduce
LROn

*

Vì số lượng samples thân từng class không cân đối nên quanh đó accuracy, ta sử dụng thêm những metric khác như: presicion, recall với f1-score để reviews mô hình. Kết quả thu được với raw data:

*

*

Training mã sản phẩm với dữ liệu đã được preprocess:
*

Có thể thấy là val_loss cùng val_acc của mô hình đã được nâng cấp đáng nói so với mặt trên

Kết trái thu được cùng với preprocessed data:

*

*

Save model

model_2017.save_weights("model_2017.h5")model_json = model_2017.to_json()with open("eeg_model_2017_config.json", "w") as f: f.write(model_json)

Kết quả

Dựa vào tâm lý ngủ, ta có thể có các biện pháp ảnh hưởng từ bên ngoài để góp con người ngủ ngon hơn và bớt căng thẳng, lo lắng.

Về vấn đề sleep-state classification, có một điểm chú ý là dữ liệu giữa từng class thường không mọi nhau (khá mất cân nặng bằng) cho nên việc sử dụng accuracy không mạng lại nhiều ý nghĩa; ở kề bên đó, ta sử dụng thêm các metric thông dụng không giống như: presicion, recall, f1-score, roc-auc.

Bên trên bản thân chỉ triển khai chia train/test/val dữ liệu, hiệu quả đạt được cũng khá tốt. Các bạn có thể áp dụng thêm cross validation nhằm mô hình có chức năng tổng quát lác hóa bên trên dữ liệu giỏi hơn (generalization). Kết quả so với một số model hiện tại như:

Có thể thấy rằng, qua 2 lần training, precision / recall / f1-score của class N1 hơi thấp so với những class khác. Điều này cũng được đề cập cho trong 2 paper bên trên, các chúng ta cũng có thể tìm đọc thêm. Gồm thể nâng cấp mô hình bằng cách kết phù hợp thêm các các phương thức feature extraction khác nhưng mình sẽ đề cập ngay bên dưới đây, bao gồm: preprocessing data, feature extraction, feature selection.

Các hướng tiếp cận không giống của bài bác toán

1. Data Preprocessing
Vì dữ liệu mình sử dụng trong bài blog lần này chỉ bao gồm 1channel duy nhất nên ít bị tác động bởi các điều khiếu nại ngoại cảnh hơn. Ngoài bài toán xử lí filter như:low-pass filter (thấp hơn vậy thì lấy)high-pass filter (cao hơn nữa thì lấy)band-pass fiter (lấy trong khúc )north-filter (bỏ đi các sample ở 1 miền tần số xác minh f)

thì còn một số các cách thức xử lí khác như: remove noise, remove actifact. 1 vài phương pháp có thể kể đến như:

ICA (Independent Component Analysis)

SSP (Signal Subspace Projectors)

Wavelet Denoising

Hình hình ảnh 1 channel sau khi được xử lí vứt bỏ artifact:

HRFigure/figure/bpexaa6db8f18" alt="*">