BitrocAI 数据集格式说明
数据集介绍
BitrocAI Datasets 是一个用于细胞类型分类和实例分割的数据集,专门设计用于训练和评估细胞分类及分割模型。该数据集目前包含两种细胞类型:阳性细胞(Positive)和阴性细胞(Negative)。
数据集用途
- 细胞实例分割:识别和分割图像中的每个细胞实例
- 细胞类型分类:区分阳性细胞和阴性细胞
- 模型训练:用于训练细胞分类及分割模型
- 模型评估:用于验证和测试训练好的模型性能
数据集结构
BitrocAI 数据集采用分层目录结构,包含四个主要部分:原始WSI图像、处理后的图像、掩码和标注文件。
Dataset_{dataset_name}_{dataset_id}/
│
├── wsi/ # 原始WSI图像目录(全片扫描图像)
│ ├── train/ # 训练集WSI文件
│ │ └── *.svs, *.kfb, *.ndpi, *.dcm, .tif, .tiff
│ ├── validation/ # 验证集WSI文件
│ │ └── *.svs, *.kfb, *.ndpi, *.dcm, .tif, .tiff
│ └── test/ # 测试集WSI文件
│ └── *.svs, *.kfb, *.ndpi, *.dcm, .tif, .tiff
│
├── images/ # 处理后的图像目录(从WSI转换而来)
│ ├── train/ # 训练集图像
│ │ ├── {name}.png # 单个小图(从WSI缩略图或指定区域提取)
│ │ └── {name}_{x}_{y}.png # 瓦片图像(x: 横轴第几个, y: 纵轴第几个)
│ ├── validation/ # 验证集图像
│ │ ├── {name}.png
│ │ └── {name}_{x}_{y}.png
│ └── test/ # 测试集图像
│ ├── {name}.png
│ └── {name}_{x}_{y}.png
│
├── masks/ # 分割掩码目录
│ ├── train/
│ │ ├── positive/ # 训练集阳性细胞掩码
│ │ │ ├── {name}.png # 或 {name}_{x}_{y}.png
│ │ │ └── ...
│ │ └── negative/ # 训练集阴性细胞掩码
│ │ ├── {name}.png # 或 {name}_{x}_{y}.png
│ │ └── ...
│ ├── validation/
│ │ ├── positive/ # 验证集阳性细胞掩码
│ │ │ └── *.png
│ │ └── negative/ # 验证集阴性细胞掩码
│ │ └── *.png
│ └── test/
│ ├── positive/ # 测试集阳性细胞掩码
│ │ └── *.png
│ └── negative/ # 测试集阴性细胞掩码
│ └── *.png
│
└── annotations/ # 标注文件目录(H5格式)
├── train/
│ ├── positive/ # 训练集阳性细胞标注
│ │ └── *.h5
│ └── negative/ # 训练集阴性细胞标注
│ └── *.h5
├── validation/
│ ├── positive/ # 验证集阳性细胞标注
│ │ └── *.h5
│ └── negative/ # 验证集阴性细胞标注
│ └── *.h5
└── test/
├── positive/ # 测试集阳性细胞标注
│ └── *.h5
└── negative/ # 测试集阴性细胞标注
└── *.h5示例:BCData数据集统计
| 数据集分割 | 图像数量 | 阳性掩码数量 | 阴性掩码数量 | 标注文件数量 |
|---|---|---|---|---|
| 训练集 (train) | 803 | 803 | 803 | 1606 (803×2) |
| 验证集 (validation) | 133 | 133 | 133 | 266 (133×2) |
| 测试集 (test) | 402 | 399 | 402 | 804 (402×2) |
| 总计 | 1338 | 1335 | 1338 | 2676 |
文件格式说明
1. 原始WSI图像文件 (wsi/)
-
格式:全片扫描(Whole Slide Image)格式
.svs- Aperio ScanScope格式.kfb- KFB格式.ndpi- Hamamatsu NDPI格式.dcm- DICOM格式.tif- TIFF格式.tiff- TIFF格式
-
特点:高分辨率、大尺寸的病理切片图像
-
用途:原始数据源,需要转换为PNG格式后用于训练和推理
WSI到PNG转换规则
WSI文件需要转换为PNG格式并存储到 images/ 目录。转换方式有两种:
方式1:单个小图转换
- 从WSI文件
{name}.svs(或其他格式)提取缩略图或指定区域 - 转换为单个PNG文件:
{name}.png - 例如:
sample001.svs→sample001.png
方式2:瓦片(Tile)转换
- 将WSI文件分割成多个瓦片
- 每个瓦片命名为:
{name}_{x}_{y}.png{name}:原始WSI文件名(不含扩展名){x}:横轴瓦片索引(从0开始){y}:纵轴瓦片索引(从0开始)
- 例如:
sample001.svs→sample001_0_0.png,sample001_0_1.png,sample001_1_0.png, …
注意:同一WSI文件可以同时使用两种方式,也可以只使用其中一种。转换后的PNG文件统一存储在
images/{split}/目录下。
2. 处理后的图像文件 (images/)
- 格式:PNG
- 颜色空间:RGB(3通道)
- 数据类型:uint8
- 命名规则:
- 单个图像:
{name}.png(从WSI提取的单个图像) - 瓦片图像:
{name}_{x}_{y}.png(从WSI分割的瓦片)
- 单个图像:
- 用途:模型训练和推理的输入图像
3. 掩码文件 (masks/)
- 格式:PNG
- 数据类型:uint16
- 编码方式:实例分割掩码
- 每个像素值表示该像素所属的细胞实例ID
- 值为 0 表示背景(非细胞区域)
- 值为正整数(1, 2, 3, …)表示不同的细胞实例
- 同一细胞的所有像素具有相同的ID值
掩码组织方式
-
positive/ 目录:包含所有阳性细胞的掩码
- 每个阳性细胞有唯一的实例ID
- 同一图像中可能有多个阳性细胞,每个细胞ID不同
-
negative/ 目录:包含所有阴性细胞的掩码
- 每个阴性细胞有唯一的实例ID
- 同一图像中可能有多个阴性细胞,每个细胞ID不同
-
其他类型:如有其他细胞类型(如浸润细胞),可在
masks/{split}/下创建对应目录(如 浸润细胞可用目录infiltrating/),组织方式同上
掩码合并规则
在实际使用中,需要将阳性和阴性掩码合并:
- 阳性细胞:类别ID = 1
- 阴性细胞:类别ID = 2
- 背景:类别ID = 0
合并时需要注意:
- 确保实例ID在整个图像中唯一且连续
- 阴性细胞的ID需要从阳性细胞的最大ID之后开始编号
4. 标注文件 (annotations/)
- 格式:HDF5 (.h5)
- 用途:存储细胞标注的坐标信息
- 命名规则:与对应的图像文件同名(扩展名为.h5)
H5文件数据结构
每个 .h5 文件包含以下数据集:
-
coordinates:细胞中心点坐标数组- 数据类型:
int32 - 形状:
(N, 2),其中N为细胞数量,2表示(x, y)坐标 - 说明:存储该类型细胞在图像中的中心点坐标,每个细胞对应一个坐标点
- 示例:
import h5py with h5py.File('annotations/train/positive/sample001.h5', 'r') as f: coords = f['coordinates'][:] # shape: (N, 2), dtype: int32 # coords[0] = [x0, y0] # 第一个细胞的坐标 # coords[1] = [x1, y1] # 第二个细胞的坐标
- 数据类型:
-
文件组织:
annotations/{split}/positive/{name}.h5:存储阳性细胞的坐标annotations/{split}/negative/{name}.h5:存储阴性细胞的坐标- 如有其他细胞类型,同样在对应目录下创建
.h5文件
WSI转换说明
转换流程
- 原始WSI文件存储在
wsi/{split}/目录 - 转换为PNG后存储在
images/{split}/目录 - 对应的掩码和标注文件存储在
masks/{split}/和annotations/{split}/目录
转换示例
假设有一个WSI文件:wsi/train/sample001.svs
方式1:转换为单个图像
- 输出:
images/train/sample001.png - 对应的掩码:
masks/train/positive/sample001.pngmasks/train/negative/sample001.png
- 对应的标注:
annotations/train/positive/sample001.h5annotations/train/negative/sample001.h5
方式2:转换为瓦片
- 输出:
images/train/sample001_0_0.png,sample001_0_1.png,sample001_1_0.png, … - 对应的掩码:
masks/train/positive/sample001_0_0.png,sample001_0_1.png, …masks/train/negative/sample001_0_0.png,sample001_0_1.png, …
- 对应的标注:
annotations/train/positive/sample001_0_0.h5,sample001_0_1.h5, …annotations/train/negative/sample001_0_0.h5,sample001_0_1.h5, …
数据集约束和注意事项
1. 文件命名约束
-
文件名对应关系:掩码和标注文件的**文件名(不含扩展名)必须与对应的图像文件的文件名(不含扩展名)**完全一致
- 例如:
- 图像:
sample001.png→ 掩码:sample001.png(在masks/{split}/positive/和masks/{split}/negative/中) - 图像:
sample001_0_0.png→ 掩码:sample001_0_0.png - 图像:
sample001_1_2.png→ 掩码:sample001_1_2.png
- 图像:
- 标注文件同样遵循此规则,但扩展名为
.h5- 例如:图像
sample001.png→ 标注:sample001.h5(在annotations/{split}/positive/和annotations/{split}/negative/中)
- 例如:图像
- 例如:
-
WSI转换后的文件对应:
- 如果WSI文件
{name}.svs转换为单个图像{name}.png,则掩码和标注文件也使用{name}作为基础名称 - 如果WSI文件转换为瓦片
{name}_{x}_{y}.png,则每个瓦片都有对应的掩码和标注文件{name}_{x}_{y}.png和{name}_{x}_{y}.h5
- 如果WSI文件
2. 掩码格式约束
- 数据类型:必须使用
uint16类型存储掩码 - 实例ID:
- 必须从 1 开始编号(0 保留给背景)
- 同一掩码文件内的实例ID必须连续且唯一
- 不同掩码文件之间的ID可以重复(加载时会重新编号)
3. 图像和掩码尺寸约束
- 尺寸匹配:掩码的尺寸必须与对应图像的尺寸完全一致
- 图像:
(H, W, 3) - 掩码:
(H, W)
- 图像:
4. 数据完整性约束
- 配对要求:每个图像应该同时有对应的阳性掩码和阴性掩码文件
- 如果某个图像没有阳性细胞,对应的
positive/掩码文件可能不存在或为空 - 如果某个图像没有阴性细胞,对应的
negative/掩码文件可能不存在或为空 - 但至少应该有一个掩码文件存在(否则该图像无法用于训练)
- 如果某个图像没有阳性细胞,对应的
5. 类别定义约束
- 类别编码:
0:背景(非细胞区域)1:阳性细胞(Positive)2:阴性细胞(Negative)
- 类别互斥:每个像素只能属于一个类别和一个实例
6. 数据集分割约束
- 固定分割:train/validation/test 分割已经固定,不应随意更改
- 无重叠:三个分割之间不应有重复的图像
- 一致性:同一图像的所有相关文件(图像、阳性掩码、阴性掩码、标注)必须在同一个分割中
7. 数据加载约束
- 内存管理:加载大量数据时需要注意内存使用
- 训练集图像多且大,全部加载可能占用大量内存
- 实例ID重新编号:在合并阳性和阴性掩码时,必须重新编号以确保ID唯一性
8. 文件格式约束
- WSI格式:支持
.svs,.kfb,.ndpi,.dcm,.tif,.tiff格式 - 图像格式:仅支持 PNG 格式(从WSI转换而来)
- 掩码格式:仅支持 PNG 格式(uint16)
- 标注格式:H5 格式(可选,当前训练代码未使用)
9. WSI转换约束
- 转换一致性:同一WSI文件转换后的所有PNG图像,其对应的掩码和标注文件必须存在
- 瓦片命名:瓦片索引
{x}和{y}必须从0开始,连续编号 - 文件扩展名:
- WSI文件:保留原始扩展名(
.svs,.kfb,.ndpi,.dcm,.tif,.tiff) - 转换后的图像:统一使用
.png扩展名 - 掩码文件:使用
.png扩展名 - 标注文件:使用
.h5扩展名
- WSI文件:保留原始扩展名(
扩展数据集:添加新类别
如果需要添加新的细胞类别(如浸润细胞、中性粒细胞等),请遵循以下步骤:
1. 类别ID分配
- 新类别应使用递增的类别ID(从
3开始) - 例如:
3表示浸润细胞(Infiltrating),4表示中性粒细胞(Neutrophil)等 - 确保类别ID连续且唯一,不要跳过数字
2. 目录结构创建
- 在
masks/{split}/目录下创建与新类别对应的目录 - 目录名称应使用小写英文,多个单词用下划线分隔(如
infiltrating、neutrophil) - 例如:
masks/train/infiltrating/、masks/validation/infiltrating/、masks/test/infiltrating/
3. 标注文件创建
- 在
annotations/{split}/目录下创建与新类别对应的目录 - 目录名称与掩码目录保持一致
- 例如:
annotations/train/infiltrating/、annotations/validation/infiltrating/、annotations/test/infiltrating/
4. 文件命名规则
- 掩码文件:
masks/{split}/{category_name}/{name}.png或masks/{split}/{category_name}/{name}_{x}_{y}.png - 标注文件:
annotations/{split}/{category_name}/{name}.h5或annotations/{split}/{category_name}/{name}_{x}_{y}.h5 - 文件名必须与对应的图像文件名(不含扩展名)完全一致
5. 掩码合并规则
- 合并多个类别掩码时,需要确保实例ID在整个图像中唯一且连续
- 新类别的实例ID应从之前所有类别的最大ID之后开始编号
- 例如:如果阳性细胞最大ID为100,阴性细胞最大ID为200,则新类别(如浸润细胞)的ID应从201开始
6. 文档更新
- 在数据集说明文档中更新类别编码列表(如”5. 类别定义约束”部分)
- 更新数据集统计表格(如适用)
- 在代码中更新类别映射字典或配置文件
示例:添加浸润细胞类别
假设要添加”浸润细胞”(Infiltrating)作为第3类:
- 类别ID:
3 - 目录结构:
masks/train/infiltrating/ masks/validation/infiltrating/ masks/test/infiltrating/ annotations/train/infiltrating/ annotations/validation/infiltrating/ annotations/test/infiltrating/ - 类别编码更新为:
0:背景1:阳性细胞2:阴性细胞3:浸润细胞
最后更新