数据描述
一、引言
在乳腺癌病理诊断的 “金标准”——组织病理学图像分析中,病理医生需通过高倍镜(20-40 倍)观察组织细胞的形态、排列规律判断良恶性,但其流程存在三大核心痛点:一是人工阅片效率极低,单张病理切片需 30 分钟以上完整分析,难以应对大规模筛查需求;二是诊断一致性差,不同经验医生对 “边界性病例”(如不典型增生)的判断差异显著,Kappa 系数常低于 0.75,易导致误诊 / 漏诊;三是数据集适配成本高,多数病理图像数据集无标准训练 / 测试划分,且与主流算法(如对比学习)兼容性弱,需额外投入 1-2 天做格式转换、归一化等预处理,阻碍模型快速开发。
Breast Cancer Histopathological Dataset (BreakHis) 正是针对上述痛点设计:作为权威乳腺病理图像数据集,它按 “训练 / 测试” 明确分拆、按 “良恶性” 用文件夹归类,且与 Lumina AI 的 PrismRCL(随机对比学习)算法无缝兼容,自 2.4.0 版本起无需归一化处理。其核心目标是为研究者提供 “即拿即用、规范划分、算法适配” 的病理图像数据,加速乳腺组织病理分类模型的开发与临床落地。
二、内容主体
(一)数据集核心信息
通过表格直观呈现关键参数,未明确信息标注 “需参考原始来源”,帮助用户快速判断数据与任务的匹配度:
信息类别 |
具体内容(量化、明确) |
基础属性 |
数据集名称:Breast Cancer Histopathological Dataset (BreakHis);数据类型:乳腺组织病理学图像(单样本单文件); |
采集信息 |
采集场景:临床乳腺组织病理切片数字化;采集对象:乳腺组织样本(覆盖良性 / 恶性典型病例);采集标准:符合临床病理诊断规范,图像对应真实患者病例(去标识化处理);放大倍数:含 40×、100×、200×、400× 多尺度(需从原始数据集选择) |
标注情况 |
标注类型:二分类标签(良性 = benign,恶性 = malignant);标注方式:文件夹层级划分(不同类别对应独立子文件夹);标注要求:全数据集图像文件名唯一(避免样本混淆);标注权威:基于临床病理诊断结果,原始研究发表于 IEEE TBME(影响因子 10.6) |
格式与规格 |
图像格式:主流 raster 格式(示例为.png,原始数据集含.jpg/.png);图像规格:分辨率随放大倍数变化(如 40× 对应 320×240 像素,400× 对应 2560×1920 像素,需参考原始数据);适配兼容性:PrismRCL 2.4.0 + 无需归一化,直接兼容;存储方式:单图像独立文件,按 “训练 / 测试 - 类别” 层级存储 |
数据划分 |
划分逻辑:按 “模型开发流程” 分拆为训练集与测试集;具体结构:- 训练集: (含 良性子文件夹、 恶性子文件夹)- 测试集: (含 良性子文件夹、 恶性子文件夹);划分比例:未明确,需以原始数据集实际文件数量为准 |
(二)数据集核心优势
本数据集的核心竞争力在于 “低使用门槛 + 强算法适配 + 高可靠性”,完美匹配乳腺病理图像分类任务的全流程需求,具体优势如下:
- 层级结构规范,零数据整理成本数据集严格按 “训练 / 测试→类别” 划分文件夹(如
train_data/benign/
存储训练集良性样本),且全数据集文件名唯一(如sample_0.png
仅出现一次)。研究者无需手动筛选样本、关联标签,开箱即可直接用于模型训练,相比 “混放型数据集” 节省 20% 以上的数据整理时间,尤其适合新手快速启动实验。 - 无缝兼容 PrismRCL,预处理效率翻倍作为 Lumina AI RCL 算法的适配数据集,BreakHis 自 PrismRCL 2.4.0 版本起无需任何归一化、通道调整等预处理 —— 直接通过命令行指定数据路径即可启动训练,避免因 “算法 - 数据格式不兼容” 导致的调试问题(如像素值范围不匹配、标签读取错误),预处理时间从 “数小时” 缩短至 “零”。
- 许可宽松且权威,支撑多场景应用
- 合规性:采用CC BY 4.0 许可,允许自由使用、修改、商用(仅需标注原始来源),学术研究可直接引用,商业落地无需额外申请授权;
- 可靠性:源自 BreakHis 数据库,原始研究发表于 IEEE TBME(生物医学工程顶刊),数据采集与标注符合临床规范,避免非权威数据集的 “标签噪声”“样本偏差” 问题,确保研究结果可复现。
- 多尺度图像覆盖,适配临床实际需求原始数据集含 40×(低倍)、100×、200×、400×(高倍)多放大倍数图像:低倍图像可用于 “组织整体结构分析”,高倍图像可用于 “细胞形态细节判断”,研究者可根据模型任务(如粗分类 / 精细诊断)选择对应尺度,贴合临床医生 “先低倍扫片、再高倍确认” 的阅片逻辑。
(三)数据应用全流程指导(病理图像分类任务)
1. 数据加载(两种主流方式)
方式 1:PrismRCL 算法专用加载(命令行,零代码)
功能目标:直接调用 PrismRCL 进行模型训练与评估,适合快速验证 RCL 算法效果,无需编写代码。命令行示例(Windows 系统,修正路径格式):
# 完整命令(需将"path o"替换为实际路径分隔符"\path\to")
C:\PrismRCL\PrismRCL.exe chisquared rclticks=10 boxdown=0
data=C:\path\to\Breast_Cancer_Histopathological_Dataset\train_data
testdata=C:\path\to\Breast_Cancer_Histopathological_Dataset\test_data
savemodel=C:\path\to\models\mymodel.classify
log=C:\path\to\log_files
stopwhendone
关键参数解释:
参数 |
功能说明 |
|
训练评估方法:采用卡方检验衡量模型分类效果,适合二分类任务的显著性验证 |
|
RCL 算法核心参数:控制对比学习的迭代步数(10 为基础值,步数越多训练越充分,需匹配算力) |
|
特征下采样策略:0 表示不启用额外下采样,保持病理图像的细胞细节特征完整性 |
|
训练数据路径:需指向 文件夹,程序自动识别子文件夹的 benign/malignant 类别 |
|
测试数据路径:需指向 文件夹,用于评估模型泛化能力 |
|
模型保存路径:训练完成后生成 格式模型文件,可直接用于后续推理 |
|
日志路径:记录训练过程中的损失、准确率等指标,便于分析训练是否收敛 |
注意事项:确保 PrismRCL 版本≥2.4.0,否则需手动对图像做归一化(如将像素值缩放至 [0,1]);路径含空格时需用英文引号包裹(如data="C:\path with space\train_data"
)。
方式 2:Python 通用加载(适配 PyTorch/TensorFlow,支持自定义模型)
功能目标:通过 Python 读取图像,适配主流计算机视觉框架,支持开发自定义分类模型(如 ResNet、MobileNet)。步骤 + 代码示例:
# 1. 导入依赖库
import os
import torch
from torch.utils.data import Dataset, DataLoader
from torchvision import transforms
from PIL import Image
import numpy as np
# 2. 配置数据集根路径(替换为实际路径)
DATA_ROOT = "C:/path/to/Breast_Cancer_Histopathological_Dataset"
TRAIN_DIR = os.path.join(DATA_ROOT, "train_data")
TEST_DIR = os.path.join(DATA_ROOT, "test_data")
# 3. 定义类别映射(良性=0,恶性=1)
CLASS_MAP = {"benign": 0, "malignant": 1}
CLASS_NAMES = ["benign", "malignant"]
# 4. 自定义Dataset类(读取图像+自动关联标签)
class BreakHisDataset(Dataset):
def __init__(self, data_dir, class_map, transform=None):
self.data_dir = data_dir
self.class_map = class_map
self.transform = transform
self.samples = self._load_samples() # 加载图像路径与标签
def _load_samples(self):
"""遍历文件夹,收集(图像路径,标签)对"""
samples = []
for cls_name in CLASS_NAMES:
cls_dir = os.path.join(self.data_dir, cls_name)
# 遍历当前类别下的所有图像文件
for img_name in os.listdir(cls_dir):
if img_name.lower().endswith((".png", ".jpg", ".jpeg")):
img_path = os.path.join(cls_dir, img_name)
cls_id = self.class_map[cls_name]
samples.append((img_path, cls_id))
return samples
def __len__(self):
return len(self.samples)
def __getitem__(self, idx):
img_path, cls_id = self.samples[idx]
# 读取图像并统一转为RGB(避免灰度图通道不匹配)
img = Image.open(img_path).convert("RGB")
# 数据预处理/增强(依模型需求调整)
if self.transform:
img = self.transform(img)
return img, torch.tensor(cls_id, dtype=torch.long)
# 5. 定义数据预处理 pipeline(以224×224输入为例,适配ResNet等模型)
train_transform = transforms.Compose([
transforms.Resize((224, 224)), # 统一图像尺寸
transforms.RandomHorizontalFlip(p=0.5), # 随机水平翻转(数据增强)
transforms.RandomRotation(degrees=10), # 随机旋转±10°(模拟病理切片角度差异)
transforms.ToTensor(), # 转为Tensor:[H,W,C]→[C,H,W],像素值[0,255]→[0,1]
transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]) # ImageNet均值方差(迁移学习用)
])
test_transform = transforms.Compose([
transforms.Resize((224, 224)),
transforms.ToTensor(),
transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])
])
# 6. 创建DataLoader(批量加载数据,支持多线程)
train_dataset = BreakHisDataset(TRAIN_DIR, CLASS_MAP, transform=train_transform)
test_dataset = BreakHisDataset(TEST_DIR, CLASS_MAP, transform=test_transform)
train_loader = DataLoader(
train_dataset, batch_size=32, shuffle=True, num_workers=4, pin_memory=True
)
test_loader = DataLoader(
test_dataset, batch_size=32, shuffle=False, num_workers=4, pin_memory=True
)
# 7. 验证数据加载效果
print(f"训练集规模:{len(train_dataset)} 样本(良性:{sum(1 for _, lbl in train_dataset if lbl==0)},恶性:{sum(1 for _, lbl in train_dataset if lbl==1)})")
print(f"测试集规模:{len(test_dataset)} 样本(良性:{sum(1 for _, lbl in test_dataset if lbl==0)},恶性:{sum(1 for _, lbl in test_dataset if lbl==1)})")
关键说明:若使用原始高分辨率图像(如 400× 对应 2560×1920 像素),可将Resize
尺寸改为 512×512 或保持原尺寸(需匹配 GPU 显存);迁移学习时用 ImageNet 均值方差,从零训练则需先计算数据集自身的均值方差(通过遍历所有图像统计)。
2. 核心任务演示:乳腺病理图像二分类(ResNet50)
模型选择:ResNet50(医学图像分类经典模型,通过迁移学习解决病理图像样本量可能不足的问题,兼顾精度与效率)代码示例(PyTorch):
# 1. 导入模型与评估工具
import torch.nn as nn
import torch.optim as optim
from torchvision.models import resnet50
from sklearn.metrics import confusion_matrix, classification_report, recall_score
# 2. 初始化设备与模型
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
# 加载预训练ResNet50,修改输出层(原1000类→2类)
model = resnet50(pretrained=True)
in_features = model.fc.in_features
model.fc = nn.Linear(in_features, 2) # 二分类输出
model = model.to(device)
# 3. 定义训练组件(损失函数、优化器、学习率调度)
criterion = nn.CrossEntropyLoss() # 二分类交叉熵损失
optimizer = optim.Adam(model.parameters(), lr=1e-4) # 迁移学习推荐学习率
scheduler = optim.lr_scheduler.StepLR(optimizer, step_size=5, gamma=0.1) # 每5轮学习率降为1/10
# 4. 模型训练(含早停逻辑,避免过拟合)
num_epochs = 15
best_test_recall = 0.0 # 优先关注恶性样本召回率(临床核心指标)
for epoch in range(num_epochs):
# 训练阶段
model.train()
train_loss = 0.0
train_correct = 0
for imgs, lbls in train_loader:
imgs, lbls = imgs.to(device), lbls.to(device)
# 前向传播
outputs = model(imgs)
loss = criterion(outputs, lbls)
# 反向传播与优化
optimizer.zero_grad()
loss.backward()
optimizer.step()
# 统计训练损失与正确率
train_loss += loss.item() * imgs.size(0)
_, preds = torch.max(outputs, 1)
train_correct += torch.sum(preds == lbls)
# 训练集指标
train_loss_avg = train_loss / len(train_loader.dataset)
train_acc = train_correct.double() / len(train_loader.dataset)
# 学习率调度
scheduler.step()
# 测试阶段(无梯度计算)
model.eval()
test_loss = 0.0
test_correct = 0
test_preds = []
test_true = []
with torch.no_grad():
for imgs, lbls in test_loader:
imgs, lbls = imgs.to(device), lbls.to(device)
outputs = model(imgs)
loss = criterion(outputs, lbls)
# 统计测试损失与正确率
test_loss += loss.item() * imgs.size(0)
_, preds = torch.max(outputs, 1)
test_correct += torch.sum(preds == lbls)
# 收集预测结果(用于后续评估)
test_preds.extend(preds.cpu().numpy())
test_true.extend(lbls.cpu().numpy())
# 测试集指标
test_loss_avg = test_loss / len(test_loader.dataset)
test_acc = test_correct.double() / len(test_loader.dataset)
test_recall = recall_score(test_true, test_preds, pos_label=1) # 恶性样本召回率(避免漏诊)
# 保存最优模型(以恶性召回率为核心指标)
if test_recall > best_test_recall:
best_test_recall = test_recall
torch.save(model.state_dict(), "breakhis_resnet50_best.pth")
print(f"Epoch {epoch+1}:保存最优模型(恶性召回率:{best_test_recall:.4f})")
# 打印训练日志
print(f"\nEpoch {epoch+1}/{num_epochs}")
print(f"训练:损失={train_loss_avg:.4f},准确率={train_acc:.4f}")
print(f"测试:损失={test_loss_avg:.4f},准确率={test_acc:.4f},恶性召回率={test_recall:.4f}")
# 5. 最终评估(输出混淆矩阵与分类报告)
print("\n=== 最终模型测试集评估报告 ===")
print("混淆矩阵(行=真实标签,列=预测标签):")
print(confusion_matrix(test_true, test_preds))
print("\n分类指标(精确率/召回率/F1):")
print(classification_report(
test_true, test_preds,
target_names=["良性(benign)", "恶性(malignant)"],
digits=4
))
关键说明:临床场景中,“恶性召回率”(不漏诊)优先级高于准确率 —— 若召回率 < 0.95,可通过以下方式优化:1. 调整CrossEntropyLoss
的class_weight
(如class_weight=torch.tensor([1.0, 2.0], device=device)
,给恶性样本更高权重);2. 增加恶性样本的数据增强(如额外旋转、翻转);3. 采用过采样方法(如 SMOTE-IPF,针对图像的过采样)。
3. 效果可视化与部署建议
- 效果可视化:
- 混淆矩阵热力图:用
seaborn.heatmap
绘制混淆矩阵,直观展示 “良性→良性”“良性→恶性(误诊)”“恶性→良性(漏诊)”“恶性→恶性” 的样本数量,重点关注漏诊 / 误诊比例; - 预测结果标注图:选取测试集中的典型样本(如 “良性导管规则排列”“恶性细胞异形性”),在图像上叠加 “真实标签 + 预测标签 + 置信度”(如 “真实:恶性,预测:恶性,置信度:0.98”),辅助验证模型判断逻辑;
- 学习曲线:绘制训练 / 测试集的 “损失 - epoch”“准确率 - epoch” 曲线,判断模型是否收敛(如损失稳定下降、准确率趋于平缓)或过拟合(训练准确率高,测试准确率低)。
- 部署建议:
- 模型轻量化:若部署到病理科边缘设备(如数字切片扫描仪),可通过 TensorRT 将模型量化为 FP16(精度损失小,速度提升 2-3 倍),或改用 MobileNetV3、EfficientNet-B0 等轻量级模型,将单张图像推理时间控制在 200ms 以内;
- 临床辅助系统集成:将模型封装为 API 接口,对接病理科 PACS 系统,输入病理图像后实时输出 “良恶性概率 + 可疑区域定位”(可结合 YOLOv8 定位异常细胞簇),为医生提供 “结果 + 依据” 的双重参考;
- 合规性:使用时需确保病理图像已完成患者去标识化(符合 HIPAA、GDPR 等隐私法规),且模型需通过医学伦理审核,明确标注 “仅为病理辅助诊断工具,最终诊断以医生判断为准”。
(四)数据集样例展示(文件夹结构与样本说明)
文件夹 / 文件路径 |
类型 |
核心内容与临床特征 |
|
根目录 |
数据集总目录,统一管理训练集与测试集 |
|
训练集目录 |
模型训练专用数据,按类别分拆子文件夹 |
├─ |
良性样本 |
40× 低倍图像:乳腺导管上皮细胞规则排列,无异形性,间质结构正常 |
├─ |
良性样本 |
400× 高倍图像:导管上皮细胞大小均一,细胞核染色质分布均匀 |
└─ |
恶性样本 |
400× 高倍图像:癌细胞大小不一,细胞核异形性显著,染色质浓集不均 |
|
测试集目录 |
模型泛化能力评估数据,结构与训练集一致 |
├─ |
良性样本 |
200× 中倍图像:乳腺小叶结构完整,无增生或浸润迹象 |
└─ |
恶性样本 |
200× 中倍图像:癌细胞呈浸润性生长,破坏正常乳腺组织结构 |
标注说明:所有文件名在全数据集内唯一(如sample_0.png
仅存在于train_data/benign/
),避免样本混淆;不同放大倍数的图像对应临床不同观察需求 —— 低倍图像用于快速定位可疑区域,高倍图像用于精细判断细胞形态,研究者可根据模型任务选择单一尺度或多尺度融合训练。
验证报告

卖家暂未授权典枢平台对该文件进行数据验证,您可以向卖家
