
做脑功能成像研究特别是刚上手 fNIRS 的朋友第一道坎往往不是数据分析而是“手里没数据”。实验室设备排期紧张、预算只够买耗材、或者单纯想先跑通一套分析流程验证想法——这些情况我都经历过。那阵子我把能搜到的 fNIRS 公开数据集几乎翻了个底朝天从平台、格式到预处理工具踩了不少坑也攒下了一份还算靠谱的清单。这篇文章就是把我的整理思路和结果完整梳理出来包含我实际用过的数据集、下载途径、数据格式说明以及一套从下载到预处理的实操流程。适合刚开始接触 fNIRS 的研究生、想复现论文实验的工程师还有需要为课程作业或竞赛准备数据集的同学。1. 为什么值得花时间整理 fNIRS 公开数据集1.1 新手场景没设备也能跑通分析流程很多人觉得做 fNIRS 研究必须有硬件其实不完全是。fNIRS 公开数据集最直接的价值就是让你在没有设备的情况下先把“采集—预处理—统计”这条链路跑通。我自己最早就是用一套公开的运动任务数据集在 Homer 里反复调带通滤波参数才真正理解血氧信号里的低频漂移是什么样子。没有数据你连“信号长什么样”都不知道更别说后面处理了。对新手来说公开数据另一层意义在于可以放心折腾。自己的实验数据一旦采集完很多人会小心翼翼不敢乱动生怕把数据弄坏。公开数据集就没有这种心理负担你可以大胆尝试不同的预处理流程、不同的 GLM 设定甚至故意跑一些错误参数看看会出什么问题。这种“破坏性学习”对建立工程直觉特别重要。1.2 科研场景跨数据集验证算法、复现研究做算法开发和脑机接口研究的同行对公开数据集的需求更刚硬。你在自己实验室数据上调出来的分类准确率如果换一套公开数据就崩了那说明你的方法泛化性存疑。fNIRS 领域这几年涌现了不少公开的脑机接口数据集运动想象、精神负荷、情绪识别等任务都有覆盖跨数据集验证已经成为论文审稿人越来越看重的环节。另外很多发表在《Scientific Data》《Scientific Reports》等期刊上的论文会要求作者把原始数据一同公开。这类数据集经过同行评议和标准化整理质量相对可靠还附带详细的采集说明。想复现一篇文献的实验时优先找它的公开数据比自己从零搭实验快得多。1.3 fNIRS 数据与 fMRI、EEG 数据的关键差异整理过脑影像数据的人都知道fMRI 公开数据集非常多像 HCP、ABCD 都是千级被试量。fNIRS 公开数据集规模通常小得多几十人已经算大样本了这一方面是因为设备通道数有限、成本不低另一方面是缺乏像 BIDS 那样统一普及的标准规范导致数据共享门槛更高。和 EEG 相比fNIRS 数据又有自己的特殊性。EEG 的采样率动辄上千赫兹fNIRS 通常只有 10~50 HzEEG 信号是电压时间序列fNIRS 测量的是氧合血红蛋白和脱氧血红蛋白浓度变化本质上是两种光学信号。这意味着处理 EEG 的思路不能直接搬到 fNIRS 上滤波参数、伪迹识别标准都要重新适配。整理公开数据集时一定要看清数据采集设备和采样参数别拿到数据就套用 EEG 的处理模板。下表是我整理时常用的对比维度建议大家拿到任何数据集先按这个口径列一张表后面用起来会省很多事。对比维度典型范围 / 说明采集设备NIRx、Hitachi、Artinis、Shimadzu、LIGHTNIRS 等采样率通常 1.7~50 HzfNIRS 信号本身是慢信号通道数量4~上百通道取决于光极布局任务类型静息态、运动想象、工作记忆、情绪刺激、自然行走等是否含结构像多数无 MRI 结构像仅有光极位置或前额布局图数据格式SNIRF、.nirs、.mat、.txt、光强/浓度 HDR 多态头动容忍度较 fMRI 高但大幅度头动仍会造成运动伪迹2. 主流 fNIRS 公开数据集逐个拆解2.1 OpenfNIRS综合类开源数据仓库OpenfNIRS 是目前我推荐新手最先看的地方。它是一个由学术界发起的开放数据平台专门收集和标准化 fNIRS 数据网址在 openfnirs.org不需要申请审批注册后可以比较方便地下载。里面包含多个子数据集覆盖运动执行与运动想象、工作记忆、精神负荷、VR 交互等常见范式文件大多转成了标准的 SNIRF 格式非常适合用来练习处理流程。这个平台的好处是数据来源清晰每个数据集都有对应的论文和采集协议说明你能查到实验范式、光极排布、任务时长这些关键信息。缺点是数据集之间的质量参差不齐有的数据信号质量很好有的则明显存在通道脱落问题——不过从练习角度来说这反而是好事能提前见识真实数据的“脏”。如果你手头有处理 Homer2 或 Homer3 的经验会发现 OpenfNIRS 的数据很容易上手因为 SNIRF 可以直接被 Homer3 读取不需要手动解析。我经常拿这里的数据做新工具的冒烟测试能省掉造假的模拟数据直接用真实采集结果验证。2.2 设备厂商提供的示例数据NIRx、日立等很多朋友忽略了一条渠道设备厂商官网。NIRx 作为市场占有率很高的明星厂商其官网提供了若干示例数据包含视觉刺激、运动任务等经典范式还附带 NIRStar 采集软件生成的完整文件包。用这些数据的好处是它们直接对应厂商软件的输出格式所以你完全可以用 NIRStar 打开查看原始光强、信号质量指标再导出到 Homer 做进一步处理几乎不会遇到格式兼容问题。日立的 ETG-4000 等设备也有类似的示例数据流落在各大学实验室页面不过查找起来不如 NIRx 方便。Artinis 和 Shimadzu 则在官方文档中提供了示例数据下载链接通常跟在软件说明书后面。厂商数据本质上属于“教学资料”任务设计比较简单被试量也少但拿来做工具链验证和格式学习非常合适。2.3 Scientific Data 等期刊开放的论文配套数据这是质量最高的一类来源也是最容易被忽视的。很多高水平期刊要求作者在论文发表时把原始数据放在公开仓库比如 Figshare、Dryad、Zenodo 或机构自己的数据空间。以 fNIRS 为例我见过涵盖步态行走、静息态、语言任务、脑机接口控制等多个方向的数据集数据质量普遍高于社区自发分享的内容因为同行评议环节已经帮忙把关。找这类数据的方法很直接去 Google Scholar 或 PubMed 搜 fNIRS 相关论文重点看《Scientific Data》期刊的文章。这个刊物的核心就是数据论文每一篇都在描述一个数据集而且通常有专门的数据可用说明段落。搜到感兴趣的论文后去正文里找“Data Availability”一节就能拿到存储库和 DOI。我习惯直接在标题里加“dataset”关键词搜索效率比逐篇翻正文高得多。2.4 在线数据库与检索技巧NITRC、Figshare、GitHub通用的学术数据平台也值得长期关注。NITRC 是神经影像领域的老牌资源中心虽然主要偏 MRI但上面有一定数量的 fNIRS 数据条目可以通过关键词过滤查找。Figshare 和 Zenodo 上搜索 “fNIRS dataset” 通常能翻到很多零散但可用的数据集有的来自实验室直接分享有的是论文补充材料。GitHub 是另一个容易被忽视的宝库。搜索 fNIRS 分类或脑机接口仓库经常能在仓库根目录的data文件夹里找到带原始记录的数据文件。比如有些开源工具包的示例数据就来自真实公开实验MNE-NIRS 的文档数据就是通过这种方式公开的。GitHub 数据的优点是有版本控制能追到每次更新记录缺点是说明文档可能不全需要自己摸索。我个人常用的检索命令其实很简单就是在搜索框里敲fNIRS dataset source或fNIRS raw data download然后限定时间范围和仓库类型。下面列一下我常用的检索关键词和平台方便大家直接照抄平台推荐关键词备注GooglefNIRS open dataset, fNIRS Scientific Data优先找学术数据论文PubMedfNIRS dataset data descriptor搜数据论文最有效NITRCnear-infrared spectroscopy老牌影像资源中心Figshare / ZenodofNIRS motor imagery, fNIRS resting state支持版本和 DOIGitHubfNIRS BCI dataset, Homer3 example data找开源配套数据3. 数据格式与预处理工具链3.1 从 SNIRF 到 .nirs常见格式扫盲整理 fNIRS 数据最容易被搞糊涂的就是格式。不同厂商、不同处理软件各自为政带来一堆扩展名。先记住最核心的几类其他都是变体。SNIRF 是老牌的开放标准格式扩展名是.snirf本质上是 HDF5 结构能同时存储光强数据、探头位置、刺激事件等元信息。这个格式的设计初衷就是把不同厂商的数据统一成一个标准让 Homer3、MNE-NIRS 等现代工具能够直接读取。可以说凡是转成 SNIRF 格式的数据跨软件操作的兼容性都会好很多。老式格式里最常见的是.nirs这是 Homer2 使用的格式本质上也是一个包含多个字段的 MATLAB 二进制文件记录了数据矩阵、采样率、光极位置、事件标记等信息。如果你看到.txt或.csv版数据那是导出的光强或浓度值不含元信息使用时要格外小心务必单独找到对应的实验说明文件。还有一部分数据集以 MATLAB 的.mat格式存储因为很多研究者习惯直接用 MATLAB 处理。打开.mat文件看看变量名一般能看到d表示原始光强数据s表示刺激事件向量t表示时间轴ml表示测量列表这些命名规则和 Homer2 保持了一致即使没有说明文档也能猜个大概。3.2 Homer、MNE-NIRS、NIRSLab 怎么选工具选型上fNIRS 领域已经形成了比较清晰的格局。Homer2 和 Homer3 是 MATLAB 生态里最主流的处理包几乎所有做 fNIRS 数据分析的人都绕不开它。Homer3 是 Homer2 的升级版支持 SNIRF 格式界面逻辑更像一个流程化的批处理框架。如果你熟悉 MATLAB直接选 Homer3 基本不会有坑。如果你是 Python 用户MNE-NIRS 是不二之选。它是 MNE-Python 生态的一部分API 设计得比 Homer 更现代文档也写得很清楚。MNE-NIRS 最大的优势是能和 MNE 的其他功能无缝衔接比如时频分析、源定位等而且它底层处理好 SNIRF 解析后自己制作各种可视化图表非常方便这在论文出图时很加分。NIRSLab 是 NIRx 推出的商业软件功能全面但收费。不过厂商通常会随设备赠送 License如果你所在单位买了 NIRx 设备这个软件的优先级应该高于其他工具。它的好处是图形化界面直观常规预处理点几下鼠标就能完成不需要写代码。但是一旦要批量处理几十个被试写脚本的效率优势就出来了这时候还是得回到 Homer 或 MNE-NIRS。还有一个更轻量的选择是 MATLAB 直接处理.mat格式数据写个循环批量做带通滤波和运动伪迹校正。这种方式的优点是灵活缺点是容易出错每一步都需要自己确认变量维度。我一般只在处理特定格式的旧数据时才会这么做日常流程还是交给 Homer3 或 MNE-NIRS 更好。3.3 通道配准与个体空间对齐的原理预处理里最容易出问题的是通道配准。fNIRS 通道本身不是一个实体传感器而是由一对光源探头和检测探头组成通道的位置取决于这一对探头在头皮上的坐标。同一个通道如果光极间距不同探测到的脑区深度和覆盖范围都不一样所以数据在组分析之前必须先明确每个通道在头部空间里到底对应哪里。很多公开数据集会提供光极位置信息常见形式是 3D 坐标的.csv文件或数字化仪的输出。我建议不要省略这一步哪怕只是粗略地用标准模板匹配一次也能在报告中说明你的通道覆盖了哪个脑区。大部分情况下精品数据集都会给出landmarks文件包含鼻根、左右耳前点等标记这时候可以使用 AtlasViewer 对通道进行空间投影效果相当好。对于没有位置信息的数据集只能靠光极排列图做手工近似。这种情况我一般会在结果里把结论写成“基于标准 10-20 系统的近似对应关系”而不是硬说精确配准保证结论的可信度。需要特别警惕的是网上流传的某些旧格式数据里面通道列表顺序和光极编号可能会错位务必先根据刺激触发事件来验证数据方向是否正常再进入后续批量处理。4. 从下载到预处理完整实操流程4.1 检索并下载数据实际操作都是从确定数据源开始的。假设你想找一套运动想象任务的数据来做分类模型验证我的建议顺序是先查 OpenfNIRS 平台上有没有现成数据其次去《Scientific Data》库搜数据论文最后再考虑 Figshare 和 GitHub 上的零散分享。登录开放平台后直接看数据集卡片里的字段重点关注Subjects数量、Channels数、Paradigm类型和Format属性。如果平台提供预览图一定要看原始光强曲线或浓度曲线观察信号是否连续、有没有大片脱落。这一步能筛掉不少问题数据避免下载到一半才发现不可用。下载时注意选择原始数据格式别只下载已经预处理后的版本。原始保留越全后期自由度越大。4.2 解压并确认文件结构下载完成后第一步不是直接跑工具而是确认目录结构。我习惯先给每个数据集建立一个独立文件夹命名格式为[来源]_[范式]_[被试数]_[通道数]例如openfnirs_motorimagery_20subj_36ch。里面建三个子目录raw、preprocessed、analysis。这个习惯一开始可能觉得麻烦但当你手头有超过五个数据集时能明显感受到有秩序的快乐。在raw目录下先列出所有文件检查是否包含 SNIRF 文件、事件标记表、光极位置文件和被试人口学信息。建议快速写一个读取脚本打印每个文件的大小和变量结构。很多数据集在解压时会丢失目录层级导致文件被平铺在同一个目录下这时候要根据文件名的前缀或实验编号重新分类整理避免后面统计时错位。4.3 用 MNE-NIRS 读取 SNIRF 并做基础预处理下面以 MNE-NIRS 为例展示一套从读取到预处理的完整代码流程。假设你已用pip install mne mne-nirs安装好依赖然后准备一个.snirf文件路径。import mne import mne_nirs # 1. 读取 SNIRF 格式数据 raw mne_nirs.io.read_snirf(sub-01_task-motor.snirf) # 2. 提取事件标记并查看任务类型 events, event_dict mne.events_from_annotations(raw) print(event_dict) # 3. 创建氧合与脱氧血红蛋白浓度信号 raw mne_nirs.channels.get_long_channels(raw) # 提取长距离通道 raw mne_nirs.preprocessing.optical_density(raw) # 光密度变换 raw mne_nirs.preprocessing.beer_lambert_law(raw) # 修正的 Beer-Lambert 变换 # 4. 查看处理后的信号曲线做质量控制 raw.copy().pick(pickshbo).plot(duration60, n_channels8) # 5. 按任务分段时长根据实验设计调整例如刺激前10秒到刺激后20秒 epochs mne.Epochs(raw, events, event_idevent_dict, tmin-10, tmax20, baselineNone) print(epochs)这段流程里最关键的步骤是第 3 步。optical_density会把原始光强换算成光密度变化量然后beer_lambert_law用修正的 Beer-Lambert 定律估算血红蛋白浓度。这里要特别提醒一定要先做光密度变换再做浓度变换直接对原始光强计算浓度会引入巨大误差。另外events_from_annotations读取出的 event ID 要和实验说明核对别把基线标记当成刺激标记用了。如果你使用的是 Homer3对应的流程是导入 SNIRF 后用hmrR_MotionCorrectWavelet做运动伪迹校正再用hmrR_BandpassFilt做带通滤波最后用hmrR_OD2Conc转换成浓度信号逻辑和 MNE-NIRS 一致。两套工具都可行选择顺手的就是最好的。4.4 批量处理与质量控制建议单个数据集跑通后批量的关键就变成了异常检测。我处理大量公开数据时会额外生成一份质量摘要表包含每个被试的通道有效率、信号均值方差和任务响应幅度。这一步用简单的 DataFrame 就可以完成但价值极高因为信息高度压缩很容易发现异常被试。质量控制的经验阈值供大家参考长距离通道信噪比低于 5 的话这个通道基本是要剔除的相邻通道之间相关系数过高也要小心可能是光耦短路头部运动造成的瞬时伪迹在浓度曲线上表现为大幅双向尖峰用 2 秒移动窗口的滑动标准差就能直接侦测出来。我的习惯是在预处理报告里附上 3 条原始信号截图一条好的、一条有轻微伪迹的、一条质量差的这样别人看你的数据时一目了然。还有一个容易被忽视的坑数据集里的事件标记延迟。如果事件的触发是外部设备经由串口打入往往需要经过缓冲导致标记与真实刺激起始点有几十毫秒的偏差。虽然在 fNIRS 这种慢信号里50 ms 的偏差影响不算大但如果你做的是需要精准锁定任务窗口的 GLM 分析还是要用刺激响应函数把这个延迟建模进去或者至少做一次滑动窗口测试来校准。5. 常见问题与避坑清单实录5.1 数据下载失败、链接失效怎么办公开数据集的链接失效是常态特别是大学实验室个人主页上的数据经常跟着作者换单位就消失了。遇到这种情况先在平台内搜索有没有备份副本比如 Figshare 经常有同一个数据集的不同版本。其次是利用 DOI 反查把原论文的 DOI 在 Google Scholar 中打开看有没有被其他研究者引用时附带的数据版本必要时可以直接给论文通讯作者发邮件礼貌地说明用途很多作者还是很乐意分享的。有一点要提醒大型神经影像共享平台上的 fNIRS 数据不多很多资源已经转向 Zenodo、OSF 这类通用平台所以搜索时不要只看影像专业网站。我对链接失效的判断是如果 404 页面显示得很干净基本就是记录转移了可以去 Web Archive 里尝试找历史快照如果是网盘页面加载不出则可能是网络问题换一个时段或者换浏览器再试。5.2 格式解析报错处理不了 SNIRF 怎么办初学阶段最容易遇到的报错是工具读不了数据。有次我下载了一个.snirf文件MNE-NIRS 直接报“invalid snirf structure”打开后才发现文件实际上是 MATLAB 的 .mat 结构只是扩展名写错了。遇到这类解析错误第一步永远是先检查文件真实头部信息用xxd查看前几个字节确认是不是 HDF5 结构而不是盲目改扩展名。另一个常见的现象是一个数据集内的多个被试文件存储结构不一致。有的被试文件里包含事件标记有的没有有的通道是 36 通道有的只保留了 32 个通道。这种情况下一定要先做一致性检查把所有文件的元信息提取出来对比然后根据研究问题决定是统一裁剪通道还是补全标记。千万不要假设所有文件结构相同这是很多批量处理翻车的根源。5.3 通道配准、头围数据缺失时如何降低损耗很多公开数据集为了隐私考虑并不会提供个体 T1 结构像连准确定位用的头围值都很少记录。这种情况下通道配准只能依赖标准模板。我的做法是优先选择自带光极位置的文件否则就用标准 10-20 系统的坐标做刚性配准并在论文或者报告中明确标注这个限制。实际分析中通道空间精度损失对结果的直接影响比很多人想象的小。fNIRS 主要捕获皮层表面区域的血氧响应空间精度本来就在厘米量级。做组水平的分析时标准模板配准基本能支撑主要脑区的定位结论。但做个体水平的定位研究时比如想区分背外侧前额叶和布洛卡区缺失配准信息就变成一个大问题这时候应该果断舍弃这个数据集另寻数据源。5.4 公开数据无法完全复现文献结果的排查思路下载了数据预处理完了做出来却和原文结论对不上这几乎是每个用公开数据做复现的人都会经历的痛苦。遇到这种情况先别怀疑数据有问题按照以下步骤排查。第一步查预处理参数尤其是带通滤波的截止频率范围fNIRS 信号频率范围一般集中在 0.01~0.2 Hz心跳和呼吸伪迹需要滤掉但很多人会把默认的 EEG 参数带进来直接滤掉了有效信号。第二步查事件窗口原始论文的 epoch 和基线时间设置可能和你下载到的数据包说明不完全一致尽量从原文的 Methods 部分找到具体数值逐一对齐。第三查统计方法很多 fNIRS 论文做的是基于通道的对比有的做的是感兴趣脑区的平均这两种方法输出的结果差异很大所以要仔细阅读统计部分的内容。如果以上都排查完还是对不上建议把处理好的数据在实验室讨论组里过一遍有时候一个参数设定的问题别人一眼就能看出来。复现不成功不等于数据不可用即使结果不完全一致只要你能合理说明差异来源这个复现过程本身已经很有价值也是用公开数据做研究的一大收获。我个人现在做新项目会先花半小时把候选公开数据集按任务类型、被试人数、通道数量、格式标准化程度列个表再决定用哪个。这个习惯帮我节省了大量走弯路的时间也让我在写方法学时能理直气壮地描述数据来源。希望这篇整理也能让你的 fNIRS 之路少一点折腾多一点底气。