信息速览
睡眠研究的数据集长期被多导睡眠图占据:十几根电极贴在头皮与面部,整夜记录,再由判读技师按三十秒一帧打上清醒、浅睡、深睡、快速眼动的标签。另一条路线则在近十几年于小鼠身上长了起来——把基因编码的钙指示剂送进皮层神经元,隔着完整颅骨用一台宽场相机拍下整片皮层的亮度起伏,然后回头问一个电生理很难回答的问题:睡眠的每一个阶段,皮层这块二维表面上是什么样子。
WFCI 睡眠状态库是这条路线上的一个公开样本。华盛顿大学医学院的 Culver 实验室在 2019 年末到 2020 年秋天记录了十二只表达 GCaMP6f 的转基因小鼠,每只约三小时,同步采集脑电与肌电,再由睡眠判读人员按十秒一格标成清醒、非快速眼动、快速眼动,另设一个伪迹类。它的用途很明确:为自动睡眠分期算法提供一份带金标准的、空间连续的对照数据。
它的分量不在数量,而在于把光学成像与睡眠分期这两套原本分开的记录绑在了同一根时间轴上——钙信号提供空间,脑电肌电提供标签。代价同样清晰:小鼠、单一实验室、头部固定、总量两百多 GB,本身只是一篇方法学论文的配套数据。一屏速览见下表。
| 维度 | 内容 |
|---|---|
| 全名 | Wide-field calcium imaging sleep state database |
| 版本 | 1.0.1(2022-03-17);1.0.0 首发于 2021-09-20 |
| DOI | 10.13026/prp1-2d11 |
| 发布方 | PhysioNet(数据由华盛顿大学医学院贡献) |
| 实验对象 | 12 只表达 GCaMP6f 的转基因小鼠,兴奋性神经元 |
| 记录规模 | 每只约 3 小时无干扰记录,分段存放,段数因鼠而异 |
| 成像方式 | 宽场荧光成像,经完整颅骨,电磁耦合相机 |
| 视野与像素 | 128×128 像素,覆盖皮层表面,无深度分辨 |
| 帧率 | 16.81 Hz,每十秒一格含 168 帧 |
| 同步信号 | 脑电与肌电,仅用于人工判读,未随数据发布 |
| 标签体系 | 0 清醒、1 非快速眼动、2 伪迹、3 快速眼动 |
| 标注粒度 | 十秒一格,逐格单一标签 |
| 辅助文件 | 脑组织掩膜、Paxinos 图谱矩阵与分区名称、小鼠信息表 |
| 文件格式 | MAT(每文件三个变量),另有 CSV 与 TXT |
| 数据总量 | 未压缩 210.4 GB |
| 许可 | CC BY 4.0,免注册 |
| 配套代码 | github.com/comp-imaging-sci/MVG-CNN |
| 关联论文 | Journal of Neuroscience Methods 366:109421(2022) |
§1 它要解决的具体麻烦
1.1 睡眠的标签从来不是钙信号给的
睡眠分期这件事,本质上是一次跨模态的翻译。判读人员看到的是脑电的频率成分与肌电的张力水平:清醒时高频低幅、肌电活跃;非快速眼动时慢波增多、肌电下降;快速眼动时脑电回到近似清醒的混合频率、肌电几乎消失,同时伴随眼动。这套规则写在人身上已经用了几十年,搬到小鼠身上只需要换电极位置与频段。
钙成像提供的完全是另一种东西:某个像素在这一刻比上一刻亮了多少。它不直接告诉你这是慢波睡眠还是清醒,只告诉你这片组织此刻的活跃程度。把两者放在一起,才可能问出「非快速眼动期间皮层的空间模式与清醒时有什么不同」这类问题。这也解释了为什么这份数据的核心资产不是图像,而是那串十秒一格的标签——图像可以重拍,标签要靠另一套仪器和另一个人。
理解这一点,后面所有的取舍就顺了。它之所以只做小鼠、只做皮层表面、只做头固定,都是因为要把光学通路和电生理通路同时接在一只动物身上,能做到的实验条件本来就这么窄。
1.2 三条常见的错误期待
第一条,期待它是单细胞数据。名字里的「钙成像」容易让人联想到双光子显微镜下那一串串被分割出来的神经元轮廓。这里的成像是在完整颅骨外做的宽场拍摄,分辨率停在像素级,一个像素背后是成百上千个神经元的总和。官方从头到尾没有提供细胞分割结果,也没有单细胞荧光轨迹。
第二条,期待它能替代多导睡眠图做人类睡眠分期。它是小鼠,头固定,记录窗口固定在上午九点到下午一点。小鼠是昼伏夜出的动物,这个窗口对应它的主要睡眠期;人类睡眠结构、昼夜节律、体位变化全都不在它的覆盖范围里。拿它训练人类睡眠模型,等于把两个物种的皮层动力学混为一谈。
第三条,期待它是一份「干净的三分类数据」。官方码表里有四个值,第三位是伪迹。伪迹格的成因官方没有细说,但从记录方式可以推断与运动、光照波动或电极干扰有关,这部分内容在建模时要么剔除,要么单列一类,不能当作不存在的第四类硬塞进三分类损失函数。
1.3 它能给到的与给不到的
| 你的需求 | 它给的 | 够不够 |
|---|---|---|
| 小鼠睡眠分期的监督学习 | 十秒一格的人工标签,配同步脑电肌电判读 | 够,但只有十二只动物 |
| 皮层活动的空间模式分析 | 128×128 的连续视野,配脑图谱可分区取均值 | 够做分区级,不够做细胞级 |
| 睡眠状态转换的秒级动态 | 十秒粒度的标签 | 不够,转换时刻被抹平在一个格里 |
| 人类睡眠分期的迁移学习 | 小鼠数据 | 不够,物种与记录条件都不同 |
| 光学成像方法学的对照实验 | 同一套预处理流程产出的连续记录 | 够,官方给出了处理链条 |
| 自由活动动物的睡眠研究 | 头部固定的记录 | 不够,行为维度缺失 |
| 皮层下结构的研究 | 皮层表面二维投影 | 不够,无深度分辨 |
| 大幅度的预训练语料 | 十二只动物、两百多 GB | 不够,样本量不足以预训练 |
1.4 你的处境与它能帮到的事
| 你的处境 | 它能帮你什么 | 下一步该做什么 |
|---|---|---|
| 你在做睡眠自动分期,手里只有人类多导睡眠图,想验证方法是否依赖某种模态 | 提供同任务、不同物种、不同模态的对照数据,标签定义与人类睡眠分期同源 | 先用人脑数据训一版,再用它做零样本外测,看掉分幅度 |
| 你在研究睡眠期间皮层活动的空间组织,缺一份带状态标签的介观影像 | 连续视野加脑图谱,可按 Paxinos 分区取时间序列 | 先用掩膜切出脑组织,再按图谱分区求均值,注意边缘像素 |
| 你要做光学成像的预处理算法,缺真实噪声与漂移 | 官方给出了配准、去趋势、平滑、回归的处理链条与产物 | 把它当已处理数据做下游;要评估预处理本身,需向作者索取原始帧 |
| 你在教神经影像方法学,需要一个能讲清「标签从哪来」的例子 | 钙信号与脑电肌电双记录,标签与图像严格对齐 | 用 §4.3 的案例展示格与帧的对应关系,避免学生把帧当样本 |
| 你在评估某篇睡眠分期论文的可复现性 | 官方给出代码仓库与版本号 | 先确认论文用的是 1.0.0 还是 1.0.1,两者差异仅在引用与作者列表 |
| 你要做跨物种的睡眠分期基准 | 小鼠一侧的公开样本 | 先确认对照的人类数据集标签体系是否可映射到四类 |
1.5 一句话判断
它不是一份更大的睡眠数据集,而是一把少见的双刻度尺:一边量光学的空间,一边量电生理的时间,缺口在于这把尺子只做过十二只小鼠。
1.6 不适合谁:四条边界
不适合把它当人类睡眠数据用。 物种差异不是靠域适应能抹平的。小鼠的睡眠结构是多相短周期,人类是单相长周期;小鼠皮层的慢波空间范围与人类也不同量级。任何跨物种迁移的结论都必须显式标注这一步。
不适合做细胞级或网络级分析。 128×128 像素覆盖整片皮层,单像素对应大量神经元。想看单个细胞的功能连接、place cell、或者放电序列,这份数据从采集原理上就给不了。
不适合做自由行为学关联。 动物被固定在黑色绒布袋中,头部锁定,只有睡眠与觉醒的状态标签,没有运动、探究、摄食等行为变量。想研究「睡眠中的身体运动」,这里没有可用的信号。
不适合当大规模预训练语料。 十二只动物、每只一个记录会话,个体数比很多小样本临床研究还少。用它评估方法可以,用它学表征会立刻过拟合到这几只动物的皮层血管形态。
§2 数据构成与规格
2.1 目录只有两层,命名规则极其简单
顶层是十二个以动物编号命名的文件夹,从 Ms1 到 Ms12;每个文件夹里放该动物的若干记录段,命名形如 Ms1-fc1.mat、Ms1-fc2.mat,序号越大时间越靠后。把某只动物的 fc1 到 fcN 依次拼接,就得到这次约三小时的完整会话。
顶层还散落着四个辅助文件:README 说明变量含义,LICENSE 是许可全文,SHA256SUMS 是校验清单,mouse_info.csv 记录每只动物的采集日期、帧率与采集系统,atlas.mat 存放脑图谱。没有数据库、没有索引文件、没有逐帧时间戳,所有时间信息都来自帧率与格序。
| 路径 | 内容 | 量级 |
|---|---|---|
Ms1 至 Ms12 |
十二只动物的记录段 | 每只若干 MAT 文件 |
MsX/MsX-fcY.mat |
单段记录,含三个变量 | 视段长而定 |
atlas.mat |
图谱矩阵与分区名称 | 约 1.7 KB |
mouse_info.csv |
四列采集信息 | 547 字节 |
README.txt |
变量与码表说明 | 626 字节 |
LICENSE.txt |
CC BY 4.0 全文 | 14.5 KB |
SHA256SUMS.txt |
全部文件的校验和 | 11.2 KB |
这种结构的直接后果是:目录里没有任何地方记录每段到底有多长。段长只能打开文件看 data 的第四维,或者数标签向量的长度。做批量处理时,第一件事必须是建立一张「文件到格数」的清单,否则后续所有按时间对齐的操作都会踩空。
2.2 字段与变量的完整字典
每个 MAT 文件里恰好三个变量,官方在页面与 README 中给出了完全一致的描述:
| 变量 | 维度 | 类型 | 含义 |
|---|---|---|---|
data |
128×128×168×n | 数值矩阵 | 该段的全部图像帧,前三维是像素坐标与帧序,第四维是格序 |
scoringindex_file |
1×n | 整数向量 | 每格的睡眠状态标签,与第四维一一对应 |
xform_mask |
128×128 | 二值矩阵 | 脑组织掩膜,1 为脑,0 为非脑 |
标签码表四项,官方在数据描述与 README 中两处给出同一套映射:
| 码值 | 官方名称 | 中文 | 处理建议 |
|---|---|---|---|
| 0 | wake | 清醒 | 计入三分类 |
| 1 | NREM | 非快速眼动睡眠 | 计入三分类 |
| 2 | Artifacts | 伪迹 | 剔除或单列,视任务而定 |
| 3 | REM | 快速眼动睡眠 | 计入三分类 |
脑图谱文件里两个变量:
| 变量 | 维度 | 含义 |
|---|---|---|
AtlasSeed |
二维矩阵 | 每个像素所属脑区的编号,与图像同坐标系 |
parcelnames |
名称列表 | 编号对应的脑区名称,来自 Paxinos 小鼠脑立体定位图谱 |
小鼠信息表四列,十二行,是整个数据集里唯一的元数据表:
| 列名 | 含义 | 取值情况 |
|---|---|---|
| Mouse Name | 动物编号 | Ms1 至 Ms12 |
| Date Acquired | 采集日期 | 六位数字,年月日各两位 |
| Frame Rate (Hz) | 成像帧率 | 十二行全部为 16.81 |
| System Acquired On | 采集系统 | 全部为 WashU, Culver, OIS2 |
值得注意的是这份表缺少几样常被默认存在的东西:没有性别、没有年龄或体重、没有手术日期、没有电极阻抗、没有麻醉剂量。做分层分析时这些协变量一个都拿不到,只能在论文里写明「动物个体差异不可控」。
2.3 一条记录的完整解剖
打开任意一个 MAT 文件,得到的是一个四维数组。前三维是图像,第四维才是样本。这一点必须反复强调,因为绝大多数图像数据集的组织方式是「帧在前、通道在后」,而这里的第四维是时间格,不是颜色通道。
import scipy.io as sio
import numpy as np
#-- 读取一段记录,确认三个变量的形状
m = sio.loadmat('Ms1/Ms1-fc1.mat')
x = m['data'] #-- (128, 128, 168, n)
y = m['scoringindex_file'].ravel() #-- (n,)
mask = m['xform_mask'] #-- (128, 128)
print(x.shape, y.shape, mask.shape)
assert x.shape[3] == y.shape[0] #-- 第四维必须等于标签长度
print(np.unique(y)) #-- 期望 {0, 1, 2, 3} 的子集
三个变量之间的关系可以这样理解:x[:, :, :, k] 是第 k 个十秒窗的 168 帧,y[k] 是这个窗整段的唯一标签。也就是说,168 帧共享一个标签,帧不是独立样本。若把每一帧都当成一个带标签的样本展开,样本量会膨胀 168 倍,同时引入严重的标签泄漏——同一格内的帧几乎完全相关。
格与格的边界也要小心。官方把一段记录按格切开后仍放在同一个文件里,所以 n 就是一段的格数;而一只动物的完整会话由多个文件串联,段与段之间是否连续、有没有时间缺口,官方没有逐一说明,只说是按序号排列的连续记录。
2.4 十二只动物的采集批次
小鼠信息表把十二次采集的日期全部列了出来,时间跨度接近十个月:
| 动物 | 采集日期 | 帧率 | 系统 |
|---|---|---|---|
| Ms1 | 2019-11-14 | 16.81 | WashU, Culver, OIS2 |
| Ms2 | 2019-11-15 | 16.81 | WashU, Culver, OIS2 |
| Ms3 | 2019-12-11 | 16.81 | WashU, Culver, OIS2 |
| Ms4 | 2019-12-18 | 16.81 | WashU, Culver, OIS2 |
| Ms5 | 2020-01-27 | 16.81 | WashU, Culver, OIS2 |
| Ms6 | 2020-01-28 | 16.81 | WashU, Culver, OIS2 |
| Ms7 | 2020-02-04 | 16.81 | WashU, Culver, OIS2 |
| Ms8 | 2020-03-13 | 16.81 | WashU, Culver, OIS2 |
| Ms9 | 2020-04-02 | 16.81 | WashU, Culver, OIS2 |
| Ms10 | 2020-08-13 | 16.81 | WashU, Culver, OIS2 |
| Ms11 | 2020-08-14 | 16.81 | WashU, Culver, OIS2 |
| Ms12 | 2020-09-10 | 16.81 | WashU, Culver, OIS2 |
从这张表能读出三件事。其一,采集是成对进行的:11 月 14 与 15 日、1 月 27 与 28 日、8 月 13 与 14 日各是一对相邻日期,像是一次手术准备两只、隔日各录一只的节奏。其二,4 月 2 日到 8 月 13 日之间空了四个多月,官方未说明原因。其三,帧率与系统一栏完全一致,说明十二次采集用的是同一台设备、同一套参数,这对横向可比性是好事,对泛化性评估则是坏事——没有第二台设备可以作为对照。
日期本身也是一条边界信息。所有采集都在 2019 年末到 2020 年秋之间完成;2020 年春季全球多数在体实验室暂停了动物记录,四个月的空档在时间上与之一致,但官方未说明原因。对使用者来说,这意味着数据里不存在跨年份、跨季节的系统性对照。
2.5 与同类资源的字段差异
把它的字段结构与三类常见资源并排看,差别立刻显现:
| 资源 | 记录单位 | 标签来源 | 空间信息 | 时间粒度 |
|---|---|---|---|---|
| 本库 | 十秒格 | 脑电肌电人工判读 | 128×128 皮层投影 | 10 秒 |
| 人类多导睡眠图库 | 三十秒帧 | 判读技师按睡眠分期规则 | 无空间信息 | 30 秒 |
| 单细胞钙成像库 | 单个神经元轨迹 | 神经活动本身或行为事件 | 细胞级坐标 | 帧级到秒级 |
| 小鼠脑图谱资源 | 三维分区模板 | 解剖学标注 | 三维体素 | 无时间维 |
四者的差异不是精度高低,而是各自把哪一维做实了。人类多导睡眠图把时间做实,几十年积累让分期规则极度成熟;单细胞钙成像把细胞做实,能追到单个神经元的放电;脑图谱把解剖做实,分区边界清楚。本库把「皮层空间」与「睡眠时间」同时做了一个粗略的版本:空间只有二维投影,时间只有十秒格,但两者在同一只动物、同一段时间内严格对齐。这种对齐在公开数据里并不常见。
也因此,把它与人类睡眠库混着用来做「大一统睡眠模型」时,标签虽然同名,含义并不同源。人类睡眠分期规则里的 N1、N2、N3 在小鼠身上被压成单一的 NREM,反过来小鼠的 NREM 里同时包含慢波与更浅的阶段。字段名一样,语义的颗粒度不同。
2.6 由官方数字推算出的几个规格
官方没有逐项公布格数、段数与时长的分布,但由已给定的数字可以推算出几个对工程实现有用的量:
| 项 | 推算过程 | 结果 | 性质 |
|---|---|---|---|
| 每格帧数 | 官方直接给出 | 168 帧 | 官方 |
| 每格秒数 | 168 ÷ 16.81 | 约 9.99 秒 | 推算 |
| 三小时应有格数 | 10800 秒 ÷ 10 秒 | 1080 格 | 推算 |
| 单格元素数 | 128 × 128 × 168 | 约 275 万 | 推算 |
| 单格内存占用 | 275 万 × 4 字节 | 约 11 MB | 推算 |
| 单只动物全量 | 1080 格 × 11 MB | 十几 GB | 推算 |
| 全库总量 | 官方直接给出 | 210.4 GB | 官方 |
这里有个值得记录的细节:按每格 168 帧、帧率 16.81 Hz 计算,一格实际只覆盖 9.99 秒,与标称的十秒相差约六毫秒。一整段三小时累积下来是几秒量级的漂移。官方没有说明这六毫秒是怎么处理的——是丢弃、补齐还是重新对齐,页面与 README 都没有交代。做长时间对齐、计算状态转换潜伏期时,这个差额会进入误差。
另一个可以从总量反推的点:若数据以单精度浮点存储,十二只动物全量约一百四十 GB;若以双精度存储,约两百八十 GB。官方公布的 210.4 GB 落在两者之间,说明可能混用了不同精度,也可能部分记录确实不足三小时。官方未说明每个文件的数值类型,读取时用 x.dtype 确认一次比猜更省事。
§3 它是谁的数据:一间成像实验室的睡眠支线
3.1 九位作者,两个机构
署名名单把这项工作的分工写得比较清楚。九人分属华盛顿大学圣路易斯分校与伊利诺伊大学厄巴纳-香槟分校,前者出实验与数据,后者出算法:
| 作者 | 所属单位 | 在数据集里的角色 |
|---|---|---|
| Eric Landsness | 华盛顿大学医学院神经内科 | 署名首位,睡眠与脑电方向 |
| Xiaohui Zhang | 伊利诺伊大学厄巴纳-香槟分校生物工程系 | 算法与分类方法 |
| Wei Chen | 华盛顿大学医学院神经内科 | 数据采集与处理 |
| Hanyang Miao | 华盛顿大学医学院神经内科 | 数据采集与处理 |
| Michelle Tang | 华盛顿大学医学院 | 数据整理 |
| Lindsey Brier | 华盛顿大学放射学系 | 采集与预处理,致谢中单独提及 |
| Mark Anastasio | 伊利诺伊大学厄巴纳-香槟分校 | 算法与分类方法 |
| Jin-Moo Lee | 华盛顿大学医学院神经内科 | 神经科学方向 |
| Joseph Culver | 华盛顿大学影像科学项目与放射学系 | 成像系统负责人 |
Culver 实验室长期做宽场光学成像,小鼠信息表里的系统名称写作 WashU, Culver, OIS2,即该实验室的第二代光学成像系统。这意味着数据来自一台有延续性的自建设备,而不是商用整机——好处是参数可控、处理链条清楚,坏处是没有第二台设备的数据可以做跨设备对照。
3.2 时间线
| 时间 | 事件 |
|---|---|
| 2019-11-14 | 第一只动物 Ms1 完成采集 |
| 2020-09-10 | 最后一只动物 Ms12 完成采集 |
| 2021-08-08 | README 与脑图谱文件定型 |
| 2021-09-20 | PhysioNet 发布 1.0.0 首版 |
| 2022-01 | 关联论文发表于 Journal of Neuroscience Methods 第 366 卷 |
| 2022-03-17 | 发布 1.0.1,补入论文引用、更新作者名单 |
| 2022-03-22 | 校验清单文件更新 |
从采集结束到公开发布隔了一年,从首版到修订隔了半年。修订内容只有两条:加入原始论文的引用、更新作者列表。数据本体在两个版本之间没有变化,这一点在版本说明里写得很明确,也因此可以放心地引用任一版本号而不必担心内容差异。
3.3 实验条件:把光学与电生理接在同一只动物身上
官方方法段给出的流程可以拆成八个环节,每一环都对应一条使用边界:
| 环节 | 官方描述 | 对使用者的含义 |
|---|---|---|
| 头部准备 | 亚克力头帽配半透明粘接剂固定于颅骨,保留完整颅骨 | 不磨薄颅骨,信号穿过骨与脑膜,散射较强 |
| 电极植入 | 脑电与肌电电极同期植入 | 电生理信号存在,但未随数据集发布 |
| 恢复期 | 术后两周 | 排除了急性手术效应,也排除了早期炎症期 |
| 记录姿态 | 置于黑色绒布袋中,头部锁定 | 非自由活动,运动伪迹主要来自呼吸与微动 |
| 照明 | 四路发光二极管,454、523、595、640 纳米 | 一路激发钙指示剂,三路采血氧信息 |
| 相机 | 电磁耦合相机,16.81 Hz | 帧率由设备读出决定,重采样才会改变它 |
| 记录窗口 | 上午九点至下午一点 | 对应小鼠睡眠主期,最大化睡眠比例 |
| 饲养节律 | 十二小时明暗循环,早六点开灯,自由取食饮水 | 昼夜节律背景统一,无跨时区差异 |
四路灯的组合值得单独说一句。454 纳米是 GCaMP6f 的激发波长,另外三路并不直接报告神经活动,它们采的是血红蛋白的吸收变化。皮层荧光穿过血管时会带上血容量与血氧的调制,若不扣除,慢波睡眠期间的血流变化会被误读成神经活动。官方把这一组照明明确写成「用于超光谱血氧成像」,说明处理链条里包含了把钙信号与血流信号分离的步骤。
3.4 数据来源的三个层次
这份数据在来源上可以分三层,混用会导致引用错误:
| 层次 | 内容 | 是否随数据集发布 |
|---|---|---|
| 原始采集 | 16.81 Hz 的相机帧、脑电、肌电 | 仅发布处理后的图像;脑电肌电未发布 |
| 处理后图像 | 配准、去趋势、平滑、回归之后的分格图像 | 发布 |
| 标注 | 十秒一格的睡眠状态标签 | 发布 |
第二层与第三层之间还有一次人工判读:判读人员看的是脑电与肌电波形,而不是图像。也就是说,标签的判据完全独立于被标注的对象。这在方法学上是优点——避免了「用图像解释图像」的循环论证;在使用上是约束——你无法从发布的数据里重建判读过程,也无法复核争议格子。
脑电与肌电没有随数据集发布,这带来一个实际问题:想复现判读人员的判断、或者想研究「脑电与钙信号在状态转换时刻谁先变」,都做不到。数据里只有结论,没有得出结论的依据。
§4 它最独特的东西:把睡眠的时间刻度压进皮层的空间坐标
4.1 稀缺的不是钙成像,是「带睡眠标签的钙成像」
公开的小鼠钙成像数据不少,带行为标签的也不少,但同时具备三件事的很少:连续覆盖整片皮层、时长以小时计、每一段都有独立的电生理判读。多数钙成像研究关注的是分钟级的任务态,睡眠研究关注的是小时级的自发态,两者的采集设计天然冲突——任务态要求动物清醒配合,睡眠态要求动物不受打扰。
这份数据选择了后者。三小时、无干扰、头部固定、上午时段,全部设计都指向一个目标:让动物自然地进入并退出各个睡眠阶段。官方在方法段直言,选择九点到十三点这个窗口就是为了最大化睡眠的概率。这是很实用的取舍,也意味着数据里清醒样本的比例天然偏低——不过具体比例官方没有公布。
4.2 三层信号叠在同一段影像上
一帧 128×128 的图像里其实叠着三样东西,理解它们的叠加方式,才能理解预处理为什么要做那么多步:
| 成分 | 时间尺度 | 空间表现 | 处理方式 |
|---|---|---|---|
| 神经活动相关的荧光 | 亚秒到数秒 | 局部的、分区的 | 保留,这是目标信号 |
| 血红蛋白吸收变化 | 数秒到数十秒 | 沿血管走行,全局 | 用多波长回归扣除 |
| 缓慢漂移与运动伪迹 | 数十秒到整段 | 全视野一致 | 去趋势与配准 |
三者的时间尺度有重叠,所以分离不可能完美。官方说预处理包含配准、去趋势、平滑与回归,并且明确「未施加额外的数字滤波」。这句话的含义是:最终发布的图像仍然保留着宽频成分,包括未被完全扣除的血流调制。做频段分析时要意识到,你看到的低频功率里有一部分不是神经源的。
4.3 案例:Ms1 的一段 fc 文件与它的 n
拿 Ms1 的第一段记录走一遍真实流程,能把这套结构里最容易出错的地方暴露出来。官方 README 以 fc1 到 fc12 举例说明段序,Ms1 目录下的文件也确实是从 fc1 排到 fc12。
第一步,读文件。data 的形状是四维,前三维修饰图像,最后一维是格。很多人第一次读会下意识地把它当成 128×128 的 168 通道视频,然后在时间轴上按帧切分,结果得到 168 倍的样本膨胀。
第二步,确认格数。这里的关键是 n 不是一个常数。官方明确写道,n 会浮动,因为并非所有记录都恰好三小时。如果把 1080 写死,遇到不足三小时的段就会在 reshape 时报错,或者更糟——在某些宽松的重排操作里静默错位。
第三步,对齐标签。scoringindex_file 的长度必须等于 data 的第四维,这是唯一可靠的自检。官方在数据描述里也是这么写的:两者共用同一个 n。
import scipy.io as sio
def load_segment(path):
m = sio.loadmat(path)
x = m['data']
y = m['scoringindex_file'].ravel()
if x.shape[3] != y.shape[0]:
raise ValueError('格数与标签长度不一致')
return x, y, m['xform_mask']
x, y, mask = load_segment('Ms1/Ms1-fc12.mat')
print(x.shape) #-- (128, 128, 168, n),n 由文件自身决定
print(len(y)) #-- 与上一行的第四维相同
print(sorted(set(y.tolist())))
第四步,把一段接成一只动物。按 fc 序号升序拼接时,不要假设相邻段之间没有空隙。官方说这些段按序号构成一次有序记录,但没有给出段间的时间戳,也没有说明切段是否严格连续。若要做状态转换统计,段边界应当视为潜在缺口,单独标记。
这个案例说明的事情很朴素:这份数据的结构简单到只有三个变量,但三个变量之间的约束关系(第四维等于标签长度、帧不是样本、段不等于连续)如果不先想清楚,后面每一步都会带错。
4.4 标注的粒度:一格一标签,帧无独立标签
十秒这个数字不是随便定的。它大致对应小鼠睡眠状态转换的时间尺度:非快速眼动到清醒的转换通常在数秒内完成,十秒的窗口能把大部分稳定期包住,同时又不至于把转换期切得太碎。代价是转换时刻被抹平——一格之内可能前半段还在慢波、后半段已经觉醒,但标签只能填一个。
| 粒度 | 能回答的问题 | 不能回答的问题 |
|---|---|---|
| 十秒格 | 某状态占比、状态停留时长、状态序列 | 状态转换的精确时刻 |
| 格内帧 | 状态内的动力学、慢波传播方向 | 帧属于哪个状态(帧没有独立标签) |
| 段 | 一次会话的整体结构 | 段内的连续时间(段间可能缺口) |
| 动物 | 个体差异(仅十二例) | 群体统计(样本量不足) |
从建模角度看,最稳妥的用法是把一格当成一个样本:输入是 168 帧的图像序列,输出是四类之一。这样标签与样本严格对应,不存在泄漏。若一定要做帧级任务,比如预测「下一秒是否会转换」,就必须自己从格标签构造弱监督目标,并明确写出构造规则。
4.5 边界条件:什么时候它不再适用
第一条,需要皮层下结构时。宽场成像看到的是皮层表面的二维投影,基底前脑、丘脑、脑干这些睡眠调控的核心核团全在视野之外。想研究睡眠的开关机制,这份数据只能提供下游的相关性。
第二条,需要单细胞分辨时。128×128 像素覆盖整片皮层,单像素的物理尺寸对应相当大的一片组织。细胞分割在这里没有意义,因为图像本身没有细胞级对比度。
第三条,需要自由活动行为时。头固定是采集的前提,不是可选项。任何与体位、运动、探究相关的假设都无法在这里检验。
第四条,需要跨实验室验证时。十二只动物全部来自同一台自建系统、同一套手术流程、同一批判读人员。它不能用来评估方法在不同实验室间的稳健性,只能评估在同一实验室内的可复现性。
§5 怎么拿到:从目录树到可训练张量
5.1 下载面:一个站点、三条路
官方在文件页同时给出三条下载路径,成本差别很大:
| 方式 | 命令形态 | 适合场景 | 注意事项 |
|---|---|---|---|
| 网页逐目录 | 浏览器点开每个文件夹 | 只想拿辅助文件或抽样一两段 | 两百多 GB 不适合手工点 |
| 递归抓取 | wget 递归下载 | 需要全量或某一批 | 断点续传要加参数 |
| 对象存储同步 | aws s3 sync 免签名 | 需要全量、要快 | 需装命令行工具,走免请求签名 |
三条路拿到的是同一批文件。对象存储那条通常最快,因为它绕过了网页服务的单连接限制;递归抓取那条最灵活,可以先按目录前缀只拉某几只动物。
#-- 只取辅助文件:先看清结构再决定下多少
BASE=https://physionet.org/files/calcium-imaging-sleep-state/1.0.1
curl -sL "$BASE/mouse_info.csv" -o mouse_info.csv
curl -sL "$BASE/atlas.mat" -o atlas.mat
curl -sL "$BASE/README.txt" -o README.txt
curl -sL "$BASE/SHA256SUMS.txt" -o SHA256SUMS.txt
#-- 只拉一只动物的全部分段(其余动物暂不下载)
wget -r -N -c -np -nH --cut-dirs=3 \
"$BASE/Ms1/" -P ./data
--cut-dirs 的数值决定落地目录的层级,写错会把整条 URL 路径原样铺在本地。下载完成后先跑一次校验,官方提供了全量校验清单,文件级损坏在两百多 GB 的体量里并不罕见。
#-- 校验已下载文件,逐条比对官方清单
sha256sum -c SHA256SUMS.txt 2>&1 | grep -v ': OK$'
5.2 读取:先看形状,再看类型
MAT 文件有两种常见存储布局,一种是老式的变量容器,一种是较新的层次结构。官方没有标注用的是哪一种,所以第一行代码应当先探形状而不是直接取变量:
import scipy.io as sio
import numpy as np
m = sio.loadmat('data/Ms1/Ms1-fc1.mat')
print(sorted(k for k in m if not k.startswith('__')))
x = m['data']
print(x.shape, x.dtype, float(np.nanmin(x)), float(np.nanmax(x)))
若这一步抛出 NotImplementedError 或提示未知的 MAT 版本,说明文件是较新的层次结构布局,需要改用另一个库读取:
import h5py
with h5py.File('data/Ms1/Ms1-fc1.mat', 'r') as f:
print(list(f.keys()))
x = f['data'][:] #-- 同样先确认 shape 再决定是否整段载入
print(x.shape, x.dtype)
数值范围也值得看一眼。官方没有说明预处理是否包含归一化,量纲可能是相机计数,也可能是百分比变化,两种情况下后续的阈值完全不同。若看到极端值,多半落在掩膜外的区域或饱和像素上,先按 xform_mask 切掉再统计。
5.3 内存:按格切块最稳妥
按 §2.6 的推算,单格约二百七十五万个元素,单精度下约十一兆字节,双精度下约二十二兆字节。这个量级意味着:整段载入通常可行,整只动物载入在内存宽裕的机器上也可行,全库载入不可行。
| 载入范围 | 元素数量级 | 单精度内存 | 建议 |
|---|---|---|---|
| 一格 | 百万级 | 十几兆 | 随便读 |
| 一段 | 亿级 | 数百兆到数 GB | 先看 n 再决定 |
| 一只动物 | 十亿级 | 十几 GB | 内存够就整只读 |
| 全部十二只 | 百亿级 | 上百 GB | 必须分块 |
分块读取的正确姿势不是按帧切,而是按格切——因为标签是格级的,按格切能保证每一块都有完整标签。下面这段把一段记录压成格级特征,是后续建模最常见的入口:
import numpy as np
def epoch_features(x, mask, y):
#-- x: (128,128,168,n) y: (n,) mask: (128,128) 0/1
keep = mask.astype(bool)
feats, labels = [], []
for k in range(x.shape[3]):
vol = x[:, :, :, k][keep, :] #-- 只保留脑组织像素
if vol.size == 0:
continue
mu = vol.mean(axis=0) #-- 每帧全脑均值
feats.append([mu.mean(), mu.std(), np.abs(np.diff(mu)).mean()])
labels.append(int(y[k]))
return np.asarray(feats, dtype='float32'), np.asarray(labels)
三个特征分别是全脑均值的水平、波动幅度与逐帧变化率。它们不是好特征,但足以跑通流程,也能立刻暴露标签与图像是否错位——若某个标签的特征分布与其余三类完全重合,多半是掩膜取错或格序反了。§4.3 的案例里那张四列表就是这段代码的极简版,差别只在多记了动物编号。
5.4 分区:用图谱把像素变成脑区时间序列
atlas.mat 里的图谱与图像同坐标系,把编号当成掩膜逐区取均值,就能把像素序列压成分区时间序列。这一步是本数据集相对同类资源最有用的加成:
import scipy.io as sio
import numpy as np
at = sio.loadmat('atlas.mat')
seed = at['AtlasSeed']
names = [str(n[0]) if isinstance(n, np.ndarray) else str(n) for n in at['parcelnames'].ravel()]
m = sio.loadmat('data/Ms1/Ms1-fc1.mat')
x, mask = m['data'], m['xform_mask'].astype(bool)
ids = np.unique(seed[mask])
for pid in ids[:3]: #-- 先看前三个分区
sel = (seed == pid) & mask
ts = x[sel, :, :].mean(axis=0).mean(axis=0) #-- 分区均值随格变化
print(int(pid), ts.shape)
这段代码会打印出分区编号与对应的格序列长度。分区名称与编号的对应关系通过 parcelnames 取得,两边的索引要一致;若名称列表长度与编号数量对不上,需要先逐项核对再取名,否则整张表的脑区名会错位一格。
5.5 划分:按动物分,不按段分,更不按格分
这是全文最重要的一条工程纪律。同一只动物的所有段来自同一次会话,血管形态、头帽位置、电极阻抗全都相同,模型很容易靠这些与睡眠无关的静态特征认出个体。按格随机划分会把同一只动物同时放进训练与测试,指标虚高得离谱。
| 划分方式 | 泄漏程度 | 结果可信度 | 适用场景 |
|---|---|---|---|
| 按格随机 | 极高 | 不可用 | 无 |
| 按段随机 | 高 | 偏低 | 不推荐 |
| 按动物划分 | 无 | 可信 | 标准做法 |
| 留一只动物 | 无 | 可信但方差大 | 小样本评估 |
十二只动物做留一交叉验证,每折训练十一只、测试一只,是最稳妥的方案。若一定要固定划分,用八只训练、四只测试,并在论文里写明是哪几只——因为个体差异大到换一组动物结论可能就变。
import re, glob
files = sorted(glob.glob('data/Ms*/*.mat'))
mice = sorted({re.search(r'(Ms\d+)', p).group(1) for p in files})
train_ids = set(mice[:8])
print('训练', sorted(train_ids), '测试', sorted(set(mice) - train_ids))
5.6 五个最容易出错的地方
| 坑 | 表现 | 正确做法 |
|---|---|---|
| 把帧当样本 | 样本量虚增上百倍,验证集几乎全是同一格的相邻帧 | 以格为样本,168 帧作为序列输入 |
| 把 n 写死 | 遇到不足三小时的段直接报错或静默错位 | 从标签向量长度取 n |
| 忘记剔除伪迹 | 四分类当成三分类,损失函数里出现未定义类别 | 先统计伪迹占比再决定剔除还是单列 |
| 先切分再预处理 | 归一化统计量跨动物泄漏 | 预处理参数只在训练集上拟合 |
| 忽略掩膜 | 视野边缘的非脑组织参与均值,信噪比骤降 | 一切统计先乘 xform_mask |
第三项需要多说一句。伪迹格的占比官方没有公布,但它的存在意味着「三分类」这个说法在实现层面要打一个折扣:码表给了四个值,摘要只提三种状态。合理的处理是先把它当第四类统计,若占比很低再合并或剔除,并在方法里写明选择了哪一种。
§6 与库内条目的关系
6.1 关系图谱
库内的睡眠资源几乎全是人类的、电生理的、以整夜为单位的;本库是唯一一个动物来源、光学模态、以皮层空间为核心的睡眠数据。把它放进两个轴里,位置就很清楚:横轴是物种,纵轴是模态。
| 资源 | 物种 | 模态 | 与本库的关系 |
|---|---|---|---|
| Sleep-EDF | 人 | 多导睡眠图,少量通道 | 同任务不同物种:分期规则同源,信号不同源 |
| ISRUC-Sleep | 人 | 多导睡眠图 | 同上,且有人群分层信息 |
| MASS | 人 | 多导睡眠图 | 同上,规模大得多 |
| SHHS | 人 | 居家多导睡眠图 | 同上,偏老年人群 |
| MrOS Sleep | 人 | 居家多导睡眠图 | 同上,老年男性 |
| MESA Sleep | 人 | 居家多导睡眠图 | 同上,多民族队列 |
| CinC 2018 睡眠觉醒 | 人 | 多导睡眠图 | 任务更细:微觉醒检测 |
| HMC Sleep Staging | 人 | 可穿戴单通道 | 模态最远:从体动与心率推分期 |
| TUH EEG | 人 | 头皮脑电 | 同为电生理,但无睡眠标签体系 |
| CHB-MIT 头皮脑电 | 人 | 头皮脑电 | 癫痫方向,与睡眠无直接关系 |
| Allen 脑图谱 | 小鼠 | 三维解剖图谱 | 结构参照:分区命名的来源之一 |
| BICCN | 小鼠 | 单细胞与图谱 | 细胞级参照:本库给不了这一层 |
| AI4Life 钙成像去噪 | 细胞(体外制备) | 荧光显微图像 | 同为钙成像,但层级与任务完全不同 |
最后一行值得单独说明。库内另一份带「钙成像」字样的资源是去噪挑战赛,对象是细胞级荧光显微图像,任务是恢复被噪声污染的图像;本库的对象是整片皮层的介观投影,任务是睡眠分期。两者共享的只有「钙指示剂」这一个词,从像素含义到任务目标都不同。把两者混为一谈,是检索时最容易犯的错。
6.2 检索路径
| 你要找的东西 | 检索词 | 会落到哪里 |
|---|---|---|
| 人类睡眠分期的对照 | 睡眠分期、多导睡眠图、PSG | §6.1 前七行 |
| 动物睡眠数据 | 小鼠、动物模型、啮齿类 | 本库与脑图谱类资源 |
| 光学成像与睡眠的交叉 | 钙成像、宽场、介观 | 本库 |
| 单细胞层面的钙活动 | 双光子、显微成像、细胞分割 | 与 §6.1 末行区分 |
| 脑区分区命名 | Paxinos、脑图谱、分区 | Allen 图谱与 atlas.mat |
| 睡眠标签体系 | 清醒、非快速眼动、快速眼动 | §2.2 码表 |
6.3 与其他资源的分工判据
选数据时最实际的问题不是哪个更好,而是哪个负责哪一段:
| 任务 | 主力应该用什么 | 本库的位置 | 原因 |
|---|---|---|---|
| 人类睡眠分期的产品化 | 人类多导睡眠图库 | 不参与 | 物种与记录条件都不同 |
| 睡眠分期的跨物种验证 | 人类库加本库 | 主力之一 | 少见的同时具备影像与标签的动物数据 |
| 皮层空间模式研究 | 本库 | 主力 | 连续视野加图谱 |
| 单细胞机制研究 | 单细胞钙成像库 | 不适用 | 无细胞分辨 |
| 睡眠调控核团研究 | 在体电生理或深部成像 | 不适用 | 只有皮层表面 |
| 预处理算法评估 | 原始帧数据 | 有限 | 发布的是已处理图像 |
| 教学演示 | 本库 | 好选择 | 结构简单,三个变量讲得清 |
前三行是它真正的岗位。越过第三行往下,多数任务它只能提供背景或对照,不能当主粮。
§7 质量评估与局限性
7.0 阅读本节前的一个前置校正
评估这份数据之前,要先拆掉一个默认的误判:把「十二只动物」直接翻译成「样本量不足,质量差」。这两件事在别的领域或许等价,在这里不等价。睡眠的皮层成像属于那种采集成本极高、单条记录信息极密的数据:一只动物三小时、每十秒一个标签、每个标签下 168 帧图像,一次成功记录背后的手术、恢复、判读时间以周计。用「行数」去衡量它,等于用页数衡量一部字典。
真正该问的是另一个问题:在「带睡眠标签的皮层宽场影像」这个格子里,它是不是够用?答案取决于你要做的是组间比较还是方法验证。做组间比较,十二只太少;做方法验证,十二只足以暴露一个方法是否真的学到了状态相关的空间模式,而不是记住了血管走向。
这个校正会改变下面五维评分的读法。规模一项它拿不到分,但任务唯一性接近满分,两者相加才是它的真实位置。
7.1 五维评分
按 DAIMS 的常用维度打分,每项一到五分,分数针对「作为睡眠与光学成像交叉研究的数据」这个用途:
| 维度 | 分数 | 理由 |
|---|---|---|
| 数据规模 | 2 | 十二只动物、单次会话,无法支撑群体统计 |
| 标注质量 | 4 | 独立模态人工判读,粒度明确;但无一致性指标 |
| 任务适配 | 4 | 影像与标签严格对齐,皮层空间连续,同类替代品少 |
| 文档完整 | 3 | 变量与码表写得清楚,但元数据仅四列,判读规则未公开 |
| 可获取性 | 3 | 免注册、许可宽松,但全量两百多 GB,下载与存储成本高 |
五项合计十六分,满分二十五。这个分布说明它不是全能型资源:规模与文档拖后腿,标注与适配撑住基本盘。特别要说明文档一项为什么只给三分——官方把「有什么变量」写得非常清楚,但对「怎么判读」「伪迹怎么定义」「段与段是否连续」全部略过,这几项恰好是复现时最需要的。
7.2 标注质量的两层
第一层是判据独立性。标签不是从图像里读出来的,而是判读人员看脑电与肌电得出的。这避免了循环论证:如果标签也从钙信号推,那么「用钙信号预测标签」就变成了自证。独立模态做金标准,是这份数据在方法学上最扎实的一点。
第二层是一致性与可复核性。官方说由睡眠判读专家人工标注,但没有给出判读人员人数、没有给出两人之间的同意率、没有给出争议格的处理规则,脑电与肌电也没有发布。这意味着标签的可靠性只能整体接受,无法局部复核。
| 维度 | 已知 | 未知 |
|---|---|---|
| 判据 | 脑电与肌电,人工判读 | 具体频段阈值与判读细则 |
| 判读人员 | 睡眠判读专家 | 人数、资历、是否盲法 |
| 一致性 | 未提及 | 判读人员间同意率 |
| 争议处理 | 未提及 | 分歧如何裁决 |
| 原始信号 | 采集时同步记录 | 未随数据集发布 |
| 粒度 | 十秒一格 | 格内是否存在混合状态 |
这份表右列全是空白,这不代表数据有问题,只代表它的文档停留在「够用」而非「可复现」的层级。做严谨的方法学比较时,这一点要在局限性里写明。
7.3 已知的、可枚举的偏差
| 偏差 | 表现 | 影响 |
|---|---|---|
| 物种偏差 | 全部为小鼠 | 结论不能外推到人类睡眠结构 |
| 品系与表达偏差 | 单一转基因品系,兴奋性神经元表达钙指示剂 | 抑制性神经元、胶质细胞的活动不在信号里 |
| 姿态偏差 | 头部固定于绒布袋 | 缺失自由活动下的睡眠姿态与运动 |
| 时段偏差 | 固定上午九点到十三点 | 只覆盖睡眠主期,夜间活动期样本少 |
| 设备偏差 | 单一自建系统,单一帧率 | 无法评估跨设备稳健性 |
| 批次偏差 | 十个月内十二次采集,中间有四个月空档 | 无跨季节、跨年份对照 |
| 视野偏差 | 皮层表面二维投影 | 皮层下与深部结构完全缺失 |
| 判读偏差 | 单一判读人员群体,规则未公开 | 标签口径不可复核 |
| 类别不平衡 | 清醒样本比例官方未公布,设计上偏向睡眠 | 分类器可能偏向多数类 |
最后一行需要使用者自己先算一遍再建模。官方为了最大化睡眠概率,把记录窗口压在睡眠主期,这几乎必然导致清醒格偏少。若直接训练三分类或四分类模型,多数类主导是大概率事件,报告指标时应当同时给出每类的召回率而不是只给总体准确率。§4.3 的案例之所以保留一张按动物、按格展开的长表,就是为了让这件事在建模之前就可见。
7.4 外部验证矩阵
| 验证类型 | 是否具备 | 说明 |
|---|---|---|
| 作者自评 | 有 | 官方称数据用于评估一套基于多重可见性图与深度学习的自动分期方法 |
| 第三方复现 | 官方未公布 | 页面未列出复现研究或基准榜单 |
| 挑战赛基准 | 无 | 未被任何挑战赛采用为官方数据 |
| 社区使用度 | 低到中 | 官方页面显示当前版本浏览两百七十余次,全部版本两百八十余次 |
| 版本稳定性 | 好 | 1.0.1 仅改引用与作者,数据本体未动 |
| 许可清晰度 | 好 | 许可全文随数据发布,为知识共享署名 4.0 |
浏览数这个指标容易被过度解读。两百多次浏览说明它没有被广泛使用,但也不等于无人问津——PhysioNet 上大量专业数据集都停在这个量级,因为目标用户本来就窄。真正能说明问题的是缺少第三方复现:一份 2021 年发布的数据,四年内没有公开的独立基准,意味着它的「金标准」地位还没有被社区检验过。
7.5 它为何能持续:占着一个没人愿意重拍的格子
这类数据的供给逻辑与临床数据相反。临床数据是诊疗的副产品,医院每天都在产生,整理一份公开出去边际成本不高;而头固定、双模态、逐格人工判读的小鼠睡眠成像是纯粹为研究目的定制的实验,做完一次要花掉数周,产出的却是十几个 GB 的像素。没有人会为了「把数据做得更大」重复这件事。
于是它长期停在「唯一」而不是「最好」的位置上。稀缺性来自采集成本,不来自设计精巧。这也解释了为什么它的文档停在够用层级、为什么四年没有扩版——维护一份这样的数据没有规模效应,作者的动力在论文发表那一刻就基本释放完了。想用它的人应当接受这个前提:它不会变好,也不会消失。
§8 生态位与历史
8.1 一条从成像到睡眠的支线
Culver 实验室的主线是宽场光学成像本身:如何用多波长照明分离神经活动与血流、如何在小鼠颅骨外做长期稳定的记录、如何把这套方法做成可复用的处理工具箱。睡眠是这条主线上的一个应用问题,而不是反过来。
这个出身解释了数据集的若干特征。四路照明被写进方法段而不是当成设备细节,因为那是实验室的核心技术;预处理交给自研的 MATLAB 工具箱而不是通用软件,因为工具箱本身是成果;帧率是 16.81 Hz 这样一个非整数,因为那是相机在特定读出模式下的实际速率,没有为了好看重采样到整数。所有选择都指向「把方法论文写扎实」,而不是「把数据做成产品」。
| 阶段 | 时间 | 状态 |
|---|---|---|
| 方法积累 | 2016 年前后 | 多波长分离血流与神经活动的框架见诸文献,为其参考文献 1 至 3 |
| 数据采集 | 2019 年末至 2020 年秋 | 十二只动物分批记录 |
| 论文投稿 | 2021 年 | 自动分期方法进入评审 |
| 数据首发 | 2021-09-20 | PhysioNet 1.0.0 |
| 论文见刊 | 2022-01 | Journal of Neuroscience Methods 第 366 卷 |
| 数据修订 | 2022-03-17 | 1.0.1,补引用 |
| 此后 | 无新版 | 数据本体未变 |
8.2 数据、论文、代码三件套
三者构成一个闭环:论文提出方法,数据提供评测,代码仓库复现方法。官方页面在数据集条目下直接给出了代码仓库地址,仓库名为 MVG-CNN,对应论文标题里的多重可见性图与卷积网络。
| 组成 | 位置 | 作用 |
|---|---|---|
| 数据 | PhysioNet 项目页 | 提供图像与标签 |
| 论文 | Journal of Neuroscience Methods 366:109421 | 说明方法与评测设计 |
| 代码 | github.com/comp-imaging-sci/MVG-CNN | 复现分类流程 |
| 工具链 | 自研 MATLAB 处理工具箱 | 图像预处理 |
对使用者的实际意义是:想复现论文结果,三件套缺一不可;想只用数据做自己的方法,论文与代码可以用来对照基线,但要注意论文的划分方式是否与你的划分一致——如果论文按格随机划分,那么它报告的高准确率不能作为你按动物划分时的参照线。
8.3 生态位:跨界的那一格
把它放到整个开放数据的版图里,它占的是「神经科学 × 睡眠 × 光学成像」三者的交集,而这个交集非常小:
| 区域 | 典型资源 | 本库是否在内 |
|---|---|---|
| 人类睡眠电生理 | 多导睡眠图系列 | 否 |
| 动物电生理 | 在体多通道记录 | 否 |
| 动物光学成像 | 双光子、微型显微镜 | 部分:是光学,但不是细胞级 |
| 睡眠的遗传与分子机制 | 果蝇与小鼠遗传学数据 | 否 |
| 睡眠的皮层空间动力学 | 极少 | 是,几乎是唯一 |
| 睡眠的自动分期基准 | 人类多导睡眠图为主 | 是,作为跨模态补充 |
最后一格是它最现实的入口。做自动分期的人手里通常有一堆人类数据,缺一个「换物种、换模态之后方法还成不成立」的测试点。这个测试点不需要大,只需要标签可靠、结构清楚,恰好是它的强项。
8.4 谁在用它,用在哪里
官方没有列出使用者名单,但从数据的形状可以推断,潜在使用者大致分五类,其中三类能落到它身上:
| 使用者 | 典型诉求 | 本库能否满足 |
|---|---|---|
| 睡眠分期算法开发者 | 跨模态、跨物种的外部测试 | 满足,但需自行处理伪迹类 |
| 光学成像方法学研究者 | 真实数据上的预处理与伪迹评估 | 部分满足,只发布处理后的图像 |
| 神经科学教学 | 讲清楚标签与影像的对应关系 | 满足,结构简单 |
| 睡眠机制研究者 | 皮层下核团与分子机制 | 不满足 |
| 临床睡眠医学 | 人类睡眠障碍 | 不满足 |
需要提醒的是第二类。方法学研究者往往想要原始帧来评估预处理本身,而这批数据发布的是已经过配准、去趋势、平滑与回归的图像。想研究预处理,得先联系作者索取中间产物;仅凭发布版本,只能评估预处理之后的下游。
§9 使用指引
9.1 三种角色的路径
| 角色 | 第一天 | 第一周 | 注意事项 |
|---|---|---|---|
| 算法研究者 | 下载辅助文件与一只动物,跑通 §5.2 的读取 | 建立按动物划分的基线,报告每类召回率 | 先处理伪迹类再谈三分类 |
| 成像方法研究者 | 读方法段的预处理链条 | 评估残余血流调制对低频功率的影响 | 发布版已处理,原始帧需另索取 |
| 教学与科普 | 用 §4.3 的案例讲格与帧的关系 | 做一张状态与空间模式的对照图 | 强调像素不是神经元 |
9.2 一条最短的可用流程
从零到能训练,最短的路径是五步。前两步拿数据,第三步建索引,第四步压特征,第五步按动物划分。
#-- 1. 建目录并取辅助文件
mkdir -p data && cd data
BASE=https://physionet.org/files/calcium-imaging-sleep-state/1.0.1
curl -sL "$BASE/mouse_info.csv" -o mouse_info.csv
curl -sL "$BASE/atlas.mat" -o atlas.mat
#-- 2. 只拉两只动物做原型(先小后大)
for m in Ms1 Ms2; do
wget -q -r -N -c -np -nH --cut-dirs=3 "$BASE/$m/" -P .
done
import glob, re, numpy as np, scipy.io as sio
rows = []
for p in sorted(glob.glob('data/Ms*/*.mat')):
mid = re.search(r'(Ms\d+)', p).group(1)
m = sio.loadmat(p)
x, y = m['data'], m['scoringindex_file'].ravel()
keep = m['xform_mask'].astype(bool)
for k in range(x.shape[3]):
rows.append((mid, k, int(y[k]), float(x[:, :, :, k][keep, :].mean())))
print(len(rows), '格')
print('动物', sorted({r[0] for r in rows}))
print('标签', sorted({r[2] for r in rows}))
这段代码产出的是一张「动物、格序、标签、全脑均值」的四列表。它本身不足以建模,但能立刻回答三个前置问题:每只动物有多少格、标签集合里到底有没有伪迹、全脑均值在四类之间有没有可见差异。这三个问题的答案决定了后面该走哪条路。它也是 §4.3 的案例的批量化版本:单个文件的手工核对换成对全部文件的遍历,判断逻辑没有变。
9.3 引用方式
| 引用对象 | 内容 |
|---|---|
| 数据集 | Wide-field calcium imaging sleep state database, version 1.0.1. PhysioNet. 2022. DOI 10.13026/prp1-2d11 |
| 原始论文 | Zhang 等,Automated sleep state classification of wide-field calcium imaging data via multiplex visibility graphs and deep learning,Journal of Neuroscience Methods 366:109421,2022 |
| 平台 | PhysioNet 平台综述,按官方页面引用按钮生成 |
| 许可 | 知识共享署名 4.0 国际版,需署名并注明是否修改 |
写论文时建议同时写明三件事:使用的版本号、是否剔除伪迹格、划分是按动物还是按格。第三项尤其重要,因为按格划分与按动物划分的结果不可比,别人无法从准确率数字反推划分方式。
§10 AI 使用声明
| 项目 | 声明 |
|---|---|
| 文本生成 | 本文由 AI 辅助撰写,结构、事实核对与取舍由编辑把关 |
| 数字来源 | 规模、结构、边界三类数字取自 PhysioNet 官方页面、README、README 同级的许可与信息表 |
| 文件核验 | 项目页、文件目录、README、许可、小鼠信息表、单只动物目录清单经直接访问确认 |
| 未下载内容 | 未下载任何 MAT 数据文件,图像内容与标签占比均未统计 |
| 论文信息 | 仅依据官方页面给出的题录与 DOI,未读全文;摘要服务当时不可用 |
| 推算内容 | 每格秒数、格数、内存量级均由官方给定数字推算,文中已标注 |
| 图像 | 无配图;封面为生成式提示词,不含真实影像 |
| 免责 | 本文不构成任何临床或实验建议;使用须遵守署名 4.0 许可条款 |
常见误读(避坑清单)
| 说法 | 实际 | 证据 |
|---|---|---|
| 「这是单细胞钙成像」 | 宽场介观成像,128×128 像素覆盖整片皮层 | 官方摘要与数据描述均写 wide-field;无细胞分割产物 |
| 「它只做了一个脑区」 | 视野覆盖整个皮层表面 | 官方背景段写 across the entire cortex |
| 「共三种状态标签」 | 码表四个值,含伪迹 | README 与数据描述均为 0/1/2/3 |
| 「每只恰好三小时」 | 约三小时,格数浮动 | 官方写 n may vary,并非都满三小时 |
| 「钙信号就是神经元放电」 | 是群体荧光,混有血流调制 | 方法段列出四波长血氧成像与回归步骤 |
| 「脑电肌电也在包里」 | 未发布,仅用于人工判读 | 数据描述只列三个变量 |
| 「十二只就是十二个样本,太少不能用」 | 方法验证够用,群体统计不够 | 每只三小时、十秒一格,信息密度高 |
| 「可以直接按格随机划分」 | 同一动物的格高度相关 | 同段同动物共享血管与头帽位置 |
| 「帧是独立样本」 | 168 帧共享一个标签 | 数据结构为 128×128×168×n |
| 「有原始视频可做预处理研究」 | 发布的是处理后的图像 | 方法段列出配准、去趋势、平滑、回归 |
FAQ
Q1:这是不是单细胞钙成像,能不能分析单个神经元?
不是。官方称宽场钙成像,视野 128×128 像素覆盖整片皮层,属于介观尺度。一个像素对应成百上千个神经元的活动总和,数据集里没有细胞轮廓,也没有单细胞荧光轨迹。想要单细胞数据应改用双光子或头戴式微型显微镜资源。
Q2:为什么码表里有伪迹类,摘要却只说三种状态?
官方存在两个口径。摘要与方法段说每格标为清醒、非快速眼动、快速眼动;数据描述与 README 给的码表是四个值,第三位是伪迹。两者都出自官方,差额的构成官方未说明。用之前要自己决定伪迹格是剔除还是单列。
Q3:每只动物是不是都恰好三小时?
官方写的是约三小时,并明确格数会浮动。读取时必须从标签向量长度取 n,不能把一千零八十写死。写死之后遇到短段会在重排时静默错位,比直接报错更难查。
Q4:体量多大,普通工作站能处理吗?
全量未压缩两百多 GB。单格约二百七十五万个元素,单精度下十几兆;单只动物全量十几 GB,可以整只载入;全库一次性载入不现实。建议按文件分块,或先降到分钟级再建模。
Q5:许可允许商用吗?
许可全文随数据发布,为知识共享署名 4.0 国际版,允许商用与二次分发,条件是署名并注明是否修改。引用时写清名称、版本号与 DOI。
Q6:能不能拿它训练人类睡眠分期模型?
不建议直接迁移。物种、记录条件、标签颗粒度三重不同:小鼠的睡眠是多相短周期,人类是单相长周期;这里是头固定的光学记录,人类是多导睡眠图;这里的非快速眼动不分期,人类的 N1 到 N3 是分开的。
Q7:为什么帧率是 16.81 Hz 这种奇怪的值?
这是相机在特定读出模式下的实际速率,官方没有重采样到整数。它带来一个副作用:每格 168 帧实际覆盖约 9.99 秒而非整十秒,长时间对齐会累积几秒误差。官方未说明这个余量如何处理。
Q8:标签可靠吗?
判据是独立的——判读人员看脑电与肌电,不看钙图像,避免了循环论证。但官方没有公布判读人员人数、一致性与争议处理规则,脑电肌电也未发布,所以标签只能整体接受,无法局部复核。
Q9:脑电与肌电数据在哪里?
没有随数据集发布。官方只说明记录时同步采集、并用于人工判读。想研究两种模态的时序关系,必须联系作者。
Q10:能用来做睡眠状态转换的预测吗?
只能做十秒粒度的弱监督版本。标签是格级的,转换发生的精确时刻被抹平在一个格里。若要做秒级预测,需要自建目标,并在方法里写清构造规则。
Q11:为什么只有十二只动物,官方没有扩版计划吗?
官方没有给出扩版说明。从采集方式看,头固定、双模态、逐格人工判读的成本极高,这类数据很难靠追加采集扩张,更像是现实约束而不是计划中断。
Q12:它和库内另一份钙成像数据有什么区别?
库内另一份是细胞级荧光图像的去噪挑战,对象是显微图像,任务是恢复图像;本库是整片皮层的介观投影,任务是睡眠分期。两者只有「钙指示剂」这一个共同点。
术语表
| 术语 | 解释 |
|---|---|
| 宽场钙成像 | 用大面积照明与相机一次拍下整片皮层的荧光,非逐点扫描 |
| GCaMP6f | 基因编码钙指示剂的一个快速变体,神经元去极化时变亮 |
| 转基因小鼠 | 通过遗传修饰稳定表达钙指示剂的品系 |
| 兴奋性神经元 | 释放兴奋性递质的神经元,本数据集的指示剂只在其中表达 |
| 介观成像 | 介于细胞与整脑之间的尺度,能看分区但看不清单细胞 |
| 非快速眼动睡眠 | 脑电以慢波为主、肌电下降的睡眠阶段 |
| 快速眼动睡眠 | 脑电近似清醒、肌电近乎消失、伴眼动的睡眠阶段 |
| 伪迹 | 由运动、光照或电极干扰造成、不代表真实生理状态的片段 |
| 时间格 | 十秒一段的分析单元,每格一个标签 |
| 帧 | 相机单次曝光得到的 128×128 图像 |
| 帧率 | 每秒成像帧数,本数据集为 16.81 |
| 脑组织掩膜 | 标出视野内哪些像素属于脑组织的二值矩阵 |
| Paxinos 图谱 | 小鼠脑立体定位坐标图谱,用于脑区命名与分区 |
| 分区 | 图谱划定的脑区单元,可对像素求均值得到分区时间序列 |
| 配准 | 把逐帧图像对齐,消除动物微动造成的位移 |
| 去趋势 | 扣除缓慢漂移,保留较快成分 |
| 回归 | 用已知成分(如血流信号)拟合并扣除,常用多波长信息 |
| 超光谱血氧成像 | 用多个波长估计血容量与血氧,用于从荧光中分离血流影响 |
| 电磁耦合相机 | 一种高灵敏度相机,适合弱光成像 |
| 头固定 | 把动物头部锁定在固定装置上,减少运动伪影 |
| 脑电 | 记录皮层电活动的电极信号 |
| 肌电 | 记录肌肉电活动的电极信号 |
| 判读 | 由人员依据规则给每格指定状态 |
| 知识共享署名 4.0 | 允许商用与改动的开放许可,要求署名 |
附录 A:核心数字核对表
| 项 | 值 | 来源 | 来源层级 |
|---|---|---|---|
| 动物数 | 12 | 官方摘要与方法段 | 官方页面 |
| 单次记录时长 | 约 3 小时 | 官方摘要 | 官方页面 |
| 成像视野 | 128×128 像素 | 官方数据描述与 README | 官方文件 |
| 每格帧数 | 168 | 官方数据描述与 README | 官方文件 |
| 帧率 | 16.81 Hz | 官方方法段与小鼠信息表 | 官方文件 |
| 标签粒度 | 10 秒 | 官方摘要 | 官方页面 |
| 标签码值 | 0、1、2、3 | README | 官方文件 |
| 照明波长 | 454、523、595、640 纳米 | 官方方法段 | 官方页面 |
| 记录窗口 | 上午 9 点至 13 点 | 官方方法段 | 官方页面 |
| 术后恢复 | 2 周 | 官方方法段 | 官方页面 |
| 数据总量 | 210.4 GB | 官方文件页 | 官方页面 |
| 采集起止 | 2019-11-14 至 2020-09-10 | 小鼠信息表 | 官方文件 |
| 采集系统 | WashU, Culver, OIS2 | 小鼠信息表 | 官方文件 |
| 许可 | 知识共享署名 4.0 | 许可文件 | 官方文件 |
| 首版日期 | 2021-09-20 | 版本列表 | 官方页面 |
| 修订日期 | 2022-03-17 | 版本列表 | 官方页面 |
| DOI | 10.13026/prp1-2d11 | 官方页面 | 官方页面 |
| 关联论文卷页 | 第 366 卷 109421 | 官方页面引用段 | 官方页面 |
附录 B:数字的来源分层
第一层,官方页面与官方文件。 动物数、时长、视野、帧数、帧率、标签码、照明波长、总量、采集日期、许可、版本与 DOI,全部来自项目主页、README、许可全文与小鼠信息表。这一层的数字可以直接引用。
第二层,由官方数字推算。 每格实际覆盖约 9.99 秒、三小时约一千零八十格、单格约二百七十五万个元素、单格十几兆到几十兆内存、单只动物十几 GB。这些在正文中都标注了推算性质,误差来源是时长浮动与存储精度未知。
第三层,未核实。 每只动物的实际段数与格数、四类标签的占比、伪迹的成因、判读人员人数与一致性、段与段之间是否存在时间缺口。这些需要下载全量数据或联系作者才能确定,正文中凡是涉及的地方均未给出具体数值。
附录 C:完整参考文献
| 编号 | 文献 | 链接 | 用途 |
|---|---|---|---|
| 1 | Wide-field calcium imaging sleep state database v1.0.1 | https://physionet.org/content/calcium-imaging-sleep-state/1.0.1/ | 全部规模、结构、边界信息的主来源 |
| 2 | 该库文件目录 | https://physionet.org/files/calcium-imaging-sleep-state/1.0.1/ | 目录结构、文件清单、总量 |
| 3 | README 文件 | 同上路径下 README.txt | 变量名、维度、标签码表 |
| 4 | 许可全文 | 同上路径下 LICENSE.txt | 许可类型与条款 |
| 5 | 小鼠信息表 | 同上路径下 mouse_info.csv | 采集日期、帧率、系统 |
| 6 | 原始论文 | https://doi.org/10.1016/j.jneumeth.2021.109421 | 方法背景与数据用途 |
| 7 | 配套代码仓库 | https://github.com/comp-imaging-sci/MVG-CNN | 方法复现 |
| 8 | 数据集 DOI | https://doi.org/10.13026/prp1-2d11 | 正式引用标识 |
附录 D:任务代码
任务:把一只动物压成格级特征表并做按动物划分的基线
import glob, re, numpy as np, scipy.io as sio
from collections import Counter
def build(mouse_glob):
table = []
for p in sorted(glob.glob(mouse_glob)):
mid = re.search(r'(Ms\d+)', p).group(1)
seg = int(re.search(r'fc(\d+)', p).group(1))
m = sio.loadmat(p)
x, y = m['data'], m['scoringindex_file'].ravel()
keep = m['xform_mask'].astype(bool)
for k in range(x.shape[3]):
vol = x[:, :, :, k][keep, :]
f = vol.mean(axis=0)
table.append(dict(mouse=mid, seg=seg, epoch=k, label=int(y[k]),
mean=float(f.mean()), std=float(f.std())))
return table
rows = build('data/Ms*/*.mat')
print('格数', len(rows))
print('动物', len({r['mouse'] for r in rows}))
print('标签分布', Counter(r['label'] for r in rows))
#-- 按动物划分:八只训练,其余测试
mice = sorted({r['mouse'] for r in rows})
train = set(mice[:8])
Xtr = np.array([[r['mean'], r['std']] for r in rows if r['mouse'] in train])
ytr = np.array([r['label'] for r in rows if r['mouse'] in train])
Xte = np.array([[r['mean'], r['std']] for r in rows if r['mouse'] not in train])
yte = np.array([r['label'] for r in rows if r['mouse'] not in train])
print(Xtr.shape, Xte.shape, len(train))
这段代码只用两个特征,目的是验证流程而不是追求性能。它会把标签分布一并打印出来,正好回答一个前置问题:伪迹格在你的数据里占多少。如果占比很高,先处理它再谈分类。
附录 E:如果只记五件事
| 序号 | 要点 |
|---|---|
| 1 | 十二只小鼠、每只约三小时、十秒一格,是带脑电肌电判读的皮层宽场影像 |
| 2 | 标签四类含伪迹,摘要只说三类,用前必须自己定口径 |
| 3 | 结构只有三个变量,第四维是格不是通道,帧不是样本 |
| 4 | 像素不是神经元,视野是整个皮层表面但只有二维投影,无深度与细胞分辨 |
| 5 | 划分必须按动物,全量两百多 GB,先下两只做原型 |
编辑说明
核验时间 2026 年 10 月 28 日。核验方式为直接访问 PhysioNet 项目页与文件目录,读取 README、许可全文、小鼠信息表与单只动物的目录清单,未下载任何 MAT 数据文件,因此图像内容、标签占比、每只动物的实际格数均未统计。
原始论文的摘要服务在核验时段内多次返回错误码或空结果,因此论文层面只采信官方页面给出的题录信息,未引用其结论性数字。凡涉及论文方法与效果之处,均只作定性表述。
正文中的推算项已在原处标注:每格实际秒数、三小时格数、单格元素数与内存量级、单只动物数据量,全部由官方给定数字计算,误差来自时长浮动与存储精度未知两处。
相关数据集导航
以下为站内 AI-Ready 数据集百科中与本词条共享多个主题标签的相关数据集,按相关度降序排列:
- celegans-connectome — 共享标签:神经科学 / 脑影像
- human-connectome-project — 共享标签:神经科学 / 脑影像
- abide — 共享标签:神经科学 / 脑影像
- openneuro — 共享标签:神经科学 / 脑影像
- adhd-200 — 共享标签:神经科学 / 脑影像
- cam-can — 共享标签:神经科学 / 脑影像
- bigbrain — 共享标签:神经科学 / 脑影像
- 1000-functional-connectomes — 共享标签:神经科学 / 脑影像
- aomic — 共享标签:神经科学 / 脑影像
- cerebral-perfusion-diabetes — 共享标签:神经科学 / 脑影像
导航说明:本章节由全站统一标签体系自动计算生成(标签重合度算法),双向可达;点击链接可跳转至对应数据集词条。

