用腦電波控制智慧假肢:如何利用深度學習技術進行EGG資料分類

機器之心發表於2018-06-25

選自TowardsDataScience,作者:Norman Di Palo,機器之心編譯。

腦電圖是一種利用電極記錄大腦活動的非侵入式技術,但大腦活動和腦電圖訊號之間的關係非常複雜,如何「解碼」成為困擾研究者的一大難題。本文作者利用 Kaggle 競賽中的腦電圖資料探索與特定手勢對應的腦電圖模式,並以此設計神經網路。
用腦電波控制智慧假肢:如何利用深度學習技術進行EGG資料分類

神經系統是一個極其複雜的結構。人體內有超過十萬公里的神經與脊髓和大腦相連。這種「網格」傳輸控制每一個運動的電脈衝。每一個指令都從大腦發出,大腦是一個更加神奇的神經元結構,通過電啟用訊號進行通訊。理解和解釋大腦的電模式是神經科學家和神經生物學家的研究熱點之一,但事實證明這是一項極具挑戰性的任務。

記錄大腦活動的一種非侵入式技術是「腦電圖」(EEG),使用固定在患者頭皮上的電極記錄腦電壓波動。通常在頭皮周圍固定大約 30 個電極,記錄腦電波的總體活動。無論如何,大腦活動和 EEG 訊號之間的關係非常複雜,如果不借助具體的實驗測試,我們將很難理解。因此,一個巨大的挑戰是學習如何「解碼」,在某種意義上,這些腦電圖掃描可以允許使用非侵入式腦機介面(BCI)來控制機器假肢和其他裝置。

用腦電波控制智慧假肢:如何利用深度學習技術進行EGG資料分類


利用 EEG 記錄腦電波。CC BY-SA 2.0,來源:commons.wikimedia.org/w/index.php…


作為強資料驅動的學科,最近在相關模式識別任務中取得的「深度學習」新突破為使用「神經網路」分析這些電訊號創造了一種新方法。在這篇文章中,我們首先介紹這一主題:閱讀 Kaggle 競賽(Grasp-and-Lift EEG Detection)提供的 EEG 資料,該競賽旨在檢測哪些 EEG 模式對應特定的手臂和手勢動作,如抓取或提起物體。在以不同的方式預處理資料之後,我們將設計一個神經網路來執行這種分類。此外,我還將展示一些大腦活動的資料視覺化,以便大致瞭解正在使用的資料。這一研究領域的最終目標是開發平價、實用的假肢裝置,通過大腦控制假肢,幫助截肢者恢復輕鬆進行基本活動的能力。類似的技術也可以應用於讀取肌肉電啟用,從而通過分析啟用的肌肉來解碼人試圖執行的運動型別。


資料簡介

如果你擁有 Kaggle 帳戶,那麼你可以在該網址免費下載資料:www.kaggle.com/c/grasp-and…。資料由幾個.csv 檔案組成。這些檔案分別是:

  • EEG 資料,用作模型的輸入,由固定在患者頭皮上的 32 個電極記錄。資料以 500 Hz 的頻率進行記錄。
  • 人體測試者試圖實現的運動的逐幀標籤,一共有 6 個標籤,每幀的標籤是 6 個標籤中的一個。

通過記錄不同人體測試者在執行簡單動作(例如抓取和提升物體)時的腦電圖來收集資料。因此,我們按不同的場景、主題對資料集進行分類。我們將在稍後的準確率預測中看到,腦電波可能非常個性化,因為模型可以非常準確地預測同一個人在沒見過的場景中的意圖,但如果訓練不夠多樣,那麼與新的測試人員進行同樣的訓練會很困難。

因此,目標是建立一個神經網路,該網路將腦電圖資料作為輸入,並輸出測試者試圖實現的 6 個可能動作的概率分佈。由於「no action」不屬於 6 個類別,因此我們可以將其新增為類,或者將所有可能的輸出設定為 0 到 1 之間的值,並使用閾值來確定是否檢測到動作。如果每一個動作都低於閾值,則我們就認為沒有動作。

用腦電波控制智慧假肢:如何利用深度學習技術進行EGG資料分類

電極位置,來源:www.kaggle.com/c/grasp-and…

我製作了這些電極活動的動畫資料視覺化。由於取樣頻率相當高(500 Hz),因此我使用了簡單的 3 步低通濾波器來平滑資料,並使用前 100 幀(約 1/5 秒)建立動畫。

用腦電波控制智慧假肢:如何利用深度學習技術進行EGG資料分類
32 個電極在前 1/5 秒內的啟用狀態

我們還可以將時序資料視覺化為 2D 熱圖,其中縱軸代表時間(從上到下遞增),橫軸表示 32 個電極。

用腦電波控制智慧假肢:如何利用深度學習技術進行EGG資料分類
EGG 時序熱圖(時間從上到下增大)

這也非常有用,因為正如我們將看到的,它允許我們使用「時空卷積」。


資料預處理

為方便學習階段,我們應對原始資料進行預處理。例如,與執行動作的較低變化率相比,非常高的 EEG 取樣頻率會引發許多問題:資料變化非常快,但是動作實際上保持不變,因此波動幾乎可以被認為是噪聲。此外,時序模型接收大量快速變化的資料,而分類輸出從不改變。

第一個可能的步驟是「使用低通濾波器過濾資料」。即使是簡單的執行平均值也能起作用:通過這種方式,我們緩解了資料的高頻變化,同時保留了更有用的低頻結構,因為我們即將分類的動作具有非常低的變化頻率(最多 1Hz)。之後,我們可以對資料進行二次取樣,即每 10100 個資料點只保留一個資料點。從某種意義上說,這也有助於降低時間維度及資料的相關性,從而使資料更加時間稀疏。

也可以採用其他預處理技術,但是為了簡潔起見,我們就此打住,開始設計神經網路。


神經網路設計與實驗

處理時序資料時,我們首先想到的架構之一是「迴圈神經網路」。這些網路具備動態結構,其內部狀態允許它們對時序資料進行編碼,因此這些網路還基於過去的輸入計算輸出。我在 Keras 中設計了一個 LSTM 網路,併為其提供了具備連續時序結構的訓練資料。結果很好,但在這個特定的例子中,我更感興趣的是展示一個通常用於影象的卷積神經網路如何很好地應用到時序資料上。

如前所述,從某種意義上來說,我們實際上是在處理時空資料:以上熱圖的縱軸表示時間演化,而橫軸表示各種電極,結果相近的電極在人類頭皮上的空間位置往往也很接近。這意味著我們可以用卷積提取有用特徵:2D 卷積核將同時在時間和空間上編碼模式。設想一個 3*3 卷積核:它能夠在熱圖中的矩陣上,通過在 3 個不同時間步(3 個核行)以及在 3 個不同的電極(3 個核列)上進行加權求和,來提取特徵。因此,具有許多核的 CNN 可以發現電極的啟用在與想要的動作相關的有限時間週期上的變化特徵」。

我在 Keras 中實現了一個簡單的 CNN,來檢查它在這個資料集上的效能。

import keras
from keras.models import Sequential
from keras.layers import Dense, Dropout
from keras.layers import Embedding
from keras.layers import LSTM, CuDNNLSTM, BatchNormalization, Conv2D, Flatten, MaxPooling2D, Dropout
from keras.optimizers import Adam
model = Sequential()
#model.add(CuDNNLSTM(128, input_shape = (time_steps//subsample, 32)))
model.add(Conv2D(filters = 64, kernel_size = (7,7), padding = "same", activation = "relu", input_shape = (time_steps//subsample, 32, 1)))
model.add(BatchNormalization())
#model.add(MaxPooling2D(pool_size = (3,3)))
model.add(Conv2D(filters = 64, kernel_size = (5,5), padding = "same", activation = "relu", input_shape = (time_steps//subsample, 32, 1)))
model.add(BatchNormalization())
#model.add(MaxPooling2D(pool_size = (3,3)))
model.add(Conv2D(filters = 64, kernel_size = (3,3), padding = "same", activation = "relu", input_shape = (time_steps//subsample, 32, 1)))
model.add(BatchNormalization())
#model.add(MaxPooling2D(pool_size = (3,3)))
model.add(Flatten())
#model.add(Dropout(0.2))
model.add(Dense(32, activation = "relu"))
model.add(BatchNormalization())
# model.add(Dropout(0.2))
model.add(Dense(6, activation = "sigmoid"))
adam = Adam(lr = 0.001)
model.compile(optimizer = adam, loss = "categorical_crossentropy", metrics = ["accuracy"])
model.summary()
複製程式碼

為了檢查模型的效能,如 Kaggle 競賽中所建議的,我們可以檢視 AUC 分數。如果不熟悉 AUC,建議讀一下這個清晰直觀的解釋(datascience.stackexchange.com/questions/8…)。從程式碼所在 notebook 中可以看到,我們可以在快速訓練階段達到約 0.85 的 AUC 分數。


結論

在這篇文章中,我們介紹了腦電訊號與腦電圖,後者是一種利用使用者頭皮上的電極記錄有用訊號的非侵入式且相對簡單的方法。我們看到了一些直觀的資料視覺化,以及如何使用神經網路從這些資料中提取運動意向等特徵。我相信這一領域(機器假肢、腦機介面)將會因為深度學習而得到深入發展。

這些技術的影響將是巨大的。擁有能夠以自然方式控制的低成本假肢可以極大地改善數百萬人的生活。

建議檢視近期啟動的 Symbionic Project 專案,參與專案的天才們嘗試創造一種低成本的智慧手臂假肢,該假肢可以利用肌肉啟用控制,目的是實現這種裝置的平民化。

用腦電波控制智慧假肢:如何利用深度學習技術進行EGG資料分類

原文連結:towardsdatascience.com/from-brain-…


相關文章