×

癫痫发作预测可穿戴设备的深度学习

消耗积分:0 | 格式:zip | 大小:0.43 MB | 2022-12-12

李静

分享资料个

描述

介绍

大约 1% 的人对他们的下一次癫痫发作感到焦虑。抗惊厥药物对至少 20% 的患者没有帮助,而且大剂量服用还会带来副作用。这种恐惧妨碍了执行日常任务,例如驾驶汽车或游泳。存在可以检测癫痫发作的设备,但我们的目标是构建一种可穿戴 EEG 设备,可以预测癫痫发作即将发生,以便护理人员和/或用户可以暂停他们正在做的事情并采取适当的预防措施.

五年前,一场Kaggle 竞赛提出了开发机器学习算法以帮助预测癫痫发作事件的挑战。向参赛者提供了 106 GB 的训练数据 in.mat 文件。每个训练样本代表 10 分钟的原始颅内脑电图读数。对于 5 只狗,数据包括以 400 Hz 采样的 16 个通道读数。对于 2 名人类患者,在 24 个通道上以 5000 Hz 的频率对数据进行采样。

这是从一个频道采样的一小段:

 
poYBAGOSwoOAZQ5cAAA_avDwfj8082.png
而是看频率
 

医学研究支持 4 个不同阶段的概念,对应于:癫痫发作事件之间、之前、期间和之后。出于此预测任务的目的,主要挑战是开发二元分类器来区分所谓的发作间期(事件之间)和发作前(事件之前)状态。

大多数参赛者根据 FFT 或通道之间的时间相关性设计经过实验室测试的功能,同时考虑到类似同期比赛的结果

不受嵌入式硬件计算可行性的现实限制的约束,获胜模型涉及使用各种机器学习算法训练的复杂集成。比赛于 2014 年结束,比 Tensorflow 等框架可用于深度学习实验早了将近一年。

自比赛以来,将卷积神经网络 (CNN) 应用于频谱图一直是语音和信号处理任务的一种流行方法。这借鉴了计算机视觉的成功经验,通过重新定义问题来识别信号时频表示中称为共振峰的视觉特征。

除了通过傅里叶变换实现正则化的好处之外,FFT 算法速度非常快,可以在资源有限的硬件上执行。

CNN 也变得越来越小,因此我们将这两种强大的算法结合起来,在嵌入式硬件上实时运行推理,通过识别发作前状态来预测癫痫发作。

训练我们的神经网络

我们从一些简化的假设开始。

由于资源限制,我们不想将 10 分钟的 16/24 通道 EEG 记录读入内存。相反,我们会将样本分成 200 个 3 秒的片段。隐含地,我们假设每个人都同样很好地代表了我们希望在区分该片段是否先于癫痫发作事件时学习的签名。

此外,我们假设每个通道都独立代表这些签名。这允许我们以忽略通道之间的协方差为代价来扩展数据集。首先,我们尝试在标准 FFT 下可视化频谱图:

 
pYYBAGOSwouAYucEAADZuNE96jk932.png
看起来像噪音
 

通过试验不同的参数选择和 FFT 变体,我们选择了短时傅里叶变换 ( STFT )。

为了避免重新计算这些变换,我们将图像输出到文件。这是在对频率表示中的表面视觉可辨模式应用附加转换和归一化之后的示例。我们将图像大小调整为 128x128 以加载更多图像并更快地训练。

 
pYYBAGOSwo-AKkjpAAASGLQ8M3o810.png
 
 

要了解有关我们数据处理的更多信息,请参阅我们的博客文章。

为了快速探索 CNN 将带来一些有用的东西这一想法,我们使用非常简单的神经网络架构和Keras顺序 API 设置了一个基线。我们的 vanilla CNN 包括 5x5 卷积过滤器,然后是一个 3x3 卷积层,然后通过具有 ReLU 激活的完全连接层进行展平和漏斗,以及用于额外正则化的 dropout。

def build_network():
   model = Sequential()
   model.add(Conv2D(32, (5, 5), input_shape=(128, 128, 1)))
   model.add(Activation('relu'))
   model.add(MaxPooling2D(pool_size=(2, 2), strides=(2, 2)))
   model.add(Conv2D(32, (3, 3)))
   model.add(Activation('relu'))
   model.add(MaxPooling2D(pool_size=(2, 2), strides=(2, 2)))
   model.add(Conv2D(32, (3, 3)))
   model.add(Activation('relu'))
   model.add(MaxPooling2D(pool_size=(2, 2), strides=(2, 2)))
   model.add(Flatten())
   model.add(Dense(2048))
   model.add(Activation('relu'))
   model.add(Dropout(.5))
   model.add(Dense(512))
   model.add(Activation('relu'))
   model.add(Dropout(.5))
   model.add(Dense(256))
   model.add(Activation('relu'))
   model.add(Dropout(.5))
   model.add(Dense(1))
   model.add(Activation('sigmoid'))
   adam = Adam(lr=0.0001, beta_1=0.9, beta_2=0.999, epsilon=1e-8)
   model.compile(optimizer=adam, loss='binary_crossentropy', metrics=['accuracy'])
   return model

由于极端的类别不平衡,我们对发作前的例子进行了上采样。

调用fit 方法,我们在使用几千个样本的训练输出中看到了学习的迹象。为了扩大训练规模,我们切换到fit_generator方法来迭代我们收集的近 1000 万张图像。

我们发现我们的模型是欠拟合的,正如训练和验证性能相似的损失平稳所证明的那样:

Epoch 4/100
128/128 [==============================] - 525s 4s/step - loss: 0.6798 - acc: 0.5515 - val_loss: 0.6768 - val_acc: 0.5682
Epoch 5/100
128/128 [==============================] - 509s 4s/step - loss: 0.6769 - acc: 0.5668 - val_loss: 0.6775 - val_acc: 0.5579
Epoch 6/100
128/128 [==============================] - 532s 4s/step - loss: 0.6761 - acc: 0.5624 - val_loss: 0.6732 - val_acc: 0.5728
Epoch 7/100
128/128 [==============================] - 504s 4s/step - loss: 0.6748 - acc: 0.5714 - val_loss: 0.6706 - val_acc: 0.5803
Epoch 8/100
128/128 [==============================] - 505s 4s/step - loss: 0.6737 - acc: 0.5686 - val_loss: 0.6696 - val_acc: 0.5791
Epoch 9/100
128/128 [==============================] - 504s 4s/step - loss: 0.6733 - acc: 0.5665 - val_loss: 0.6685 - val_acc: 0.5808
Epoch 10/100
128/128 [==============================] - 504s 4s/step - loss: 0.6674 - acc: 0.5834 - val_loss: 0.6670 - val_acc: 0.5852
Epoch 11/100
128/128 [==============================] - 504s 4s/step - loss: 0.6676 - acc: 0.5782 - val_loss: 0.6669 - val_acc: 0.5863
Epoch 12/100
128/128 [==============================] - 503s 4s/step - loss: 0.6667 - acc: 0.5803 - val_loss: 0.6655 - val_acc: 0.5884
....
Epoch 99/100
128/128 [==============================] - 502s 4s/step - loss: 0.6242 - acc: 0.6316 - val_loss: 0.6317 - val_acc:
0.6271
Epoch 100/100
128/128 [==============================] - 521s 4s/step - loss: 0.6253 - acc: 0.6318 - val_loss: 0.6266 - val_acc:
0.6321

尽管如此,我们可以开始围绕我们的简化假设确定一些细节,并探索更复杂的模型。

接下来,我们尝试通过使用TF-Slim在 ImageNet 上预训练的 inception_v3 架构训练模型来进行迁移学习

inception_v3 架构比我们上面的简单架构具有更高的学习数据模式的能力。通过微调,许多图像特征将适合我们的任务,即使图像集非常不同。

经过一段时间的训练后,我们的模型在近 100 万张频谱图图像的平衡子集上达到了72% 的验证准确率。一旦我们在 pi 上快速运行,我们坚信会投入时间和精力在更多数据上训练和评估这样的模型。

此外,我们可能会尝试无监督预训练,因为一半可用的 Kaggle 数据由测试样本组成。

更新:使用更新的 api、不同的模型架构和略有不同的预处理,我们在这个jupyter notebook中达到了更高的验证准确性。

黑客脑电图设备

我们尝试了 Muse 耳机,因为Adafruit 教程将其描述为直接破解。不幸的是,制造商无法继续支持这一点,并且引用的似乎已失效。

我们还找到了更实惠的Force Trainer 但是,固件会执行 FFT 并返回功率谱中不同波段内的值。相反,我们需要原始 EEG 信号,就像我们用来开发机器学习模型进行分析的那样。

最后,我们选择了NeuroSky MindWave Mobile设备。价格介于上述两个选项之间,同时支持收集原始 EEG 信号,该产品看起来很有前途。我们使用这个repo从耳机中读取原始 EEG 值。

import bluetooth
from mindwavemobile.MindwaveDataPoints import RawDataPoint
from mindwavemobile.MindwaveDataPointReader import MindwaveDataPointReader
import textwrap
if __name__ == '__main__':
    mindwaveDataPointReader = MindwaveDataPointReader()
    mindwaveDataPointReader.start()
    try:
        if (mindwaveDataPointReader.isConnected()):
        while True:
            dataPoint = mindwaveDataPointReader.readNextDataPoint()
            if (dataPoint.__class__ is RawDataPoint):  #Only want the raw vals
                 print(dataPoint)  #printing as a test
        else:
            print((textwrap.dedent("""\
            Exiting because the program could not connect
            to the Mindwave Mobile device.""").replace("\n", " ")))
    except KeyboardInterrupt:
        sys.exit()

这款耳机将通过蓝牙将数据传输到我们的树莓派。然后 pi 将像我们的训练样本一样格式化数据并对其进行推理以预测癫痫发作。

运行推理

在渲染图像之前,我们在设备上应用我们的信号处理管道。

最后,如果检测到与即将发生的癫痫发作事件相对应的特征,我们会对频谱图进行推理,以向用户发出警报(通过我们原型中的压电蜂鸣器)。

为了减少误报,我们需要开发一个后处理工作流程,这样用户就不会被模型错误弄得筋疲力尽。一个简单的想法是仅在某个时间窗口内的阳性计数超过凭经验确定的阈值后才发出警报。

 
pYYBAGOSwp-ANPUPAATXfgr4c3k551.jpg
第一个原型
 

使用设备,我们可以执行数据收集,这将有助于改进我们的模型。为了进一步降低成本,可以考虑构建一个 EEG 电路,或许可以使用更少的电极。

未来,我们计划将该模型应用于更小的低功耗设备,如Blue Pill ,它可以使用纽扣电池运行。

最后的想法

通过轻松访问廉价硬件等资源以及开源机器学习算法和数据,参与医疗设备技术的概念化和开发是一个激动人心的时刻。

我们希望激励其他人将改变未来生活的技术产品化。

在这里查看我们关于这个项目的回购协议


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

评论(0)
发评论

下载排行榜

全部0条评论

快来发表一下你的评论吧 !