news 2026/10/4 16:06:32

fNIRS公开数据集全攻略:从格式解析到预处理实战

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
fNIRS公开数据集全攻略:从格式解析到预处理实战

做fNIRS研究这些年,我踩过最深的坑不是信号质量差,也不是预处理参数调不明白,而是找数据。导师让我做方法学验证,开口就问“有没有现成的公开数据集可以跑”,我愣是翻了好几天论文补充材料,在OSF、GitHub、IEEE DataPort之间来回折腾。后来我才发现,fNIRS公开数据集的生态虽然没有fMRI那么成熟,但能用的资源其实比想象中多,只是太分散了,很多同学根本不知道去哪儿找,更不知道拿到手之后该怎么处理。

这篇博文就把我实际用过、调研过的fNIRS公开数据集整理一遍,讲清楚每个资源能做什么、数据是什么格式、适合什么研究场景,以及下载之后怎么顺利跑通预处理。内容面向正在做fNIRS方向的研究生、想用公开数据做预实验的课题组,还有刚入门想快速上手fNIRS分析工具的同学。我不打算罗列一堆链接完事,而是把我踩过的坑和验证过的路线一起写出来,帮你省下几个星期的无用功。

1. fNIRS数据到底长什么样:先搞清三件事

1.1 从信号本质到数据形态

fNIRS(功能性近红外光谱成像)的原理说起来并不复杂:用650到950纳米波段的近红外光照射头皮,光线穿过皮层表面后被组织吸收和散射,其中氧合血红蛋白(HbO)和脱氧血红蛋白(HbR)对不同波长光的吸收率不一样。通过检测反射回来的光强变化,再套用修正的Beer-Lambert定律,就能估计出脑区浅层皮层中HbO和HbR浓度的相对变化。

跟fMRI相比,fNIRS的时间分辨率高得多,采样率通常在几赫兹到几十赫兹,设备便携、对头动相对耐受,特别适合婴幼儿、老年人、运动场景以及需要面对面交互的超扫描实验。但代价是空间分辨率低,只能覆盖靠近颅骨的大脑皮层区域,测量深度大概在1到3厘米。所以拿到一份fNIRS数据,写在头文件里的往往是光强或光密度(Optical Density,OD)序列,按通道、按时间排布,而不是像fMRI那样的三维体素图像。

这就是新手最容易懵的地方:fNIRS数据不像结构像MRI那样,打开就是一个直观的脑图像。它本质上是一张或多张二维时序表,每一行是一个采样点,每一列是一个测量通道。要用好公开数据集,第一步不是急着预处理,而是先搞明白这份数据的通道布局、采样率、事件标记存放在了哪里。

1.2 公开数据集为什么重要

很多课题组有设备,但设备不是随时都能用;很多学生想做方法学或者算法验证,又没有足够的伦理审批和时间去采集一批新数据。公开数据集恰好能解决这些问题:你可以用它来复现论文里的分析流程,对比不同预处理管道的效果,也可以拿来做机器学习分类、特征选择、领域自适应这类研究。

另外,fNIRS领域的数据共享风气这几年明显好起来了。OpenNeuro、OSF这些平台上都能找到不少高质量数据,期刊也越来越鼓励作者把数据和代码一起公开。对审稿人和后来者来说,一份组织良好的公开数据集本身就是一种学术贡献。我见过好几个同行就是因为把超扫描的数据整理上传到OSF,被不少团队引用,还促成了后续的合作。别觉得上传数据没技术含量,把数据整理清楚这件事,本身就是给领域铺路。

2. 值得上手的五类公开数据集

2.1 通用任务态:CogPilot认知负荷数据集

CogPilot是我个人认为最适合拿来练手的一个合集。它不是一个单一实验的数据,而是围绕认知负荷评估整合了多个子数据集,里面包含MATB(多属性任务电池)、N-Back、Fitts任务、模拟飞行等范式的fNIRS记录,部分子集还同步了心电或心率等生理信号。数据以.mat格式为主,里面是Homer可以直接识别的.nirs结构或者兼容字段,这意味着你下载之后,不用做太多格式转换,就能直接导入Homer2或Homer3开始预处理。

这个数据集的价值在于任务范式丰富。比如N-Back子集可以用来做工作记忆负荷的分类,MATB子集贴近飞行和驾驶情境,适合做认知疲劳研究。我第一次拿它跑通了从原始光强到GLM激活图的完整流程,中间没遇到什么格式灾难,对一个初学者来说相当友好。

去IEEE DataPort上搜索“CogPilot”就能找到,需要注册账号,授权页面会列出具体的数据内容和使用协议。下载前注意看每个子集的说明文档,因为不同子实验的被试人数、通道数量、采样率、任务时长都不一样,最好先做好记录再批量处理。

2.2 镜像容器:fNIRS-Docker快速复现

如果你连软件环境都还没搭好,fNIRS-Docker这个项目可以直接把你拉进“开箱即用”的状态。这个项目把Homer2分析环境连同示例数据集一起封装进了Docker镜像,你不需要自己在MATLAB里折腾工具箱路径,也不用手动去下载各个依赖库。跑起来之后,容器里自带工作目录和示例数据,跟着文档做一遍,就能体会到“导入数据—预处理—hrf拟合—结果可视化”的完整链路。

我记得这个项目是当年很多人学习Homer2时推荐的起点。它在GitHub上能找到,搜索“fNIRS Docker”就行。它的局限在于示例数据的规模和类型比较有限,主要适合跑通流程、验证工具链,不适合做大规模研究。更好用的方式是把它的环境当作“标准测试环境”:你从其他数据集下载的数据,先在这个容器里跑一遍预处理,如果没问题,再换到本机分析,这样可以把环境差异导致的问题挡住一大半。

2.3 厂商示例数据:NIRx与Artinis

设备厂商提供的示例数据往往是被忽视的好资源。NIRx官网的下载中心有演示数据集和样例文件,覆盖了静息态、任务态、超扫描等不同采集模式,文件里通常会附带采集参数说明和通道坐标。我之前为了验证MNE-NIRS的读取流程,就是从NIRx的示例数据开始测的,因为它的格式最规范,头文件信息完整,很适合拿来写解析脚本和做格式校验。

Artinis也有类似的数据下载页面,提供多种型号设备记录的示例数据。厂商数据的一大优势是附带的文档详细——探头的排布、光极坐标、事件标记位置都写得清清楚楚,这对新手理解fNIRS头帽布局非常有帮助。缺点是这些数据往往不是为发表研究准备的,通常缺乏独立被试的所有原始记录,不适合做统计推断。但作为格式学习、工具调试、通道排布演示的素材,它们比很多论文补充数据要好用得多,因为没有缺失文件、没有乱编码、也没有损坏的标记通道。

2.4 超扫描数据:双人交互研究

超扫描(hyperscanning)是fNIRS最有特色的应用方向之一,因为它可以在两三个被试同时佩戴设备的情况下,记录面对面交互时双方的脑活动。跟fMRI只能单人扫描不同,fNIRS的超扫描生态效度高很多。但这个方向的数据特别难找,因为采集成本翻倍,同步和数据对齐也更复杂。

我见过不少研究团队把超扫描数据传到OSF上,搜索关键词可以用“fNIRS hyperscanning”“dual brain”“two-person interaction”,再加上任务类型比如“cooperation”“conversation”“eye contact”。数据通常包含两个被试各自的信号文件、事件标记、以及同步时间戳。如果你要分析人际神经同步(Interpersonal Neural Synchrony,INS),需要特别留意数据里是否包含同步信号或触发通道,不然两边的数据时间轴对不齐,后续相关性计算全是脏数据。

从我的经验来看,超扫描数据集的格式差异极大,有按被试分文件的,也有把两个被试放在同一个.nirs里用不同通道组区分的。下载前建议先看README,弄清楚通道编号中被试A和被试B的分界在哪里,再考虑怎么做通道级配对分析。

2.5 平台聚合:OpenNeuro与OSF/BIDS

OpenNeuro是一个神经成像数据共享平台,上面传统上以fMRI和MEG为主,但近几年fNIRS的数据集数量也在增加。在搜索筛选条件里选择modality类型为fNIRS,就能看到相关数据集。这类平台最大的好处是数据组织规范,很多已经通过BIDS格式校验,带有participants.tsv、task描述、事件文件等元数据,配合fNIRS的BIDS扩展(BEP026对应的后续规范),处理起来清爽得多。

OSF(Open Science Framework)则是另一个宝库,很多论文在正文里写了“data are available at OSF”,但你要一个个找。更高效的方法是直接用Google Scholar搜文献时留意有没有OSF链接,或者到OSF上搜索关键词“fNIRS”。OSF上的数据质量参差不齐,有的连README都没有,有的则整理得比正式论文还详细。我通常优先选择那些带有完整通道位置文件和时间事件标签的项目,因为这样的数据复用成本最低。

2.6 一张表看懂数据集选型

数据集/资源任务类型典型规模主要格式获取方式适合场景
CogPilotMATB、N-Back、Fitts、模拟飞行等多子集,数十人规模.mat / .nirsIEEE DataPort认知负荷分类、Homer流程学习
fNIRS-Docker示例任务数据少量数据.nirsGitHub快速搭建分析环境
NIRx示例数据静息态/任务态/超扫描演示用.snirf或厂商格式NIRx官网下载中心工具验证、格式学习
Artinis示例数据静息态/任务态演示用厂商格式Artinis官网通道排布、预处理测试
OpenNeuro上的fNIRS数据集视具体数据集而定较完整BIDS/SnirfOpenNeuro平台规范分析、方法学研究
OSF上的超扫描数据合作/对话/社交交互几十人多样OSF搜索人际神经同步研究

这张表不是让你挨个把资源下载下来,而是帮助你根据研究目标快速圈定范围。如果只是想学会Homer2怎么用,直接上fNIRS-Docker;如果是做认知负荷分类,CogPilot是首选;如果写代码需要干净的数据做格式解析,厂商示例数据最省心。

3. 数据格式与加载预处理

3.1 SNIRF统一格式与BIDS扩展

fNIRS早期最糟心的问题就是格式不统一:每家厂商都有自己的文件后缀,Homer能读的.nirs只是“事实标准”,不是“正式标准”。后来社区推出了SNIRF(Shared Near Infrared Spectroscopy Format),基于HDF5把光强、时间轴、通道布局、事件标记、元数据统一装在一个.snirf文件里。这几年新发布的公开数据集越来越多采用.snirf,Homer3和MNE-NIRS都原生支持,NIRx等厂商也在软件里提供导出.snirf的选项。

SNIRF好在哪里?拿一个具体场景举例:你下载了一份数据,想知道通道排列和光极距离。在旧格式里,你可能要读一份单独的txt说明,再手动建立映射;在.snirf里,这些信息直接以结构化字段存在,Python里调一下就可以查看。做格式转换也有工具支持,比如很多厂商SDK或者社区脚本都可以把.nirs转成.snirf。对使用者来说,学会读.snirf等于掌握了一套通用的“数据打开方式”,比死记各种厂商格式要高效得多。

BIDS方面,fNIRS对应的BIDS扩展为数据提供了统一的目录结构、命名规范、事件文件格式。如果你在OpenNeuro上下载过数据,会看到诸如sub-01_task-rest_snirf.snirf、sub-01_task-rest_events.tsv这样的文件排列。这种规范化的目录结构让后续自动化分析变得非常方便:循环遍历所有被试,按规则读入数据和事件标签,你不需要为每个数据集单独写一套路径解析代码。

3.2 用Python/MNE读数据

MNE-Python从0.21版本开始加入了fNIRS模块,接口设计得相当顺手。假设你下载了一份.snirf格式的数据,可以用下面几行代码读进来并快速看结构:

import mne # 读取SNIRF文件 raw = mne.io.read_raw_snirf('sub-01_task-rest.snirf', preload=True) # 打印基本信息 print(raw.info) print(raw.ch_names) # 查看事件标记 print(raw.annotations) # 从原始光强计算光密度(OD) raw = mne.preprocessing.nirs.optical_density(raw) # 再计算浓度变化(HbO/HbR) raw = mne.preprocessing.nirs.beer_lambert_law(raw)

如果数据是NIRx的.nirs格式,也可以用read_raw_nirx读取,接口类似。MNE的优势在于它的事件读取、通道类型标注、坏道标记、ICA等工具链都是现成的,特别是你后续要跟EEG数据联合分析时,能够直接复用同一套函数。不过要注意,MNE里所谓通道名通常带“1x1”“2x3”之类的编号,这并不直接等同于你统计上的“通道”编号,理解通道坐标还需要加载montage信息。

用MNE处理fNIRS还有一个隐藏的好处:它的数据对象兼容mne.Epochs、mne.time_frequency等模块,你可以直接做时频分析和GLM。如果以前用过MNE处理EEG,转换到fNIRS几乎没什么额外学习成本。

3.3 Homer2/Homer3的标准流水线

Homer系列是fNIRS领域最经典的MATLAB工具箱,Homer3是Homer2的下一代。它们的标准分析流程大致是:

第一步,把原始光强转换成光密度;第二步,检测运动伪影并校正——常见做法是先用滑动窗标准差识别突变区间,再用样条插值或者小波方法进行修正;第三步,带通滤波去除低频漂移和高频噪声,很多文献采用0.01到0.1Hz的频带;第四步,用修正的Beer-Lambert定律计算HbO和HbR浓度变化;第五步,建立任务模型,做block平均或一般线性模型(GLM)得到激活估计。

对新手来说,Homer系列最值得学习的是它把每一步都封装成了可配置的模块,界面上能看到参数选项。但这也带来一个问题:默认参数并不适用于所有数据。比如带通滤波的低频截止,如果你做的是静息态功能连接分析,0.01Hz以下可能存在有意义的慢波,不能一刀切。运动校正的阈值参数也需要根据头动程度和信号强度调整。我见过不少学生盲目用默认参数跑完,结果出来的激活图跟论文里完全相反。建议拿到一份新数据集时,先挑一个被试的数据做参数敏感性测试,观察每一步处理前后的信号变化,再决定整套流程参数。

4. 实操:从下载到预处理的完整流程

4.1 以CogPilot为例的6步操作

我拿CogPilot里的N-Back子集做例子,走一遍从下载到出结果的完整流程,你可以把这个步骤推广到其他数据上。

第一步,去IEEE DataPort平台注册账号,搜索CogPilot,找到对应的项目页面,仔细阅读数据描述和许可条款。需要注意的是,有些子集可能只允许学术用途,不能直接商用。

第二步,下载数据并解压,建立一个工作目录。我的习惯是每个数据集建一个单独文件夹,里面至少包含rawdata(原始数据)、derivatives(处理结果)、code(分析脚本)、README.md(数据集说明)。目录结构清晰能帮你省掉后面很多麻烦。

第三步,看一眼解压后的文件内部结构。CogPilot的典型情况是一个被试一个.mat文件,里面包含类似data.s(源极坐标)、data.d(探测器坐标)、data.t(时间轴)、data.dod或data.dc(光密度或浓度数据)这样的字段。如果一看是这种结构,你几乎可以确定它是按Homer的约定存的。

第四步,如果想用Homer3,就把.mat文件整理成Homer3能直接识别的.nirs文件,或者直接尝试在MATLAB里加载后补全SD结构。Homer3的GUI支持加载.snirf,但旧版.nirs也很常见。

第五步,配置预处理流程参数。以N-Back为例,我会先做一个0.01到0.1Hz的带通滤波,然后做运动伪影校正。N-Back任务时间较短,情绪唤醒不高,头动一般不会太夸张,运动校正阈值可以先用默认值,再对比处理后信号。

第六步,运行block平均或GLM,输出对比试次(比如2-back减去0-back)的HbO/HbR激活图。到这一步,你才算真正“学会”了这份公开数据集的使用方法。

整个流程核心不是命令本身,而是每一步你都应该清楚数据经过了什么变换。拿到新的数据时,不要急着把全部被试一次性跑完,先处理一个被试并记录每一步的时间、信号幅度和峰度变化,大概率会少走很多弯路。

4.2 预处理参数怎么定

预处理参数是fNIRS分析里最需要“因数据而异”的部分,没有一套万金油。带通滤波的低频截止,一般取0.01Hz用来去除仪器漂移和慢波,但对于某些静息态或长时间任务,0.01以下可能存在有意义的血管动力学信号,需要参考原始文献的实验设计再做决定。高频截止通常取0.1Hz到0.5Hz,主要为了滤掉心跳(约1Hz左右)和呼吸成分,但要小心别滤掉任务诱发的快速血流动力学反应。

运动校正的判断标准是看信号突变幅度和时间跨度。样条插值法会先标记出与其他通道差异巨大的段,然后对突变区间进行插值修正。校正阈值设得太低,会把正常任务诱发的信号当作伪影;设得太高,又可能把真正的头动伪影放过。我的建议是先绘制各通道信号随时间的曲线,肉眼观察明显尖峰的位置,再决定阈值。

最后还要考虑是否使用短距离通道作为全局生理噪声回归变量。如果你的数据集采集了短距离通道(源-探测器距离在5到15毫米之间),这些通道主要记录头皮血流信号,可以作为回归量放入GLM中,有效去除系统性噪声。这一点很多公开数据集的说明书里不会特别强调,但用于运动范式和临床样本时效果非常明显。

4.3 质量检查的几个关键指标

跑预处理之前,一定要先做数据质量检查。我最低限度会做这几项检查:

  • 检查各通道光强信号是否在合理范围,超出发射器-探测器组合的饱和范围说明接触不良。
  • 检查心率成分是否可见。静息态下如果信号功率谱在1Hz左右看不出明显峰值,大概率是探头脱落或者接触差。
  • 检查事件标记是否与任务时长一致。N-Back里每个刺激和反馈事件的时间戳,应该能和实验脚本的触发逻辑对得上。
  • 检查被试间的通道覆盖是否一致。有些数据集中不同被试的通道编号含义可能不同,如果直接大矩阵拼接,结果不可信。

检查方式可以用MNE画时间序列图,也可以用Homer3的图形界面。关键是形成习惯:任何统计结果在解释前,先让数据质量过一遍脑。公开数据也不是工信得过,我见过一些数据集中有被试半数通道损坏但作者没有标注,如果在预处理前不做检查,后面所有分析都会受影响。

5. 常见问题与排查技巧实录

5.1 数据加载类问题

我遇到过最多的报错就是.nirs文件加载失败。原因通常是MATLAB工作目录不对,或者文件路径包含中文或空格。Homer2时代对路径非常敏感,目录里只要有一个中文文件夹就可能导致读取失败,改成英文路径基本就能解决。MNE读取时遇到格式不兼容则更常见,比如文件的元数据字段不完整,报错信息通常会指向snirf格式解析出错。这时先检查文件是否真的含有nirs标签和data字段,如果没有,可能文件本身是旧版厂商格式,需要先做一次格式转换。

另一个加载问题是事件标记缺失。很多公开数据集把事件编码放在单独的events.tsv或.txt里,而不在.snirf的annotation里。你在读数据后看不到任何标记,不要以为是数据坏了,先去看看同目录下有没有配套的事件文件,手动导入并映射为MNE的Annotations或者其他格式的事件矩阵。

5.2 格式与版本兼容问题

Homer2、Homer3、MNE-NIRS对格式的接受范围并不完全重叠。.nirs文件在Homer3中可以读取,但新版Homer3更推荐.snirf。厂商原始格式则需要特定代码或软件导出,不建议直接拿主流工具箱硬读。这里有一个通用结论:如果你不确定某份数据应该用什么工具处理,先把数据转换成.snirf再看工具箱的兼容性,因为当前主流工具都支持.snirf,这是最大的“公约数”。

转换时也要注意版本差异,SNIRF规范本身有版本迭代,旧版的.snirf在新版Homer3里可能提示字段缺失。遇到这种问题,优先看工具箱官方的升级文档,而不是自己猜测字段名,因为这个格式有严格的规范约束,手改容易造成新的错误。

5.3 超扫描与多设备对齐

超扫描数据的对齐问题是另一个高频难题。两台设备各自有独立的时间轴,如果数据中没有记录触发脉冲或同步信号,基本无法事后精确对齐。因此,我在整理超扫描数据时通常会特别注意时间戳信息:同一被试对的两个文件是否共享同一采样时钟,事件标记里是否包含同步触发码。对于没有同步信号的数据,最简单的折中做法是使用行为录像或对话音频中的语音起始时间作为粗对齐线索,但只能用于秒级对齐,不能用于毫秒级的神经同步分析。

如果数据集有同步触发通道,处理时会清爽很多:读取两个raw对象后,可以按触发通道的上升沿时间差进行线性插值对齐,然后把两个raw对象合并成同一个MNE对象,再按正常流程预处理。这个过程中最容易出错的是通道编号混淆,建议一边看图,一边确认通道对应关系,别只信代码。

5.4 快速排查表

现象可能原因处理建议
读取.nirs失败路径含中文或空格改成纯英文路径
示例数据全是坏道光极脱落或接触不良查看原始记录笔记,剔除或标记坏道
事件标记为空事件另外存放在事件文件手动导入events文件
HbO/HbR趋势奇特滤波参数不合适检查带通范围,观察频谱
超扫描时间对不上缺少同步信号用触发时间戳或行为事件对齐
Homer矩阵尺寸不对通道数设置错误重新核对SD结构和通道布局

这个表是拿来“速查”的,实际处理时会更复杂。我自己的习惯是每下载一份数据,先花半天时间把它的README、数据字典、文件结构摸清楚,宁可慢一点,也不要等到跑完所有被试才发现通道定义理解错了。数据和代码不一样,代码错了可以马上重跑,数据理解错了,整批分析结果都可能作废。

我个人在实际操作中最深的感受是:公开数据集帮你省下的时间,一半在下载和格式理解上,另一半在你是否认真阅读了数据说明上。一开始我也是恨不得把下载按钮点了就赶紧跑流程,结果老是卡在各种离奇错误上。后来老老实实地一步步读文档、检查结构、单被试调试,反而快得多。如果你刚起步,也别急着同时下好几个数据集,先挑一个样本量适中、文档完整、格式规范的资源好好啃一遍,把工具链和流程跑通,再扩展其他数据集,这是最稳的路径。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/4 16:03:37

ESP32芯片与模组选型指南:从射频设计到量产避坑

1. 从一次选型翻车说起:ESP32芯片和模组到底差在哪前阵子帮一个做智能硬件的朋友救火,他们团队画了一块板子,用的是ESP32芯片裸片,结果射频部分死活调不通,Wi-Fi信号弱得离谱,天线匹配网络换了三版还是不行…

作者头像 李华
网站建设 2026/10/4 16:02:32

AXI VIP验证实战:从选型配置到握手调试

1. 项目概述:为什么AXI验证必须用VIP,而不是手写测试平台AMBA VIP——特别是针对AXI协议的验证IP——不是可选项,而是数字前端验证工程师绕不开的基础设施。我带过三届校招新人,几乎所有人第一周都在问:“AXI握手时序这…

作者头像 李华
网站建设 2026/10/4 16:02:09

MiMo-V2.6 多模态推理架构优化:跨模态路由注意力机制解析

1. MiMo-V2.6 到底在解决什么问题第一次看到 MiMo-V2.6 这个版本号,很多人会下意识觉得又是一次常规的小版本迭代——参数涨一点、榜单刷一刷、然后发个技术报告完事。但如果你真的把论文从头到尾啃一遍,会发现这次的核心变化不在“更大”,而…

作者头像 李华
网站建设 2026/10/4 16:02:03

Skills Manager:AI编程工具Agent技能统一管理与分发中枢

你可能也有这种感觉:Cline 里刚调顺一套技能,到了 Trae 又得重新写一份;Claude Code 的 Skills 用的是 SKILL.md,Cline 的规则又是另一套字段…… Agent 已经能帮你干不少活了,但你自己的“技能管理”还停留在复制粘贴…

作者头像 李华