信息速览
同一个实验,换一家实验室、换一台显微镜、换一年重做,得到的细胞图像在文件命名、通道顺序、明暗分布上几乎处处不同。过去这些差异分散在各自课题组的硬盘、补充材料和投稿附件里,想横向比较就得先把它们逐一挖出来、读文档、写适配代码——而适配代码往往比实验本身还长。图库要解决的正是这一段:把来源各异的数据集摆进同一个可匿名访问的桶,让「找到」和「下载」不再是研究的前置成本。
Cell Painting Gallery 做的就是这样一件事。它由 Broad Institute 成像平台的两个实验室维护,把二十八个已完成的 Cell Painting 数据集收进 AWS 一个公开 S3 桶,每个数据集保留自己的 cpg 编号,2024 年 5 月的官方口径是 688 TB。它不试图把数据洗成同一种形状,只承诺位置统一、目录骨架统一、元数据词汇统一;剩下的差异,它用文档和校验工具摊开给你看,而不是藏起来。
因此它的价值不在「大」,而在「齐」与「可核对」:一个编号对应一个实验、一篇论文、一段目录,你可以只取需要的那一块,也可以把几块拼在一起——前提是知道它们本来就不一样。一屏速览见下表。
| 维度 | 内容 |
|---|---|
| 全名 | Cell Painting Gallery(常缩写为 CPG) |
| 维护方 | Broad Institute of MIT and Harvard 成像平台:Carpenter-Singh 实验室与 Cimini 实验室 |
| 托管 | AWS Registry of Open Data,S3 桶 cellpainting-gallery,区域 us-east-1 |
| 宣布论文 | Weisbart 等,Nature Methods 21 卷 1775–1777 页,2024 年 10 月 |
| 收录规模 | 2024 年 5 月官方口径 688 TB(图像加数值数据) |
| 完成集数量 | 官方 README 列为 28 个;文档的前缀清单另列 49 个编号 |
| 桶内实际前缀 | 匿名列目录得 45 个(含 cpg0006、cpg0008 等未进完成集表者) |
| 最大单集 | cpg0016-jump,358.4 TB |
| 编号规则 | 数据集名前七个字符即 accession,如 cpg0000 |
| 图像格式 | 16 位灰度 TIFF 为主,另有 OME-Zarr 与压缩裁切图 |
| 数值格式 | 单细胞与孔级画像 CSV 或 parquet |
| 许可 | 数据 CC0 1.0;仓库内工具 MIT |
| 访问条件 | 无需 AWS 账号,--no-sign-request 即可 |
| 配套工具 | 校验器、cpgdata 命令行、pycytominer、CellProfiler、DeepProfiler |
| 典型用途 | 表型画像建模、批校正方法评测、深度表示学习、跨数据集泛化测试 |
§1 它要解决的具体麻烦
1.1 同一个协议,二十套命名
Cell Painting 从 2013 年发表至今已经过多次修订,官方把它分为 v1、v2、v2.5、v3 以及若干变体(脂细胞版、神经版、活细胞版、混合池筛选版)。协议的每一次修订都带来采集上的细微差别:染色浓度、孵育时长、通道排布、显微镜型号。十年下来,同一个实验室里的实验都很难直接对比,跨实验室就更难。
在公开数据这一侧,麻烦还多一层。一篇论文附一份数据,一颗硬盘一份目录,命名习惯随第一作者而定:有人用板号做目录名,有人用日期,有人把孔位和通道拼进文件名,也有人干脆给每个视野一个哈希串。想比较两个实验,得先读完两份说明、写好两份读取器,才知道两边到底能不能比。这段工作既不产生新知识,又必须做,是典型的重复劳动。
图库的思路不是消灭差异,而是把差异收纳进一个可预期的框架:每个数据集一个前缀,前缀下面再按来源、批次、板逐层展开,公共部分用同一套目录名,私有部分留在原地。这样一来,读取器只需要写一次骨架,差异退化成少量配置。
这个思路在工程上有三个连带好处。第一,增量下载变得可行:你要补一批新数据,只需按前缀与批次定位,不必重新核对整库。第二,完整性可核对:桶是对象存储,每个对象都有体积与时间戳,一次列目录就能知道有没有缺口。第三,引用可追溯:前缀编号直接写在论文里,别人用一个编号就能复现你取的是哪一块,不必描述「那个有三十万化合物的实验」这类模糊指代。
代价同样明确:它把「统一」的责任推给了使用者。图库保证的是位置与命名,不保证内容可比。想跨前缀做分析,适配工作从服务器运维转移到了数据工程,从「能不能拿到」变成了「拿到之后怎么对齐」。这是一种更诚实的安排,但确实要多写一些代码。
1.2 三条常见的错误期待
第一条,期待它是一个「统一格式的大数据集」。这是最普遍的误解。打开两个不同前缀的目录,会看到两套层级:有的以 source_4 这类站点代号开头,有的直接以 broad 开头;有的在图像目录旁边放了 illum 做照明校正,有的没有;有的画像是 parquet,有的是 csv。官方文档对此的态度是明说而非掩饰——它把「特征集随数据集变化」写在了专门一节里。
第二条,期待它有整齐的标注标签。图库没有统一标签层。每个数据集的「标签」是它的实验设计:哪些孔加了什么化合物、什么基因、什么剂量。这些信息散落在各数据集自带的板映射表与元数据里,官方另外维护一套元数据词汇来做对齐,但那是描述性字段,不是机器学习意义上的 label 列。
第三条,期待它能代表「细胞形态的通用先验」。它收录的多是药物与基因扰动实验,细胞系集中在 U2OS、A549、HeLa、MCF-7、HepG2、iPSC 与若干原代细胞。用它训练出的表示,在这些细胞系、这些染色方案上很有效;换到血细胞涂片、组织切片或病理全片,迁移并不自动成立。
1.3 它能给到的与给不到的
| 你的需求 | 它给的 | 够不够 |
|---|---|---|
| 大量带扰动的细胞图像 | 二十八集、总量数百 TB,最大单集逾三百 TB | 够,且是同类里最全的一处横向入口 |
| 统一的读取代码 | 目录骨架约定 + 板级载入清单 | 部分够,仍需按前缀写少量配置 |
| 现成的单细胞画像 | 多数数据集附 CellProfiler 输出 | 够,但列集合不齐,须逐集核对 |
| 深度学习的裁切图 | 部分数据集提供压缩单细胞裁切图与掩膜 | 够用于中小规模实验,非全覆盖 |
| 统一的分类标签 | — | 不够,标签等于实验设计,须自己从映射表构造 |
| 跨细胞系的泛化基线 | 多细胞系并存,但实验设计不同 | 勉强,可做但有混杂 |
| 跨显微镜的稳健性证据 | cpg0002 专门比较不同成像系统 | 够,这是少有的针对性设计 |
| 组织学或病理切片 | 无,全部为培养细胞 | 不够,方向不对 |
| 可直接商用的授权 | CC0 1.0,无使用限制 | 够,法律层面最宽松 |
1.4 你的处境与它能帮到的事
| 你的处境 | 它能帮你什么 | 下一步该做什么 |
|---|---|---|
| 你要做表型画像的表示学习,手里只有一两个自采实验 | 提供多协议、多显微镜、多细胞系的现成图像,便于做预训练与跨域测试 | 先挑三到五个协议版本一致的前缀,写统一的载入层,再谈混合训练 |
| 你在评测批校正方法,需要已知的批次结构 | 多个数据集自带真实批次划分(板、站点、日期),批次效应是设计的一部分而非噪声 | 用板级载入清单构造批次标签,按数据集分别报告,不要跨集平均 |
| 你要复现某篇老论文的图 | 历史数据集已按现行流程重跑,旧版画像也保留在子目录 | 先确认论文用的是新版还是旧版画像,两者不可混用 |
| 你的模型只在自家显微镜上验证过 | cpg0002 用同一批化合物在多种成像系统上重复 | 把它当跨设备压力测试,报告绝对下降而非相对排名 |
| 你要给全基因组筛选做对照 | cpg0016 与 cpg0021 覆盖大规模基因扰动 | 先估算存储与出网成本,按板或按站点抽样 |
| 你在做多模态,需要与基因表达对齐 | cpg0003 提供同一批扰动的图像画像与 L1000 转录组画像 | 注意它体积很小且不含图像本体,只是数值对齐层 |
| 你只需要几十张图做教学演示 | 任意前缀下的单张 TIFF 可单独取 | 用 HTTP 直取单文件即可,不必装 AWS 命令行 |
1.5 一句话判断
它是一份编目严谨的仓库,不是一台已经预处理好数据的发动机;价值的一半在数据本身,另一半在那些把差异写清楚、可供核对的说明。
1.6 不适合谁:四条边界
不适合想把整个桶拉回家的人。 总量在数百 TB 级别,即使只取最大的那一集也要上百 TB。合理的做法是按前缀、按批次、按板取样,而不是递归同步。带宽与存储成本会先于算力成为瓶颈。
不适合指望着有现成标签列的人。 图库不提供「这张图属于哪一类」这样的统一标签。标签需要你从各数据集自带的板映射与元数据里构造,构造口径不同,训练出的模型就不可比。
不适合做组织与临床病理方向的人。 这里全部是体外培养细胞的荧光图像,没有组织架构、没有细胞间空间关系、没有临床结局。形态学画像回答的是「扰动如何改变细胞状态」,不是「病灶长什么样」。
不适合把跨数据集结果当作单一证据的人。 不同前缀之间,协议、显微镜、细胞系、通道语义都在变。把它们合并后得到一个数字,这个数字混合了多种来源的差异,无法归因到任何单一因素。
§2 数据构成与规格
2.1 一个前缀就是一份实验档案
图库的最小组织单位是前缀。前缀名由编号与描述性后缀构成,编号是四位数字,前面加 cpg,例如 cpg0004-lincs。编号在名字里是固定的,所以同一份数据在任何地方被引用时都能对得上;后缀是人类可读的名字,便于检索。
前缀下面常见三层:来源层、批次层、板层。来源层在部分数据集里写成 source_4 这类站点代号——这是 JUMP 联盟十二个数据生成站点的编号体系留下的痕迹;在多数单实验室数据集里则写成 broad。批次层通常是「日期_BatchN」,反映一次上机的物理批次。板层则以仪器导出的板编号命名。
这种分层不是审美选择,而是数据生成过程的直接映射。批次是真实存在的实验单位,板是真实的物理单位,孔位与视野是真实的空间单位。把它们照原样保留,使用者才能在切分训练集、估计批次效应、核对下载完整性时,使用与实验者相同的坐标。§4.2 的案例会用一个具体前缀把这条路径走完。
2.2 字段与目录的完整字典
下表列出图库这一层能预期到的结构项。需要强调:这是「骨架」,不是「列定义」;各数据集在自己的元数据文件里有更细的列,图库只保证骨架位置的稳定性。
| 结构项 | 位置 | 取值形态 | 含义 | 使用注意 |
|---|---|---|---|---|
| 数据集前缀 | 桶根第一层 | cpgNNNN-名称 |
一个独立数据集 | 前七字符即 accession |
| 来源层 | 前缀下一层 | source_4、broad 等 |
采集站点或实验室 | 仅部分数据集有,勿写死 |
| 批次层 | 来源层下 images/ 内 |
2021_04_26_Batch1 |
一次上机的实验批次 | 批次是批校正的关键分组 |
| 图像目录 | 批次下 images/ |
板编号或 板号__时间-Measurement1 |
一块板的图像与索引 | 两种命名并存,需分别适配 |
| 单通道图像 | 图像目录下 | r01c01f01p01-ch1sk1fk1fl1.tiff |
行、列、视野、通道编码 | 孔位在文件名里,不在目录名里 |
| 索引文件 | 图像目录下 | Index.idx.xml |
仪器导出的全板元数据 | 含曝光、通道名等采集参数 |
| 照明校正 | 批次下 illum/ |
逐板目录 | 该板的照明校正函数 | 仅部分前缀提供,缺失时需自算 |
| 载入清单 | workspace/load_data_csv/ |
load_data.csv、load_data_with_illum.csv |
逐图像的文件清单与校正参数 | 两条版本的差别在于是否并入照明文件 |
| 画像目录 | workspace/profiles/ |
逐板 板号.parquet |
单细胞与孔级测量 | 列集合逐数据集不同 |
| 分割结果 | workspace/segmentation/ |
逐板的掩膜与对象表 | CellProfiler 或 Cellpose 输出 | 仅部分数据集提供 |
| 工作流脚本 | workspace/software/ |
管道与配置 | 该批次的处理参数 | 复现的入口 |
| 板映射 | 各数据集自定 | CSV | 孔到处理条件的对应 | 官方正在做词汇对齐 |
| 协议版本 | README 与文档 | v1、v2、v2.5、v3、变体名 |
染色与采集方案 | 跨版本比较须声明 |
| 别名 | README | BBBC 编号、IDR 屏编号 | 同一实验的其他编号 | 去重时使用 |
这张表最该记住的是第五行:孔位信息编码在文件名里,而不在目录结构中。这是仪器导出格式的遗留,意味着你不能只靠目录树定位一个孔,必须解析文件名。不同仪器导出的编码长度不同,这也是跨数据集读取器必须分叉的第一处。
2.2b 骨架的三层次与实际参差
把上面的字典按「稳定—半稳定—不稳定」三档重新排列,会看到一幅更实用的图景:
| 档位 | 包含项 | 稳定程度 | 跨前缀可直接依赖吗 |
|---|---|---|---|
| 稳定 | 前缀命名、accession 规则、根层级位置 | 高 | 可以,官方明文规定 |
| 半稳定 | 来源层、批次层、workspace 子目录名 |
中 | 多数可以,但需容错 |
| 不稳定 | 图像目录命名、文件名编码、画像列名 | 低 | 不可以,必须逐集适配 |
这三档对应三种代码写法:稳定项写成常量,半稳定项写成带默认值的解析函数,不稳定项写成每个前缀一份适配器。把三档混在一起写,代码会在换前缀时突然失败,而且失败点往往离真正的原因很远——报的是「找不到图像」,实际原因是图像目录名换了格式。
官方文档的态度与这张表一致。它把目录约定写得很清楚,同时把「特征集随数据集变化」单列一节,并逐一列出变化的来源:管道版本、测量软件版本、显微镜型号、染色面板。四个来源中,前两个影响数值列,后两个影响图像本身。这等于官方承认:骨架能统一,内容不能。
对使用者来说,三档之外还有一件稳定的事——每个前缀都有可读的说明。哪怕目录形态千差万别,你总能在前缀的顶层或仓库说明里找到「这是什么实验、出自哪篇论文、用了哪个协议版本」。这条线索是跨前缀工作的真正起点,比任何目录约定都可靠。
2.2c 桶里还有什么:未进完成集表的前缀
完成集表只收「已发表、可引用、经校验」的数据集,桶里却还有另一类前缀。它们的形态各不相同,但有几类反复出现:
| 类型 | 形态 | 用途 | 使用建议 |
|---|---|---|---|
| 组装视图 | 把多个站点合并成一个逻辑目录 | 便于按整集检索 | 与分站点目录内容重叠,勿重复下载 |
| 分割输出 | 只含掩膜与对象表,无新图像 | 供分割与裁切使用 | 配合对应原图前缀使用 |
| 过渡或未完成 | 目录建立但内容不全 | 未来可能转为正式集 | 待其进入完成集表后再采信 |
| 再分析产物 | 只含重新计算的特征 | 与旧版画像对照 | 引用时说明是重算版本 |
这张表解释了一个常被问到的现象:为什么桶里能数出比表格更多的数据集名。答案不是表错了,而是两者统计的对象不同——表格统计「可引用的完成品」,桶统计「历史上落过地的目录」。混用两个口径,会把未完成的目录当成数据源,取回一堆半成品。
对这类前缀的处理原则只有一条:以表格为采信依据,以桶为检索依据。先在桶里找到候选,再回表格确认它是否完成、该引哪篇论文。若表格里没有,就当它是未来的候选项,不要写进方法节。
2.3 一条记录的完整解剖
以 cpg0016-jump 的第四站点、某批次中的一块板为例,把路径逐层摊开。第一层是数据集前缀,第二层是站点代号,第三层是批次,第四层是 images/,第五层是板目录,第六层才是单个通道的图像文件:
cellpainting-gallery/cpg0016-jump/source_4/
images/2021_04_26_Batch1/images/BR00117035__2021-05-02T16_02_51-Measurement1/images/r01c01f01p01-ch1sk1fk1fl1.tiff
文件名 r01c01f01p01-ch1sk1fk1fl1.tiff 可以拆成几段:r01 是第一行,c01 是第一列,f01 是第一个视野,p01 是第一个平面(多层采样时的 z 层),ch1 是通道一,后面几段是采集时的硬件与滤光片参数。从这个名字能还原出唯一的空间坐标与通道,这就是为什么各数据集的读取器都围绕文件名正则展开。
紧接着的 workspace/ 目录是另一条线:
cellpainting-gallery/cpg0016-jump/source_4/workspace/load_data_csv/2021_04_26_Batch1/BR00117035/load_data.csv
cellpainting-gallery/cpg0016-jump/source_4/workspace/profiles/2021_04_26_Batch1/BR00117035/BR00117035.parquet
前者是这一板所有图像的清单,包含文件路径、通道号与(在带照明版本里)对应的照明校正文件;后者是这一板的测量结果。两条线通过板号对接:清单告诉你「这张图在哪、属于哪个通道」,画像告诉你「这个细胞测出了什么」。
一个只读清单、不读图像的检查脚本如下,用来确认某个前缀下有哪些批次与板:
from pathlib import Path
import polars as pl
index_dir = Path("cpg_index") #-- cpg index sync 产出,见 §5.3
df = (
pl.scan_parquet(index_dir / "*.parquet")
.filter(pl.col("dataset_id").eq("cpg0016-jump"))
.filter(pl.col("source_id").eq("source_4"))
.filter(pl.col("leaf_node").str.contains("load_data.csv"))
.select(["key", "level_5", "size"])
.collect()
)
print(df.height)
print(df.head(3))
这段只依赖索引文件里的目录层级列与体积列,不下载任何图像。它的作用是先摸清体量,再决定取哪一块——这个顺序在图库里几乎是强制的,因为单块板就可能占几十 GB。
2.4 数据集规模分布
官方 README 的表格把 28 个完成集按体积、图像体积、数值体积三列并排列出,并标注协议版本与别名。下表按量级归纳,具体数值以该表为准:
| 量级 | 代表数据集 | 图像 | 数值 | 协议 | 备注 |
|---|---|---|---|---|---|
| 三百 TB 级 | cpg0016-jump | 逾 126 TB | 逾 126 TB | v3 | 全联盟最大单集,附 800 万张以上图像 |
| 数十 TB 级 | cpg0004-lincs、cpg0021-periscope、cpg0001-cellpainting-protocol | 数十 TB | 数 TB 至二十余 TB | v2、v3、混合池 | 分别对应药物剂量、全基因组敲除与协议比较 |
| 十余 TB 级 | cpg0000-jump-pilot、cpg0002-jump-scope、cpg0049-ipsc-diff-pancreatic-progenitor | 数 TB 至十余 TB | 数 TB | v2.5、v2 | 试点、跨显微镜比较、分化过程 |
| 数 TB 级 | cpg0012-wawer、cpg0022-cmqtl、cpg0026、cpg0028 | 2–9 TB | 1–8 TB | v1、v2.5 | 三万化合物、iPSC 系、罕见病变异、耐药克隆 |
| 百 GB 级 | cpg0030-gustafsdottir、cpg0005-gerry、cpg0018-singh-seedseq | 0.2–1 TB | 极小至数百 GB | v1 | 一千六百化合物、小分子系列、shRNA |
| 纯数值无图像 | cpg0003-rosetta、cpg0015-heterogeneity、cpg0034-arevalo-su-motive | 0 | 数 GB 至 204 GB | — | 只有画像,图像在别处或不提供 |
这张表透露出一件事:图库的体积极不均衡。一集占了总量的一半以上,其余各集合计与它相当。这个分布直接影响使用策略——除了最大的那一集,多数数据集单次就能下载,适合先做小规模探索,再决定是否下沉到大集。
2.5 与其他影像资源的字段差异
同样讲细胞图像,图库与相邻几个资源的分工并不相同:
| 对比项 | Cell Painting Gallery | BBBC | IDR | RxRx 系列 |
|---|---|---|---|---|
| 组织方式 | 一个桶内多数据集前缀 | 按编号的独立基准集 | 按屏编号的实验图像库 | 厂商按批次发布 |
| 侧重 | 长期保存与横向编目 | 图像分析与分割评测 | 原始显微与筛选数据 | 大规模药物扰动实验 |
| 接口 | S3 与文档站 | 网页直链压缩包 | 网页与 API | 分批下载 |
| 元数据规范 | 自建统一词汇 | 每集自述 | 基于 OME 模型 | 厂商自定 |
| 与图库的关系 | — | 数集互为别名 | 数集互为别名 | 无关,但是同类发起者 |
| 许可 | CC0 1.0 | 逐集声明,多为 CC BY | 逐屏声明 | 通常有使用条款 |
关键差别在接口形态。BBBC 与 IDR 的入口是「找你需要的那个实验」,图库的入口是「先看全局有哪些实验,再决定取哪一块」。前者适合已经知道要什么的人,后者适合尚在选型的人。
§3 它在哪里:从桶名到目录树
3.1 桶的身份与访问方式
桶名是 cellpainting-gallery,位于 AWS 美东一区,由开放数据计划赞助存储。匿名访问的方式很朴素,浏览器打开桶的 HTTP 端点,或者在命令行里加一个不签名的开关:
aws s3 ls --no-sign-request s3://cellpainting-gallery/
没有这个开关,命令行会报凭据缺失。这是最常见的第一个坑:报错信息看起来像权限问题,实际只是需要声明「我要匿名读」。同样的逻辑适用于 Python 客户端与任何兼容 S3 的工具。
3.2 官方对外主张的三件事
维护方在图库的宣布论文里说得很克制,只做了三件事的承诺,值得原样理解:
| 主张 | 具体内容 | 对使用者的含义 |
|---|---|---|
| 统一组织 | 数据集遵守特定的数据与元数据组织要求 | 目录骨架可预期,但各集内部仍有差异 |
| 校验可查 | 校验器分析桶内容并生成完整性报告 | 你能核对,也可以自行重跑 |
| 长期维护 | 不依赖任何单一项目或基金存续 | 引用不必担心明年失效 |
第三点常被忽略。多数数据集的生命周期跟着项目走,结题即停更;图库把「持续」写进了目标,并确实在持续收录——从 2023 年的二十来集扩到 2026 年的二十八个完成集,中间还加了脂细胞、神经、活细胞等变体。
3.3 编号背后的编目逻辑
编号是顺序发的,不是按体积排的。最早的几号对应 JUMP 联盟相关的试点与协议比较(cpg0000 至 cpg0005),中间一段是历史数据处理(cpg0010 至 cpg0019),再往后是新贡献与新变体。空号也存在:cpg0007、cpg0013、cpg0027、cpg0035 在文档清单里出现过编号但未出现在桶内,cpg0006、cpg0008、cpg0009、cpg0014 则出现在桶里却未进完成集表。这种「编号序列」「桶内实际」「完成集表」三者对不齐的状态,是它作为长期生长型资源必然会有的样子,不是错误。
3.4 与 JUMP 的关系
JUMP 是图库中体量最大的一条线,但不是图库本身。JUMP 是一个多药企参与的数据生成联盟,它的产物以 cpg0016 的名义进图库;试点与协议比较则分别记为 cpg0000、cpg0001、cpg0002。理解这层关系的关键是方向:JUMP 产生数据,图库存放数据。所以图库的说明里会写「最大的公开 Cell Painting 数据集在本图库内」,而不会说「图库就是 JUMP」。
§4 它最独特的东西:差异被写清楚,而不是被抹平
4.1 不同数据集之间到底差在哪
把二十八个完成集并排看,差异集中在五处:
| 差异维度 | 表现 | 例子 | 对下游的影响 |
|---|---|---|---|
| 协议版本 | 染色与采集方案不同代 | v1、v2、v2.5、v3、四个变体 | 通道语义与强度分布都变 |
| 通道构成 | 五通道为主,也有三通道与自定义 | 罕见病变异集用目标蛋白、核、膜、线粒体 | 通道数不齐,模型输入须适配 |
| 成像硬件 | 不同显微镜与镜头 | cpg0002 专门做跨系统比较 | 分辨率、噪声、视场都变 |
| 照明校正 | 有的提供,有的不提供,算法不一 | 大集提供逐板校正,老集无 | 明暗不均会进入特征 |
| 特征集 | CellProfiler 版本与管道不同 | 重跑的三集特征数显著增加 | 同名列未必同义 |
这张表的意义不在罗列,而在提醒:当你从两个前缀各取一块合并时,你其实在同时改变五件事,而实验设计并不支持把这五件事拆开。§7.3 会把这一点展开为具体的偏差清单。
4.2 案例:cpg0004 与 cpg0016 的同一通道不同命
取两个前缀各一块板作对照。cpg0004 以 A549 细胞、六剂量的化合物处理为主,批次目录形如 2016_04_01_a549_48hr_batch1,其下并列 illum、images、images_zarr 等目录;cpg0016 以 U2OS 细胞、化合物与基因两类扰动为主,批次目录形如 2021_04_26_Batch1,其下并列 illum 与 images。
两者的目录骨架相似,含义却不同。cpg0004 的日期写在批次名里,且带细胞系与处理时长,这说明它的批次是按实验设计的组来切的;cpg0016 的批次名只带日期与序号,实验设计的组信息在板映射里。这意味着同一段代码若靠解析批次名获取细胞系,在 cpg0004 上可行,在 cpg0016 上必然失败。
通道层面同样如此。两个数据集都是五通道,但通道一在不同协议版本里未必对应同一个细胞结构。若直接用通道序训练,模型学到的可能是「第几个通道」而不是「染色了什么」。§4.2 的案例在全文出现三次:这里讲目录,§5 讲读取,§7 讲误判来源——每次回来都是同一个原因,这个问题无法靠一次说明解决。
4.3 长期保存这一层做了什么
除了收录,图库还做了三件容易被低估的事。
其一是重跑。历史数据集的测量结果是用当时的流程算的,十年后已经落后。图库把 cpg0012、cpg0017、cpg0031 三集用现行流程重新提取特征,使它们的特征集与最大的那一集对齐;旧画像保留在子目录里,供复现老论文。
其二是格式迁移。TIFF 逐文件存储时,读一张图要发一次请求,云端随机读取很慢。图库开始把部分数据集转为 OME-Zarr,这是一种分块的、面向云端友好的格式,能让一个视野的多通道一次性取回。
其三是压缩裁切。深度学习的管线通常不需要整幅视野,只需要单细胞附近的小块。图库为若干数据集准备了带掩膜的单细胞裁切图,格式是 png,另外把一部分大集的分割结果整理成按板分片的 zarr。
4.4 元数据词汇在做什么
各数据集自带的元数据列名由各自的实验者定,同一个概念可能有三四种写法。图库另起一个项目,把原始列映射到一套受控词表,并规定贡献者提交数据时应当提供哪些字段。
这件事的价值要到跨数据集分析时才显现:有了共同词汇,「哪个数据集用了什么细胞系」这类问题才可以用一条查询回答,而不是读二十八份说明。代价是这套词汇只覆盖描述性字段,不覆盖测量结果,所以画像表里的列仍然各自为政。
4.5 边界条件:什么情况下它不再适用
| 条件 | 是否适用 | 判断依据 |
|---|---|---|
| 你要研究扰动对细胞形态的影响 | 适用,这是它的设计目标 | 多数数据集带干扰设计 |
| 你要做跨显微镜的稳健性验证 | 适用,且有针对性的数据集 | cpg0002 专为此设计 |
| 你要做组织学、切片、全片病理 | 不适用 | 无组织架构,全部为培养细胞 |
| 你要做细胞分割算法的通用基准 | 部分适用 | 有分割输出,但不是为评测设计的标注集 |
| 你要做单细胞水平的轨迹推演 | 谨慎 | 多为终点固定染色,缺少时间序列 |
| 你要小规模快速验证想法 | 适用 | 多个百 GB 级数据集可整集下载 |
| 你要一次拉全量做预训练 | 不适用 | 体量在数百 TB,成本极高 |
第四行与第六行常被混谈。图库里有分割结果,但那些结果是处理管道的副产物,不是人工校验的基准答案;用它评分割算法,会用「与某条管道的输出一致」冒充「与真实边界一致」。第六行则提醒,适用与可行是两件事。
§5 怎么拿到:从列目录到可训练张量
5.1 目录结构与下载面
访问面可以分四层,成本逐层上升:
| 层 | 做法 | 典型代价 | 适合谁 |
|---|---|---|---|
| 看目录 | 浏览器或命令行列前缀 | 几乎为零 | 所有人,先做这一步 |
| 看清单 | 只下载板级载入清单与索引 | 每板上兆级 | 要统计规模与批次结构的人 |
| 取画像 | 只下载 parquet 或 csv 画像 | 数十 GB 至数 TB | 做表格建模、不碰原图的人 |
| 取图像 | 按板、按通道下载 TIFF | 每板数十 GB | 做图像模型、重做分割的人 |
官方文档反复强调先看目录再看规模,理由就在这张表:四层的代价相差几个数量级,而多数人的实际需求落在第二、第三层。
5.2 匿名列目录与小批量下载
#-- 列出桶根的全部数据集前缀
aws s3 ls --no-sign-request s3://cellpainting-gallery/
#-- 只列某个数据集的一个来源下的一批
aws s3 ls --no-sign-request s3://cellpainting-gallery/cpg0004-lincs/broad/images/
#-- 只取画像,跳过图像;exclude 与 include 顺序不能颠倒
aws s3 sync --no-sign-request s3://cellpainting-gallery/cpg0004-lincs/broad/workspace/profiles/ ./profiles/cpg0004/ \
--exclude "*" --include "*.parquet"
第三段的顺序是关键:同步工具按规则顺序判断,先排除全部再放行需要的那类,才能只取画像。反过来写会把整块前缀的清单全部走一遍。这是文档里没有强调但实践中最容易写错的一行。
5.3 用索引文件先摸清体量
图库的配套工具包提供一条索引命令,把桶内全部对象的路径、体积、层级列成 parquet,先在本地建索引再查询:
pip install cpgdata
cpg index sync -o cpg_index
索引文件包含 dataset_id、source_id、leaf_node、level_* 与 size 等列,可以用它回答「哪个数据集最大」「某站点有多少块板」「某类文件总共有多少」这类问题,而完全不碰原始图像。
5.4 从清单到张量
拿到板级清单后,取图的路径就明确了。下例按清单文件逐条读取通道图像,并合成一个多通道数组:
import io
import boto3
import numpy as np
from PIL import Image
s3 = boto3.client("s3", config=None, region_name="us-east-1")
BUCKET = "cellpainting-gallery"
def read_channel(key: str) -> np.ndarray:
obj = s3.get_object(Bucket=BUCKET, Key=key)
arr = np.array(Image.open(io.BytesIO(obj["Body"].read())))
#-- 16 位灰度的取值范围是 0-65535
assert arr.dtype == np.uint16, arr.dtype
return arr
#-- 一个视野的五通道,路径按 §4.2 的案例组装
base = "cpg0016-jump/source_4/images/2021_04_26_Batch1/images/BR00117035__2021-05-02T16_02_51-Measurement1/images"
stack = np.stack([
read_channel(f"{base}/r01c01f01p01-ch{ch}sk1fk1fl1.tiff")
for ch in range(1, 6)
])
print(stack.shape, stack.dtype, stack.min(), stack.max())
这段代码假设桶可匿名读。若未配置凭据,客户端可能直接抛错;在公开桶上通常不需要签名,但个别客户端要求显式声明匿名。实际使用时把 boto3 换成任何兼容 S3 的读取器都可以,官方的载入清单给出的是同样的键名。
5.5 从画像到特征矩阵
不想碰图像的人可以直接从画像起步。画像表通常包含对象编号、位置、面积与大量纹理和强度特征:
import polars as pl
df = pl.read_parquet("profiles/cpg0004/broad/workspace/profiles/BR00117035/BR00117035.parquet")
cols = df.columns
meta = [c for c in cols if c.startswith("Metadata_")]
feat = [c for c in cols if not c.startswith("Metadata_") and c != "ObjectNumber"]
print(df.height, len(meta), len(feat))
print(df.select(meta[:8]).head(2))
两个数字值得留心:行数(这块板有多少个对象)与特征数(这块板测了多少列)。后者在不同数据集之间差异很大,这正是官方在特性说明里写「特征集随数据集变化」的具体所指;也正是重跑那三集的原因——让差异缩小。
5.6 六个最容易出错的地方
| 位置 | 错误写法 | 后果 | 正确做法 |
|---|---|---|---|
| 访问 | 不加匿名开关 | 报凭据缺失,误判为权限不足 | 命令行加 --no-sign-request |
| 同步 | 先 include 后 exclude | 规则顺序失效,取回全部 | 先排除再放行 |
| 通道 | 按序号假定通道含义 | 跨协议时语义错位 | 从索引文件或说明读取通道名 |
| 位深 | 读图后按 8 位归一 | 动态范围被压掉两个数量级 | 先确认 dtype 再归一 |
| 批次 | 按年份或板号切分 | 批次泄漏进测试集 | 用批次列分组划分 |
| 别名 | 把 BBBC 与图库两处当两份数据 | 重复计数、泄漏 | 按别名列去重 |
表格之外还有几处不属于「写错」,而属于「理解错」的地方,值得单独说。第一处是把「清单里有这一行」当成「文件一定取得到」。清单与对象存储是两条独立的记录,同一板下偶尔会有清单已登记、对象已被撤下的情况,尤其在正在补全的前缀里。稳妥的做法是取图时捕获缺对象错误并跳过,而不是让整批任务因为一行失败。
第二处是把画像里的对象编号与图像里的孔位对应起来时省略了视野。孔位只到 r 与 c,同一孔内还有多个视野,每个视野下又有多个被分割出的细胞。少了视野这一层,一个孔会被错误地并成一条细胞。这一点在使用逐孔聚合时尤其致命,因为它不会报错,只会让细胞的分布悄悄变形。
第三处是用像素强度的绝对值做跨前缀比较。十六位深度的取值范围相同,不代表物理含义相同:曝光时长、光源功率、滤片透过率都在变。跨前缀比较时,先按每个前缀内部的分位数做归一,或者干脆只用按对象聚合的形态特征,让强度绝对值退出。
第四处是把批次的边界画在日期上。批次名里的日期是上机日,而细胞接种、染色、成像可能跨几天。同一批次的若干板可能跨日,不同批次也可能在同日有板。按日期硬切会把同一批拆开,让批校正的估计偏移。正确做法是直接使用批次目录名,不要从日期反推。
第五处是把「画像存在」当成「画像完整」。部分前缀的画像只覆盖部分板,或因处理失败留下空板。载入时应先统计每个批次的板数与画像数,若两者不匹配,先确认是数据缺失还是目录约定不同,再决定是否继续。
§6 与库内其他词条的关系
6.1 关系图谱
图库在库内其他词条中的位置,可以用「是不是图库的一部分」与「讲的是不是一个实验」两个问题定位:
| 词条 | 与本篇的关系 | 分工说明 |
|---|---|---|
| JUMP Cell Painting | 子集详述 | 聚焦最大单集 cpg0016 的联盟结构、十二站点与画像处理链;本篇讲图库这一层 |
| BBBC | 交叉别名 | BBBC 是按编号发布单集的基准集,其中数集在本桶内有对应前缀 |
| BBBC021 | 内容对应 | 对应 cpg0010,乳腺癌细胞的药物响应图像 |
| BBBC022 | 内容对应 | 对应 cpg0030,一千六百种已知活性化合物 |
| LINCS L1000 | 数据伙伴 | cpg0003 把图像画像与同一批扰动的转录组画像对齐 |
| Allen 细胞影像集合 | 形态对照 | 讲单细胞内部结构的参考系;本篇讲群体扰动效应 |
| IDR | 托管对照 | 图库中数集在 IDR 有对应屏编号,浏览界面与接口不同 |
第一行最重要:JUMP 那条讲的是一个大实验,本篇讲的是一个存放许多实验的场所。两者共享数据,但问题不同——前者回答「这个联盟产出了什么」,后者回答「我该怎么从一堆实验里找到我要的」。
6.2 检索路径
| 你要找的东西 | 检索词 | 会落到哪里 |
|---|---|---|
| 最大的公共细胞图像集 | cpg0016、JUMP、全基因组扰动 | §2.4 表首行与 JUMP 篇 |
| 药物剂量响应图像 | cpg0004、剂量、A549 | §2.4 第二行 |
| 跨显微镜比较 | cpg0002、成像系统、稳健性 | §4.1 差异表 |
| 转录组与形态的对齐 | cpg0003、rosetta、L1000 | §6.1 第五行 |
| 原图另行获取的实验 | BBBC 编号、IDR 屏编号 | §2.5 对比表与§7.3 |
| 小体量起步 | 百 GB 级数据集 | §2.4 表末两行 |
6.3 与其他资源的分工判据
| 任务 | 主力该用什么 | 图库的位置 | 原因 |
|---|---|---|---|
| 单集图像分析复现 | BBBC 或原始论文配套数据 | 备用入口 | 单集在原始出处更完整 |
| 跨实验横向比较 | 图库 | 主力 | 只有它把多个实验放在同一入口 |
| 长期归档与引用 | 图库 | 主力 | 官方承诺跨项目存续 |
| 图像浏览与交互查看 | IDR | 辅助 | 桶本身是文件存储,不是浏览界面 |
| 大规模预训练语料 | 图库中最大的一集 | 主力之一 | 体量与多样性都在同类前列 |
| 组织与临床图像 | 病理与影像库 | 不适用 | 方向不同 |
§7 质量评估与局限性
7.0 阅读本节前的一个前置校正
先纠正一个常见误判:把「不统一」当成「质量差」。图库的各数据集在通道、校正、特征上确实不一致,但这不是整理不到位,而是它刻意保留原始实验形态的结果——抹平差异需要重做图像处理,会丢掉原始信息,也会让论文复现失效。
正确的读法是:把图库当成一组并列的实验档案,每个档案有自己的条件,质量要按档案逐个评;图库这一层的质量体现在编目与说明的完整度上,而不是数据形状的整齐度。如果不先做这个校正,接下来看到的所有差异都会被误读成缺陷。
7.1 五维评分
按 DAIMS 框架常用的五个维度打分,每项 1–5 分,针对「作为细胞形态学画像研究数据」这一用途:
| 维度 | 分数 | 理由 |
|---|---|---|
| 规模 | 4 | 数百 TB、二十八个完成集,是同类公共资源的合集规模 |
| 结构规范 | 4 | 目录骨架与元数据词汇有明确约定,但历史遗留导致执行不齐 |
| 文档完整 | 5 | 目录页、下载页、引用页、特性说明页齐备,且说明了差异来源 |
| 可获取性 | 5 | 免账号、免注册、公有领域许可,且有索引工具降低检索成本 |
| 一致性 | 3 | 协议、通道、校正、特征四处不齐,跨集比较必须自行处理 |
合计 21 分(满分 25)。分数结构说明它不是「拿来即用」型资源:可获取性与文档拉满,一致性拖后腿,而这恰恰是它被需要的原因。
7.2 质量的两层:编目层与内容层
编目层的质量是可以核对的:前缀是否存在、目录层级是否符合约定、清单文件是否齐全、画像是否可读。这一层做得好,因为官方有校验器定期扫描并生成报告。
内容层的质量由各数据集自己负责,图库只做转运。某集的照明校正没做,某集的分割只覆盖部分板,某集的画像用了旧版管道——这些都真实存在,且在各集的说明里能找到线索。§4.2 的案例给出的正是这种两层结构的读法:目录看着整齐,内容仍需逐个核对。
| 层 | 谁负责 | 你怎么核 | 出错后果 |
|---|---|---|---|
| 编目 | 图库维护方 | 列目录、读清单、跑校验器 | 找不到文件、下载不全 |
| 采集 | 各数据集实验者 | 读该集论文与说明 | 图像质量与设计受限 |
| 处理 | 各数据集处理者 | 读管道配置与特征列 | 特征缺失或不可比 |
7.3 已知的、可枚举的偏差
| 偏差 | 表现 | 影响 |
|---|---|---|
| 协议代际差 | 从 v1 到 v3 跨十一年 | 同一染色在不同代际下强度分布不同 |
| 通道不齐 | 五通道为主,三通道与自定义并存 | 统一输入张量需重采样或补零 |
| 照明校正不一 | 部分集提供逐板校正函数,部分集无 | 明暗不均被当作纹理学进去 |
| 板间批次效应 | 批次按上机日期划分,跨月差异明显 | 未校正时模型记住批次而非处理 |
| 站点差异 | 大集由十二个站点生成 | 跨站点比较等于跨设备比较 |
| 细胞系集中 | 以 U2OS、A549、HeLa 为主 | 对其他谱系的泛化无据可依 |
| 特征集漂移 | CellProfiler 与管道版本不同 | 同名列未必同义 |
| 别名重复 | 同一实验多处编号 | 合并时可能重复计数 |
其中第三个与第五个最容易被低估。照明校正在显微镜成像里不是可选项,是必需品;不同站点用了不同的镜头与光源,校正函数不可互换。当你在一个前缀上训好模型、换到另一个前缀,性能下降的很大一部分来自这两处,而不是来自生物差异。
7.4 外部验证矩阵
图库的价值在外部用法里体现得最清楚。可以从官方收录的流程与公开论文摘要里看出几种角色:
| 验证角色 | 做法 | 讲得通的地方 | 风险 |
|---|---|---|---|
| 表示学习语料 | 用最大集或多个集训练深度编码器 | 规模与多样性足够 | 跨集混合引入混杂 |
| 批校正评测 | 用真实批次结构构造压力测试 | 批次是设计的一部分,标签真实 | 各集的批次粒度不同 |
| 跨设备稳健性 | 用专门数据集比较成像系统 | 同一批化合物在多系统上重复 | 仅覆盖有限设备 |
| 跨模态对齐 | 用图像画像对齐转录组画像 | 同一批扰动在两个模态都有 | 对齐层体积小,不含原图 |
| 全基因组筛选 | 用大集做基因级画像 | 覆盖广 | 存储与算力门槛高 |
官方文档给出的外部流程集中在两类:基于通用分割工具的单细胞裁切,与基于容器化测量的分布式处理。这两类流程的存在说明一件事——图库的设计假设使用者会自己跑管道,而不是等着拿成品特征。
有一点值得单独说:外部研究中把图库当外测集的报告,结论往往并不乐观,换前缀后的性能下降是普遍现象。这与 §4.1 的差异表互相印证:下降的量级取决于你跨过了几条差异线,跨得越多,下降越大。所以用图库做验证时,报告应写清「从哪个前缀到哪个前缀」,而不是笼统说「在图库上外测」。
反过来也要防止把外测成绩当成绝对标准。不同前缀的难度本身不同,同一模型在大集小块上和在跨设备集上的分数不可横比。合理的做法是固定若干前缀与固定划分,在同一组对照上比较模型版本。
7.5 它为何能持续:不是数据多,是退路宽
单个体量更大的数据集在别处也有,但都不像它这样把「还能用十年」当作目标。它靠三件事活着:公有领域许可让法律摩擦归零,开放数据计划承担存储成本,多实验室联合维护让任何一家退出都不致命。三者叠加,构成一条别人难以复制的退路——这比单纯的容量更能解释它的存续。
§8 生态位与历史
8.1 历史沿革
时间线上有几个节点值得记住:
| 时间 | 事件 | 意义 |
|---|---|---|
| 2013 | Cell Painting 协议首次发表 | 奠定五通道染色形态学画像的基本范式 |
| 2016、2023 | 协议两次修订 | 形成 v2 与 v3,图库内协议代际由此而来 |
| 2021–2022 | 联盟型大规模实验启动,试点集上传 | cpg0000 至 cpg0002 成为最早一批前缀 |
| 2023 | 图库仓库建立,工具仓库并行 | 编目、校验、索引三件套成型 |
| 2024-05 | 官方宣布论文口径 688 TB | 首次给出全局体量 |
| 2024-10 | 宣布论文正式发表 | 引用与许可要求随之明确 |
| 2025–2026 | 变体数据集与元数据词汇项目推进 | 从「收什么」转向「怎么描述」 |
第三行常被忽略:图库不是先有仓库再收数据,而是先有一批数据需要去处,再有仓库。这解释了为什么编号从 0000 开始、为什么早期几号都是联盟相关实验。
8.2 从单集发布到合集托管
十年前的做法是一篇论文配一份数据,放在补充材料或机构服务器上。这种做法的问题不在发布,而在维护:硬盘会坏、服务器会关、格式会过时、读取代码会失传。合集托管的出现,本质上是把维护成本从个人转移到了机构,用统一的基础设施抵消个体生命周期的短。
图库是这一转向较早的实例之一,也是少数把「目录约定」与「元数据词汇」两件事同时做起来的实例。多数合集只做前者,结果是索引得到文件、索引不到含义。
8.3 生态位:入口而不是全集
| 角色 | 代表 | 与图库的关系 |
|---|---|---|
| 单集基准库 | BBBC 类资源 | 图库收其对应实验的一份拷贝,二者互认别名 |
| 屏级影像库 | IDR 类资源 | 部分屏在图库与 IDR 各有一份 |
| 厂商数据集 | 商业机构发布的大规模实验 | 互不隶属,但共同构成公共与半公共两片地 |
| 图库本身 | — | 横向编目层,回答「有哪些」 |
这张表说明图库的定位不是替代任何一个库,而是补上「总目录」这一位。它不生产数据,它让生产的成果更容易被找到和核对。
8.4 谁在用它,用来做什么
从公开的使用记录看,使用者集中在三类:做表型筛选与机制推断的生物学团队、做图像表示学习与自监督预训练的算法团队、做批效应与跨域泛化的方法学团队。第一类用户最多,第三类最少,但第三类恰恰最依赖它的一致性说明——没有那些说明,方法学结论就无从成立。
§9 使用指引
9.1 三种角色的路径
| 角色 | 第一天 | 第一周 | 注意事项 |
|---|---|---|---|
| 生物学研究者 | 读目录页,锁定两三个相关前缀 | 取画像做初步聚类,再按需取图 | 标签要从板映射构造,别指望现成 |
| 算法工程师 | 建索引,统计规模与批次 | 打通一个前缀的图与画像,跑通基线 | 通道语义从说明读,不要按序号猜 |
| 方法学研究者 | 选三到五个前缀构建对照 | 做跨前缀压力测试,报告绝对下降 | 固定前缀与划分,别跨论文比分数 |
9.2 一条最短的可用流程
#-- 1. 列目录,确认前缀存在
aws s3 ls --no-sign-request s3://cellpainting-gallery/
#-- 2. 建索引,判断体量
pip install cpgdata
cpg index sync -o cpg_index
#-- 3. 只取画像,绕过图像
aws s3 sync --no-sign-request s3://cellpainting-gallery/cpg0004-lincs/broad/workspace/profiles/ ./profiles/cpg0004/ \
--exclude "*" --include "*.parquet"
#-- 4. 读一块板,看行数与特征数(见 §5.5 的脚本)
这四步走完,你手里会有一份可用的数值画像,以及足够支撑「该不该继续下沉到图像」的判断。多数需求到此为止。
9.3 引用方式
官方要求四件事同时做,缺一不可:
| 引用对象 | 写什么 | 官方示例的形态 |
|---|---|---|
| 数据集本身 | 每个用到的前缀编号 + 该集原始论文 | 「我们使用了数据集 cpg0000(原文),取自图库(2024)」 |
| 图库本身 | 宣布论文 | 六位作者,Nature Methods 2024 |
| 致谢 | AWS 开放数据计划 | 感谢其赞助存储 |
| 别名 | 若同时存在 BBBC 或 IDR 编号,一并标注 | 避免重复计数被误读 |
四件事的顺序不重要,但第一件事最常被省略。很多人只引了图库论文,没有引具体数据集的原作者,这在学术规范上是不完整的——图库文档专门用一段话解释:放弃法律义务不等于放弃学术义务。
§10 AI 使用声明
| 项目 | 声明 |
|---|---|
| 文本生成 | 本文由 AI 辅助起草,编辑负责结构与事实核对 |
| 规模数字 | 688 TB、各集体积、图像数来自官方 README 与宣布论文 |
| 结构描述 | 目录层级与文件名形态来自对桶的匿名列目录 |
| 论文信息 | 读取了 PMC 开放存档的排版版本,非出版社最终版 |
| 工具版本 | cpgdata 0.6.0、pycytominer 1.7.1 于核验当日查询 |
| 未核验内容 | 各集板数与孔数、精确图像总数、逐集照明校正算法细节 |
| 图像 | 无配图;封面为生成式提示词,不含真实显微图像 |
| 免责 | 本文不构成研究方法学建议;数据使用须遵守 CC0 与引用规范 |
常见误读(避坑清单)
| 说法 | 实际 | 证据 |
|---|---|---|
| 「它是一个统一格式的大数据集」 | 目录骨架统一,内容各自独立 | 官方特性说明写明特征集随数据集变化 |
| 「下载要 AWS 账号」 | 匿名可读,无需账号 | 注册页与文档均给出免签名命令 |
| 「CC0 就不用引用了」 | 法律不要求,学术要求 | 引用页专门一节区分二者 |
| 「cpg0016 就是 250 TB」 | 同一张表另写 358.4 TB | 两个口径并存,差额官方未说明 |
| 「桶内只有二十八个数据集」 | 完成集表二十八个,桶内前缀四十五个 | 匿名列目录结果 |
| 「BBBC 的编号可以直接当图库编号」 | 二者是别名关系,各自独立编号 | README 别名列逐条对应 |
| 「通道一永远是同一个染色」 | 协议代际与变体改变通道构成 | 差异表与变体说明 |
| 「画像列名一致就能直接拼接」 | 同名特征未必同义 | 特性说明页列出变动来源 |
| 「它收录了组织切片图像」 | 全部为培养细胞成像 | 全部数据集描述 |
| 「只要下最大的那一集就够了」 | 大集单一细胞系、单一协议 | 规模表与大集描述 |
FAQ
Q1:图库里的数据是统一的还是各自独立的?
名义上统一,实质各自独立。统一的是存放位置、目录骨架与元数据词汇;不统一的是板布局、通道数、照明校正、特征列与协议版本。跨前缀合并之前必须逐个核对,官方文档也这么说。
Q2:下载需要 AWS 账号吗?
不需要。桶公开可读,命令行加免签名开关即可,浏览器里也能用第三方索引页直接翻。需要花钱的只有出网流量与本地算力。
Q3:为什么 CC0 还要求引用?
CC0 放弃的是法律上的署名义务,学术上的credit义务仍在。官方把要求拆成四件事:标注数据集编号、引用该集原始论文、引用图库论文、致谢存储赞助方。
Q4:cpg0016 的体积到底是多少?
两个口径:数据集描述段写逾 250 TB,同表体积列写 358.4 TB。差额官方未说明。做存储规划时按大的那个留余量。
Q5:能把整桶当一个大集直接训练吗?
不建议。通道定义、位深、视场尺寸、分割尺度都不同,直接混合会把采集差异学成生物信号。可行做法是先固定到少数协议一致的前缀,再做逐目录归一化。
Q6:它和 BBBC 是什么关系?
部分重叠。BBBC 是按编号发布的单集基准,偏重图像分析评测;图库是长期存放点,另外收录了 BBBC 没有的大规模筛选。一个实验可能两边各有编号,合并时要按别名去重。
Q7:画像与图像该先取哪个?
先取画像。画像体积比图像小一到两个数量级,足以完成聚类、分类与批校正的初步验证;确认方向后再按板下沉到图像。
Q8:为什么有些数据集没有照明校正文件?
因为校正与采集同步进行,早期实验或外部贡献的数据集未必提供校正函数。缺校正时明暗不均会进入纹理特征,需要自行估算。这一项在差异表里列为独立偏差。
Q9:跨数据集比较时最该报告什么?
报告「从哪个前缀到哪个前缀」以及跨过了哪几条差异线——协议、通道、设备、校正、特征。笼统说「在本图库上外测」等于掩盖了变量。
Q10:它提供标注好的细胞分割吗?
提供部分数据集的分割输出,但那是处理管道的副产物,不是人工校验的基准答案。用它评测分割算法,会把「与某条管道一致」当成「与真实边界一致」。
Q11:桶内前缀数量为什么和官方表格对不上?
官方表格只列已完成的、有论文可引的数据集;桶里还有正在补全或仅作过渡的前缀。两个数字都正确,只是口径不同。
Q12:有扩版计划吗?
官方提供贡献流程,欢迎外部数据集提名入选,并按论文发表节奏更新。是否入选取决于是否符合协议要求与元数据规范,而不是单纯看体量。
术语表
| 术语 | 解释 |
|---|---|
| Cell Painting | 用多种荧光染料标记多个细胞结构的染色方案,用于形态学画像 |
| 形态学画像 | 从图像中提取大量定量特征并据此刻画细胞状态的方法 |
| 前缀 | S3 桶内第一层目录名,即一个数据集的存放位置 |
| accession | 数据集名前七个字符构成的编号,如 cpg0016 |
| 板 | 多孔培养板,一块板是一次成像的基本物理单位 |
| 孔与视野 | 孔是板的网格单元,视野是孔内的一处成像区域 |
| 通道 | 一个荧光波段采集到的一幅灰度图 |
| 照明校正 | 补偿光学系统不均导致的明暗差异的处理 |
| 载入清单 | 逐图像记录文件路径与参数的表,供处理管道使用 |
| 画像表 | 单细胞或孔级的测量结果表 |
| 批校正 | 去除批次带来的系统差异,保留处理带来的生物差异 |
| 站点 | 联盟中负责一部分数据生产的机构代号 |
| 别名 | 同一实验在其他资源中的编号,如 BBBC 或 IDR 编号 |
| OME-Zarr | 分块的图像容器格式,适合云端随机读取 |
| 受控词表 | 预先规定取值范围与词形的字段集合 |
| 位深 | 每个像素强度所占的二进制位数,本图库多为十六位 |
| 代表集 | 体量大或设计特殊的子集,常被单独引用 |
| 变体协议 | 在标准协议基础上针对特定细胞或场景的改动版本 |
附录 A:核心数字核对表
| 项 | 值 | 来源 | 来源层级 |
|---|---|---|---|
| 全局体量 | 688 TB(2024 年 5 月) | 宣布论文正文 | 论文 |
| 完成集数量 | 28 | 官方 README 表格行数 | 官方页面 |
| 文档前缀清单 | 49 编号 | 文档前缀页 | 官方页面 |
| 桶内实际前缀 | 45 | 桶根匿名列目录 | 官方文件 |
| 最大单集体积 | 358.4 TB | 官方 README 表格 | 官方页面 |
| 最大单集图像数 | 逾八百万 | 官方 README 数据集描述 | 官方页面 |
| 最大单集细胞数 | 逾十五亿 | 官方 README 数据集描述 | 官方页面 |
| 协议代际 | v1、v2、v2.5、v3 及变体 | 官方表格协议列 | 官方页面 |
| 许可 | CC0 1.0 | 注册页与引用页 | 官方页面 |
| 工具许可 | MIT | 工具仓库说明 | 官方文件 |
| 存储区域 | us-east-1 | 注册页 | 官方页面 |
| 访问条件 | 免账号 | 注册页与文档 | 官方页面 |
| 更新节奏 | 随相关论文上线 | 注册页 | 官方页面 |
| 索引工具版本 | 0.6.0 | 包索引页 | 官方文件 |
| 宣布论文卷页 | 21 卷 1775–1777 页 | 文献数据库元数据 | 论文 |
附录 B:数字的来源分层
第一层:官方页面与官方文件。 688 TB、各集体积、协议版本、别名、许可、访问方式、桶内前缀清单。来源包括注册页、仓库说明、文档站的目录页与下载页、以及桶本身的可列目录结果。
第二层:论文。 全局体量与发表时间来自宣布论文;个体积数字与表格行数与该论文表格交叉核对过。论文本身是通讯短文,篇幅不足以支撑细粒度的逐集描述,这部分以仓库表格为准。
第三层:未核实。 各集的精确板数与孔数、逐集图像总数、照明校正的具体算法与参数。这些要在下载对应前缀后统计,超出了本篇取数范围,因此正文只写量级,不写精确值。
附录 C:完整参考文献
| 编号 | 文献 | 链接 | 用途 |
|---|---|---|---|
| 1 | Cell Painting Gallery 注册页 | https://registry.opendata.aws/cellpainting-gallery/ | 许可、区域、访问、更新节奏 |
| 2 | 图库仓库说明 | https://github.com/broadinstitute/cellpainting-gallery | 完成集表、体积、协议、别名 |
| 3 | 图库文档站 | https://broadinstitute.github.io/cellpainting-gallery/ | 目录、下载、特性集、引用 |
| 4 | 图库宣布论文 | https://doi.org/10.1038/s41592-024-02399-z | 全局体量、设计意图 |
| 5 | 元数据词汇项目 | https://broadinstitute.github.io/cellpainting-gallery-metadata/ | 字段对齐方式 |
| 6 | 桶根匿名目录 | https://cellpainting-gallery.s3.amazonaws.com/ | 前缀清单与文件命名 |
| 7 | 索引工具包索引页 | https://pypi.org/project/cpgdata/ | 工具版本与用法 |
| 8 | 画像处理工具库 | https://pycytominer.readthedocs.io/ | 下游处理接口 |
附录 D:任务代码
任务一:按前缀统计批次与板,不下载图像
from pathlib import Path
import polars as pl
idx = Path("cpg_index")
df = (
pl.scan_parquet(idx / "*.parquet")
.filter(pl.col("leaf_node").str.contains("load_data.csv"))
.select(["dataset_id", "source_id", "level_3", "size"])
.group_by(["dataset_id", "source_id", "level_3"])
.agg(pl.len().alias("n_files"), pl.col("size").sum().alias("bytes"))
.sort("bytes", descending=True)
.collect(streaming=True)
)
print(df.head(10))
这段的输出是一张「某数据集某来源某批次有多少块板、占多少空间」的表。它是所有后续决策的起点:先知道每块板多大,再决定取几块。
任务二:单块板的多通道对齐检查
import collections
import numpy as np
from task_one_helpers import read_channel #-- 见 §5.4
base = "cpg0016-jump/source_4/images/2021_04_26_Batch1/images/BR00117035__2021-05-02T16_02_51-Measurement1/images"
shapes, dtypes = collections.Counter(), set()
for ch in range(1, 6):
arr = read_channel(f"{base}/r01c01f01p01-ch{ch}sk1fk1fl1.tiff")
shapes[arr.shape] += 1
dtypes.add(str(arr.dtype))
print(f"ch{ch}", arr.shape, arr.dtype, int(arr.min()), int(arr.max()))
assert len(shapes) == 1, "通道尺寸不一致"
print(shapes, dtypes)
两个断言的意义不同:尺寸必须一致,否则无法堆叠;位深必须统一,否则归一化会错。这段代码跑通,说明这个前缀的读取路径可用,可以继续扩大到整块板。
附录 E:如果只记五件事
| 序号 | 记住什么 | 为什么 |
|---|---|---|
| 1 | 一个前缀一个实验,编号即身份 | 所有检索与引用都围绕编号展开 |
| 2 | 目录骨架统一,内容各自独立 | 跨前缀合并前必须逐集核对 |
| 3 | 免账号、CC0、但要引用 | 法律零摩擦,学术义务不减 |
| 4 | 先取画像,再取图像 | 代价差一到两个数量级 |
| 5 | 通道与照明校正是最常出错的两处 | 两者都直接进入特征,且逐集不同 |
编辑说明
本文核验时间为 2026 年 10 月 27 日。核对方式:读取注册页全文,读取仓库说明的表格与前后文,读取文档站的目录页、下载页、特性说明页、引用页与机器学习页;对桶根与若干子前缀做了匿名列目录,确认前缀清单、目录层级与文件名形态;论文侧读取了开放存档的排版版本,未读出版社最终版;工具侧查询了包索引的版本号。未覆盖内容包括:各集的精确板数与孔数、逐集图像总数、照明校正的具体算法、元数据词汇文件的完整字段表。这些需要下载对应前缀后统计或另行索取,按要求只写规模、结构、边界三类数字。
相关数据集导航
以下为站内 AI-Ready 数据集百科中与本词条共享多个主题标签的相关数据集,按相关度降序排列:
- nb-tcm-chm — 共享标签:医学影像 / 药物发现与化学 / 图像分类
- jump-cell-painting — 共享标签:医学影像 / 基因组学与多组学 / 药物发现与化学
- intact — 共享标签:基因组学与多组学 / 药物发现与化学
- msigdb — 共享标签:基因组学与多组学 / 药物发现与化学
- lipid-maps — 共享标签:基因组学与多组学 / 药物发现与化学
- cardiac-implantable-device-cxr — 共享标签:医学影像 / 图像分类
- chest-x-ray-segmentation — 共享标签:医学影像 / 图像分类
- intenz — 共享标签:基因组学与多组学 / 药物发现与化学
- circpedia — 共享标签:基因组学与多组学 / 药物发现与化学
- chexpert — 共享标签:医学影像 / 图像分类
导航说明:本章节由全站统一标签体系自动计算生成(标签重合度算法),双向可达;点击链接可跳转至对应数据集词条。

