新智元报道
编辑:元子
【新智元导读】Elon Musk和Neuralink希望建立一个脑机接口,可以作为大脑的第三层,让人类与人工智能形成共生关系,进而实现通过意识与外界通信。本文教你使用Keras和OpenBCI建立脑接口与Google进行通信。
你可能早就知道马斯克投资了一家公司,做脑机接口。但你知道,具体他们是怎么实现的吗?
来自英特尔的软件工程师、加州大学戴维斯分校的CS专业和生物学辅导员、技术和人工智能爱好者Jag Singh写了一篇攻略,下面我们看看具体是如何做到吧!
这个项目建立了神经系统和外部AI智能体之间的直接联系,并利用利用次声定位。此智能体可能是你可以获得API的任何智能体,包括Google智能助理,Siri,Alexa,Watson等。
所需的主要硬件工具是OpenBCI Ganglion板,这个板子社区活跃,价格也不贵。除了电路板,你还需要电极和电线。当然,也可以直接买OpenBCI入门套件。
调试教程是在Linux机器上完成的。确保Python版本是最新的(3.4以上),然后就可以clone:
https://github.com/OpenBCI/pyOpenBCI。
cd到pyOpenBCI,然后
$ pip install numpy pyserial bitstring xmltodict requests bluepy$ pip install pyOpenBCI
然后再cd到pyOpenBCI/Examples,将print_raw_example.py中的
board = OpenBCICyton(daisy = False)
改为
board = OpenBCIGanglion(mac=’*’)
接下来打开板子电源。
在电脑上,cd到pyOpenBCI/Examples目录,键入以下命令:
$ sudo python print_raw_example
齐活儿。
记录信号上一步会得到一个原始的输入数据流。需要把这些数据转换成LSL流。
修改pyOpenBCI/Examples/lsl_example.py,代码如下图
紧接着修改 lsl-record.py :
你可以调整termBank(第64行)以尝试各种上下文中的各种单词组合。还可以在每个会话之前调整默认持续时间(第12行)。
接下来,让我们嗨起来!
把电极贴在头上,找个安静的地方,在电脑上开两个终端1和终端2,先手在1和2里输入以下命令:
终端1里:
$ sudo python lsl_example
终端2里:
$ sudo python lsl_record
接下来就可以开始指定持续时间的录制会话了。系统会提示使用术语库中的随机单词,每个2秒默念一个单词。
如果长时间的录音过程会让你不舒服或者打瞌睡,可以尝试进行少量多次的录音。还可以设计并实现更灵活的设置,并选择按键,在注意到干扰时删除当前和之前的间隔。
另一种解决方法是进行多个小会话并在最后组合数据,以及过度干扰丢弃会话。 一些噪音是不可避免的,你不必过于挑剔,因为随着样本数量的增加,模型变得更有弹性。
为获得最佳效果,单词库中的每个单词都应至少有1000个高质量样本。
处理信号一旦你有足够的数据,就可以准备它用于机器学习了。根据需要合并和预处理数据,使其具有以下格式:
单词是从1到NumIntervals的索引,它是SessionDuration/2与会话总数之和
术语对应于每个间隔显示的单词
[A,B,C,D]是EEG通道
每个单词,术语组合对应于大约800行数据
使用numpy将CSV文件导入python。应该在脚本中将所有数据加载到NumLines x 6 ndarray中。
第一步是过滤数据以去除我们感兴趣的频率之外的噪声。信息性EEG频率对应于以下频段:
过滤4Hz和100Hz之间的频率似乎是合理的,但会失败,因为60Hz是电网的频率(可能因国家而异),这必然是噪声的重要来源。为获得最佳效果,我们应在4Hz和50Hz之间进行滤波。
我们可以使用Scipy的Butterworth滤波器来选择我们想要保留的频率范围。使用以下代码定义过滤器:
https://stackoverflow.com/questions/12093594/how-to-implement-band-pass-butterworth-filter-with-scipy-signal-butter
然后,生成一个时间戳列(当我们组合多个数据集并使原始时间戳无效时),并将过滤器应用于每个通道:
过滤后,使用以下代码将数据重组为具有IntervalLength x ChannelCount x IntervalCount维度的三维ndarrray数组。
我们使用上述代码有效地完成了将时间序列数据转换为图像数据。这可能听起来有点奇怪,但你可以将每2秒间隔视为一个图像,每个像素对应于在特定(channelNumber,lineNumber)坐标处获取的信号值。
换句话说,我们有一堆IntervalCount图像,每个图像的大小为IntervalLength x CannelCount。
另外,使用CNN允许我们跳过傅里叶变换,因为时间序列数据上的卷积在数学上等效于过滤变换数据。
现在我们准备开始建设CNN了。 由于我们只有1个颜色维度,我们可以使用输入维度为IntervalLength和ChannelCount的1D CNN。您可以尝试不同的超参数和体系结构。 我决定使用单个卷积层,两个完全连接的层和两个池化层。
我们现在有一个模型应该能够将EEG数据的间隔与您的单词库中的特定单词相匹配。
让我们看看它有多好。将模型应用于测试数据,并将预测结果与实际结果进行比较。
在不影响准确性的情况下增加术语库大小的一种可能方法是创建具有多字查询的分层“术语树”。然后,您可以在树上执行深度优先搜索 - 每个单词层仅与同一子树的同一层中的其他单词进行比较 - 以找到最佳匹配。
使用谷歌搜索我们现在拥有使用BCI查询Google所需的所有部分。定义特定子声门和查询之间的映射,并进行适当的调用:
要按照您的想法进行实时查询,请修改并将lsl_record.py脚本作为模块导入。 然后,您可以调用它来响应用户输入读取LSL流,持续时间为2秒。
好了,现在你可以直接用意念使用谷歌搜索了,不需要声音或者打字!
结论你不能用三个或四个单词的术语库(除非前面提到的术语树的实现)做太多。
通过所有这些步骤搜索到最近的加油站的方向比通常的谷歌搜索稍微复杂一点。然而,重要的是要考虑这项技术的进一步发展可能导致的地方。
我们可以想象这个设备的改进且不那么引人注目的版本,与麻省理工学院团队已经拥有的版本没有太大区别,用于导航,网页查询,短信,智能家居管理或任何数量的例行任务。
当结合具有能够依赖于上下文的解释的不断改进的AI助手的能力时,可能性进一步扩展。
基于EEG的BCI的应用只是通过世界各地的公司和大学实验室进行的尖端研究最终可能实现的一小部分。
心灵感应通信,超智能,额外感官,模拟体验,人类意识数字化以及人工智能融合都值得考虑。
如果实现了这些可能性,它们不仅会重新定义我们与技术的关系:它们将重新定义人类的意义。