恒美微站
首页
关于我们
建站服务
主题模板
案例展示
资讯中心
联系我们
血细胞4分类数据集实战:数据清洗、模型训练与避坑指南
首页
资讯中心
/
血细胞4分类数据集实战:数据清洗、模型训练与避坑指南
血细胞4分类数据集实战:数据清洗、模型训练与避坑指南
发布时间:2026/10/7 10:19:42
简介面向医学图像入门与算法验证场景的血细胞图像分类数据集适合需要使用真实显微图像开展4分类深度学习训练的开发者与研究者。资源按标准目录划分训练集与测试集下辖嗜酸性粒细胞、淋巴细胞、单核细胞和嗜中性粒细胞4个类别每类约3000张图片可直接交给模型读取无需额外整理。压缩包共2000个文件以1998张jpeg图像为主另附1个json类别字典和1个Python可视化脚本约99.5MB。数据已提供训练集9957张、测试集2487张并可搭配脚本快速预览样本分布。目前已有1057人学习下载整体结构规范、类别均衡适合作为图像分类预实验、课程设计或入门级医学图像项目的数据支撑。1. 血细胞4分类数据集模型精度上不去的瓶颈往往在数据本身医学图像里的图像分类任务血细胞4分类是特别典型的入门级场景任务本身的判别逻辑不算难难的是数据集的干净程度和类别边界的定义。这套血细胞图像分类数据集4分类提供的是外周血涂片中白细胞的分类样本最常见的是嗜中性粒细胞、嗜酸性粒细胞、嗜碱性粒细胞和淋巴细胞四类可以直接拿来训练图像分类模型也可以配合目标检测框架做细胞定位加分类。它适合三类人准备做医学图像方向课程设计的学生、验证图像分类算法的从业者、需要给更复杂的细胞计数系统打数据底座的工程师。先说结论如果你只盯着模型结构而忽略染色差异、标注错位和类别不均衡换再新的Backbone也救不回验证集精度。2. 四类细胞怎么分形态特征、标注规则与最容易认混的地方2.1 从核形和颗粒入手四类细胞的判别顺序血涂片图像不像自然图像那样看整体轮廓拿到数据集的第一步我习惯先把各类细胞的形态规律写在脚本旁边边看图边确认。判断顺序固定为先看核形再看颗粒最后才看背景颜色。这个顺序不是随便定的因为核形是尺度最大的结构特征在低分辨率下也稳定颗粒是尺度最小的特征适合做二次确认背景红细胞只是参照物如果模型依赖背景色来分类换一批染色样本马上翻车。嗜中性粒细胞核呈分叶状成熟细胞常见2到5叶叶与叶之间有细丝相连胞浆呈淡粉或淡紫红色颗粒细小且弥散。嗜酸性粒细胞最好认核常为双叶胞浆里充满粗大的橘红色颗粒密集均匀在ROI里一眼就能和中性粒分开。嗜碱性粒细胞形态紧凑核分叶不明显胞浆内是深蓝紫色粗颗粒颗粒多时会把核盖得看不清楚。淋巴细胞核圆形或类圆形深染占细胞体积的大部分胞浆较少呈干净的天蓝色。需要特别注意的易混场景有两组。第一组是嗜碱粒和深染的淋巴细胞前者胞浆边界模糊、颗粒粗大后者核质比高但胞浆干净多看一眼颗粒分布就能区分。第二组是嗜酸粒在压缩视野后只看到橘色颗粒、看不到双叶核与中性粒的重度颗粒版本容易混这类图我一般直接标记为低置信度样本不硬分。下面这个表可以快速对照类别核形态胞浆颗粒最容易和谁混淆嗜中性粒细胞分叶核2~5叶有细丝连接细小、弥散、淡紫红重度颗粒的中性粒与嗜酸粒嗜酸性粒细胞常为双叶核粗大橘红、均匀密集嗜中性粒的粗颗粒版本嗜碱性粒细胞分叶不明显常被颗粒覆盖深蓝紫粗颗粒深染的淋巴细胞淋巴细胞圆形/类圆形深染占比较大无明显颗粒胞浆浅蓝嗜碱性粒细胞这个表的价值在于当数据集的标注有错时至少能凭形态特征判断错在哪一环。尤其嗜碱类样本通常最少一旦混入几十张淋巴图训练时损失函数会被带偏模型会慢慢学会“圆形深染就是嗜碱”的错误规则。2.2 标注规则识别整图分类标签与带框样本的差异血细胞数据集在打包方式上通常分两种。第一种是每个细胞裁成小图目录名或CSV列名就是类别标签适合直接做整图分类第二种是保留原始视野大图用矩形框或多边形框标出白细胞的位置和类别适合做目标检测加分类。这套数据如果是4分类大概率是第一种但也不排除附带部分检测标注。我下载后的一般流程是先随机抽每类10张图拼成网格图肉眼对照上一节的形态表过一遍。这一步能快速发现两类问题。一是标签与图片错位文件名叫basophil但图里实际是淋巴二是类别定义和你的任务不一致例如把嗜碱和嗜酸合并成了一个大类。这些问题在训练时的acc指标上看不出来只会在混淆矩阵里以固定方向偏移的形式暴露。还要注意血涂片染色方案的影响。常见的是瑞氏染色或吉姆萨染色两种方案下同一类细胞的颗粒颜色深浅有差异。如果数据集里的图像来自多个染色方案混合模型学到的可能不是细胞形态而是染色偏色。处理思路是在数据加载阶段做颜色归一化或者把颜色抖动增强幅度调大让模型不能依赖绝对色值做决策。3. 把数据集吃透目录结构、加载脚本与训练集划分3.1 拿到手先做三件事解压、盘点、洗数据数据集下下来通常是一个压缩包解压后你会面对两类目录结构。第一类是典型的一级目录blood_cell_4class/neutrophil/xxx.png类别名即文件夹名第二类是images/加labels.csvCSV里写文件名与类别对应关系。第一步永远是先看清楚结构而不是急着写训练脚本。我按这个顺序操作先记录目录深度和后缀再统计每类文件数。这里有个很常见的坑同一份数据集里可能同时存在png和jpg甚至混入少量tif或bmp。png是无损格式jpg经过一次有损压缩会把细小颗粒信息磨掉如果后续要做形态学分析我一般只保留png。不要轻易做格式互转连续两次有损压缩后嗜酸粒的橘色颗粒特征很可能会变成一团模糊的色块。3.2 用Python读图并统计每类样本量下面的脚本每拿到这类数据集都会先跑一遍用于排查损坏图片和统计类别分布。它不依赖深度学习框架只用OpenCV就能跑完。import os import glob from collections import Counter import cv2 data_root ./blood_cell_4class supported_ext (*.png, *.jpg, *.jpeg) bad_images [] class_counter Counter() for cls_name in sorted(os.listdir(data_root)): cls_dir os.path.join(data_root, cls_name) if not os.path.isdir(cls_dir): continue image_paths [] for ext in supported_ext: image_paths.extend(glob.glob(os.path.join(cls_dir, ext))) class_counter[cls_name] len(image_paths) for img_path in image_paths: # 读不出来的图片直接记为损坏不参与后续训练 img cv2.imread(img_path, cv2.IMREAD_UNCHANGED) if img is None: bad_images.append(img_path) print(每类样本量:, dict(class_counter)) print(损坏图片数量:, len(bad_images)) if bad_images: print(损坏图片示例:, bad_images[:5])这段代码按类别目录统计可用图片数用cv2.imread的返回值抓出损坏图片。imread在文件损坏、格式伪装、路径含中文等情况下都会返回None是成本最低的体检手段。参数IMREAD_UNCHANGED保留原通道数方便你确认数据集里是否有灰度图和彩色图混用如果只是为了训练统一用IMREAD_COLOR更省事。接着检查通道一致性在循环里加一行打印img.shape看是(H, W, 3)还是(H, W)或者带了第四通道alpha。这个信息直接决定预处理时要走灰度转三通道还是删掉透明度通道。3.3 数据划分策略分层抽样与随机种子划分为训练集、验证集、测试集比例我习惯用7:2:1测试集是最后才碰的底线。血细胞分类的类别天然不均衡嗜碱粒细胞在真实涂片里占比就低如果简单随机划分验证集里很可能一个嗜碱样本都分不到每轮验证时recall直接读为0。from sklearn.model_selection import train_test_split # X 为图片路径列表y 为对应的类别标签列表 X_train, X_temp, y_train, y_temp train_test_split( X, y, test_size0.3, stratifyy, random_state42 ) X_val, X_test, y_val, y_test train_test_split( X_temp, y_temp, test_size1 / 3, stratifyy_temp, random_state42 )stratifyy表示按类别比例分层抽样保证四个类别在每份数据里都保持原占比random_state42固定随机种子让划分结果可复现。这一点在做消融实验时很关键否则你换了模型权重后没法判断涨点是模型带来的还是数据划分带来的。test_size先留30%做临时集再从中切出1/3实际就是总体的10%。4. 让模型跑起来ResNet微调与检测分类两条落地路线4.1 整图分类ResNet34做迁移学习的参数设置当数据集形态是裁好的细胞小图配四分类标签时最稳的路线还是ResNet系做迁移学习。虽然最新的图像分类模型迭代很快但血细胞这类小数据集上ResNet34的稳定性和可复现性依然超过很多花哨结构。import torch import torchvision.models as models model models.resnet34(weightsmodels.ResNet34_Weights.IMAGENET1K_V1) in_features model.fc.in_features model.fc torch.nn.Linear(in_features, 4) # 替换全连接层输出4类 optimizer torch.optim.SGD( model.parameters(), lr0.001, momentum0.9, weight_decay1e-4 )关键点有两个。一是用ImageNet预训练权重而不是随机初始化医学图像小数据集微调收敛快不容易过拟合二是只换最后一层全连接输入尺寸保持224×224。优化器方面SGD配0.9动量和1e-4权重衰减是医学图像小数据集的保守默认值lr从0.001起步如果显卡显存够用AdamW配lr3e-4也能跑但SGD在这个场景下对学习率的敏感度更低更适合作为基线。训练时的数据增强要针对医学图像特点来配。旋转控制在±15度以内水平垂直翻转打开颜色抖动只加很小的幅度brightness0.1, contrast0.1。不要用随机crop细胞小图裁掉边界后很可能把颗粒信息切没。归一化用ImageNet的mean和std即可如果染色偏色非常明显再考虑用数据集的统计值自定义归一化。4.2 检测加分类用YOLOv8做细胞定位与四分类如果你的数据是带框的大视野图那实际上是目标检测加分类不是纯整图分类。我会直接用YOLOv8系列先从nano开始跑通流程根据显存再放大到s或m。先写数据集描述文件path: ./blood_cell_dataset train: images/train val: images/val nc: 4 names: [neutrophil, eosinophil, basophil, lymphocyte]YOLO格式下每张图对应一个txt标注文件每行格式是cls cx cy w h坐标归一化到0到1之间。标注文件缺失或坐标越界的样本会在训练时被跳过但不会报错这也是一个隐藏坑。训练命令一行启动yolo detect train datablood_cell.yaml modelyolov8n.pt epochs100 imgsz640 batch16imgsz建议至少640白细胞的粒度很小很多细小颗粒特征在416尺度下会被压缩成噪声。batch根据显存调整能塞下16就开16。epochs先用100配合早停让模型在验证集mAP不再提升时自动停下来。4.3 评估指标准确率不够用得看每类召回率血细胞分类场景里准确率高不代表模型可用。假设嗜碱粒细胞只占5%模型把所有样本都判成中性粒准确率也能到90%上下但这个模型没有任何使用价值。指标计算方式血细胞场景的注意点准确率 Accuracy预测正确数 / 总样本数类别不均衡时严重失真精确率 PrecisionTP / (TPFP)高精确率保证分出来的类别可信召回率 RecallTP / (TPFN)每一类都要单独看关注小类F1分数2×P×R / (PR)均衡指标适合模型横向对比混淆矩阵真实类别×预测类别能看出系统性错分方向训练中我会同时打印训练集和验证集的混淆矩阵重点检查两个位置嗜碱粒是否被大量分到淋巴嗜酸粒是否被大量分到中性粒。这两个方向是形态学上的真实易混对。如果混淆矩阵出现第三个方向的错误比如嗜酸和嗜碱大量互混基本可以判断是标注噪声而不是模型问题。5. 实战避坑血细胞分类最容易翻车的五个问题5.1 训练loss正常下降验证集loss却剧烈震荡现象训练损失曲线平滑下滑验证损失像锯齿一样上下乱跳准确率在75%到90%之间反复横跳。原因大概率是数据划分有问题。如果同一个人的样本同时出现在训练集和验证集就构成数据泄漏或者验证集整体太小只有几十张每轮的随机性被放大。解决按样本来源分组划分同一来源或同一视野的图必须全部落训练集或全部落验证集。验证集比例不要低于15%并用stratify保证四类比例一致。这一步做完验证曲线会立刻稳定下来。5.2 嗜碱粒细胞召回率一直是0现象训练结束后打印每类recall嗜碱类始终是0或个位数其他三类都很高。原因类别不均衡。嗜碱粒细胞在真实血涂片中占比本来就低数据集中可能只有几十张模型为了最小化总损失选择放弃学习这一类。解决先看类别统计若小类样本过少优先用加权损失torch.nn.CrossEntropyLoss(weightclass_weight)让模型对错分小类施加更大惩罚其次才考虑过采样因为图像过采样容易引入重复样本。如果小类样本连一个稳定验证集都凑不齐就去原图上人工补标或者做针对性数据扩充。5.3 换一台机器或一批图后预测效果崩盘现象同一套权重在训练环境测试还行部署到另一环境或拍自不同仪器的图上准确率从90%跌到60%多。原因染色差异。不同医院、不同批次试剂、不同显微镜的白平衡都会让同一类细胞呈现完全不同的色彩分布模型依赖绝对颜色时换域即失效。解决训练阶段把颜色抖动幅度加大同时做自适应的染色归一化例如把每张图的亮度、对比度、饱和度对齐到数据集的均值。或者将RGB转换到HSV空间再随机扰动饱和度与色相让模型学的是形态而非染色。5.4 resize到224×224后小细胞特征模糊现象训练集上准确率不低验证集上对高倍镜小细胞图经常分错可视化224输入下颗粒纹理已经是糊的。原因直接暴力resize压缩了颗粒信息。血细胞颗粒直径非常小缩到224分辨率时嗜酸粒的橘色颗粒可能只剩下几个像素。解决常见做法是保持长边先缩放用双三次插值到合适尺寸再做中心裁剪如果原始分辨率本身较低宁可把输入尺寸提到256或288也不要为了增大batch牺牲精度。cv2.resize里我用cv2.INTER_CUBIC而不是默认的INTER_LINEAR。5.5 训练中报错图片通道数不一致现象数据加载到一半报ValueError: operands could not be broadcast together with shapes或者某张图送入网络前shape检查不通过。原因数据集中混入灰度图、带alpha通道的图或位深16bit的图。OpenCV默认读到的是BGRPyTorch预训练权重要求RGB三通道任何通道数异常在batch拼接时都会出问题。解决读取时统一转三通道用cv2.imread(path, cv2.IMREAD_COLOR)强制丢弃alpha或灰度单通道再转为RGB。检查位深用img.dtype出现uint16时先用cv2.normalize缩放到uint8范围否则图像整体偏暗训练收敛会变慢。6. 进阶玩法自检脚本与半监督伪标签扩充6.1 用自检脚本给数据集做体检模型表现异常时与其怀疑网络结构不如先怀疑数据本身。我习惯把下面几项写进自检脚本每个文件能否被正确解码、像素方差是否为0、是否存在重复图、每张图的颜色均值与整体差异。from PIL import Image import hashlib def image_md5(path): with open(path, rb) as f: return hashlib.md5(f.read()).hexdigest() # 重复图检测完全相同的字节即视为重复 hash_map {} for img_path in all_image_paths: h image_md5(img_path) if h in hash_map: print(重复图:, img_path, -, hash_map[h]) else: hash_map[h] img_path除了重复检测像素方差为0的全黑或全白图也要单独剔除。特别是当全黑图恰好集中在嗜碱类时模型会学到“黑色区域代表嗜碱”的错误信号这类错误在损失曲线上几乎看不出来。6.2 半监督用高置信度伪标签扩充小类样本如果嗜碱类严重不足我的兜底方案是先训练一版三分类模型再对未标注图片跑预测筛出置信度高于0.95的嗜碱预测结果人工复核后打上伪标签加入训练集。阈值的选择要优先保证精确率宁可漏分也不要错分。从那以后我每次拿到医学图像数据集都会强制走完这个流程先自检再划线划分最后才谈训练。只要跳过其中一环后续的模型结果都会写满不确定性。希望帮到你。本文还有配套的精品资源点击获取