3. WSI数据格式与读取性能
全切片图像(WSI)动辄数万×数万像素,单张未压缩数据量可达数GB至数十GB。推理流水线真正读取的从来不是整张图,而是金字塔中某一层级的若干tile。因此,WSI读取性能的核心问题可以归结为三件事:选对层级、算对坐标、管好缓存。工具库的差异,本质上是在这三件事上的实现方式与开销不同。
一、WSI的存储结构:金字塔与tile
主流WSI格式(SVS、NDPI、MRXS、TIFF衍生格式等)普遍采用金字塔式多分辨率存储。以一张40×放大倍率、尺寸为100000×80000像素的切片为例,其金字塔通常包含若干层级,每层相对上一层的下采样倍率为2:
| 层级 | 下采样倍率 | 近似尺寸 | 典型用途 |
|---|---|---|---|
| Level 0 | 1× | 100000×80000 | 精细细胞形态、核分割 |
| Level 1 | 2× | 50000×40000 | 中等倍率组织分类 |
| Level 2 | 4× | 25000×20000 | 组织区域定位 |
| Level 3 | 16× | 6250×5000 | 缩略图、ROI粗筛 |
每个层级内部又被切分为固定边长的tile,常见为256×256或512×512。tile是磁盘I/O与解码的最小单位,也是推理批次的天然粒度。理解这一点很关键:读取一个tile的代价,远低于读取一个任意矩形区域,因为后者可能跨越多个tile并触发额外解码。
二、坐标系统:层级坐标与level 0坐标的换算
WSI工具库普遍提供两套坐标:level 0坐标(全分辨率像素坐标)和层级坐标(当前level下的像素坐标)。二者关系为:
level_coord = level0_coord / downsample_factor
downsample_factor = 2 ^ level # 以2倍下采样金字塔为例
# 示例:level 0 坐标 (40960, 32768) 在 level 2 的位置
# downsample = 2^2 = 4
# level2_x = 40960 / 4 = 10240
# level2_y = 32768 / 4 = 8192
实际工程中更常用的是按目标物理分辨率反推层级。假设模型要求输入对应0.5 μm/pixel,而WSI的level 0为0.25 μm/pixel,则目标下采样倍率为2,应读取level 1。若直接读取level 0再缩放,会浪费约4倍I/O与解码开销。这是吞吐优化中最容易被忽视、收益却最直接的一步。
三、工具库对比:OpenSlide、tiffslide、cuCIM
三者的定位差异明显。OpenSlide是C库加Python绑定,格式覆盖最广,稳定成熟,但解码路径以CPU为主,且Python层调用存在GIL与对象创建开销。tiffslide是纯Python实现,基于tifffile与zarr,安装轻量、无系统依赖,对标准 pyramidal TIFF兼容好,但格式覆盖不如OpenSlide,且大图随机读取性能依赖底层解码器。cuCIM则面向GPU加速,提供CuImage与GPU版read_region,可将解码、色彩转换、重采样放到GPU,适合高吞吐批量推理,但需要CUDA环境且对部分私有格式支持有限。
| 维度 | OpenSlide | tiffslide | cuCIM |
|---|---|---|---|
| 格式覆盖 | 最广(SVS/NDPI/MRXS等) | 以TIFF系为主 | TIFF系为主,部分格式受限 |
| 解码位置 | CPU | CPU | CPU/GPU |
| 安装依赖 | 需系统库 | 纯Python,轻量 | 需CUDA |
| 随机tile读取 | 稳定 | 良好 | GPU批量时优势明显 |
| 适用场景 | 多格式兼容、通用推理 | 标准TIFF、轻量部署 | 高吞吐GPU推理 |
四、缓存策略与吞吐的关系
推理吞吐通常以tiles/s或patches/s衡量。影响它的不只是单次读取速度,还有重复读取的命中率。典型场景中,同一张切片会被多次访问:先粗筛ROI,再对ROI内tile精细推理。若每次都重新解码,I/O与解码会成为瓶颈。
常见缓存策略有三层:文件句柄缓存(避免反复打开关闭WSI)、tile级LRU缓存(缓存已解码的tile数组)、批次预取(按扫描顺序提前读取下一批tile)。在PyTorch DataLoader中,可通过设置num_workers与prefetch_factor实现预取;在cuCIM中,可利用GPU显存缓存热点tile,减少Host-Device拷贝。
五、工程落地的判断依据
选择工具与策略时,可按以下顺序判断:若切片格式多样且需要稳定兼容,优先OpenSlide;若部署环境受限、格式为标准TIFF,tiffslide更轻便;若已有GPU且批量推理吞吐是瓶颈,cuCIM的GPU解码与缓存更合适。层级选择上,先由模型输入分辨率反推目标μm/pixel,再匹配最接近的金字塔层级,避免从level 0缩放。缓存上,先统计同一张切片的重复tile访问比例,若重复率高,LRU缓存收益显著;若访问模式为顺序扫描,预取比缓存更有效。
最终吞吐不是单一工具决定的,而是层级选择、坐标换算正确性、缓存命中率、并发与预取配置共同作用的结果。把这三层关系理清,再结合具体格式与硬件做小规模基准测试,才能得到可复现的推理吞吐结论。