十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

YOLO11cls血细胞分类实战:从数据整理到双阈值校验

YOLO11cls血细胞分类实战:从数据整理到双阈值校验 简介面向癌症检测与血细胞分类场景的医疗图像数据集资源已按文件夹整理好 basophil、erythroblast、monocyte、myeloblast、seg_neutrophil 五个类别的真实血细胞图片标注质量较高可直接用于 YOLO11cls 等目标分类算法的训练与验证同时附带博主的一键训练脚本和训练结果日志适合医疗图像分类项目开发者、算法学习者参考复现。资源包共 1 个 PDF 文件约 4.86MB因数据集整体较大已托管于百度网盘PDF 内含数据集基本情况说明、类别示意图及具体获取方式方便下载前先了解数据组织与使用条件。目前已有 51 人学习下载对于需要快速获取整理规范的医疗分类数据并跑通 YOLO 分类流程的读者是一份实用的入门与实战参考。 做这个项目之前我其实先踩了整整一周的数据坑。起因很简单想用血细胞涂片图像做癌症早期筛查阶段的辅助分类模型倒好选但数据该怎么整理、怎么喂给训练脚本网上教程各说各话。后来我把图像按类别拆成文件夹配合YOLO11cls的分类模式写了一个训练脚本跑完发现真正决定模型上限的不是哪行训练代码而是数据组织方式。这个项目一共包含1000张真实血涂片图像按形态学类别分好文件夹附带一份在我自己的环境里实测可用的YOLO11cls一键训练脚本。无论你是刚接触目标分类的新手还是想快速验证分类模型在血细胞乃至其他医学图像上的效果这套流程都能直接参考。1. 任务定位血细胞分类为什么不做目标检测而是选YOLO11cls1.1 “分类”不是“检测”两者在血细胞场景里的差别很多人一听到YOLO第一反应就是画框检测。但YOLO从第五代开始就有独立的分类分支在Ultralytics框架里对应的就是yolo11-cls.pt这类权重。分类任务的核心是判别“这张图是什么”不需要边界框也不需要给出细胞的具体位置。放到血细胞场景里目标检测需要人工标注每个细胞的框在细胞密集重叠的血涂片图像上标注成本非常夸张。而分类模式只需要把每个细胞裁剪成单张图像按类别放进文件夹模型就能学会区分中性粒细胞、淋巴细胞、单核细胞等形态差异。癌症检测的早期筛查有一个现实逻辑医生看血涂片时怀疑对象往往是少数形态异常的原始细胞。这类细胞和正常白细胞在外观上高度相似人工镜检费时且主观。用分类模型先粗筛一遍把低置信度的样本挑出来送人工复核比直接做目标检测更贴合实际流程。这也是我最后选择YOLO11cls分类分支的原因少一套标注少一层调试在“细胞已经被裁剪好”的前提下分类分支的准确率并不比检测分支差。1.2 这个数据集的组成与采集边界数据集总计1000张图像全部来自真实血涂片染色图像并以单细胞裁剪为主。为了贴近不同实验室的染色差异我保留的图像包含明场染色和部分带色彩偏移的样本没有做统一的颜色校正这样训练出来的模型更有鲁棒性。类别设置上我按形态学惯例分成六个目录对应六类常见细胞文件夹名中文对应在辅助筛查中的角色neutrophil中性粒细胞最常见白细胞形态成熟lymphocyte淋巴细胞正常但易与原始细胞混淆monocyte单核细胞体积较大核形不规则eosinophil嗜酸性粒细胞颗粒明显较易区分basophil嗜碱性粒细胞数量少染色有特点blast原始细胞/幼稚细胞异常提示癌症筛查重点对象这份数据的“癌症检测”定位准确说是异常细胞识别的前置辅助而不是直接诊断。原始细胞比例异常是血液系统恶性疾病的重要线索但模型输出只做提示最终判断一定需要医生复核。后面所有训练和评估我都围绕“尽量减少漏掉blast”这个目标来做而不是单纯追求总体准确率。2. 1000张图的类别目录YOLO11cls真正需要的长这样2.1 目录结构一个文件夹就是一条标签YOLO11cls分类模式最省事的地方在于不需要额外的标签文件。它会自动把文件夹名称当作类别名读取目录下的所有图片建立映射。数据集根目录下需要两套子集一个是train一个是val如果有独立的test训练结束后单独用来评估。我最终整理好的目录长这样data/ ├── train/ │ ├── neutrophil/ # 内含250张 │ ├── lymphocyte/ # 内含250张 │ ├── monocyte/ # 内含200张 │ ├── eosinophil/ # 内含120张 │ ├── basophil/ # 内含80张 │ └── blast/ # 内含100张 ├── val/ │ ├── neutrophil/ │ ├── lymphocyte/ │ ├── monocyte/ │ ├── eosinophil/ │ ├── basophil/ │ └── blast/ └── test/ ├── neutrophil/ ├── lymphocyte/ ├── monocyte/ ├── eosinophil/ ├── basophil/ └── blast/这里有个很多人第一次操作容易踩的坑文件夹名称一定不要用中文尽量用简短英文单词。Ultralytics会把这些名称直接写进类别映射和输出日志里中文名称在部分系统上会导致编码问题后面可视化混淆矩阵时也会乱码。另外类别名称不要带空格和特殊字符my_class可以my class就会出问题。2.2 从原始图片到训练文件夹我踩过的分配坑1000张图不是一股脑丢进去就行。我先按类别统计了每类图片数量再用分层抽样的方式划分训练集、验证集和测试集比例是8:1:1。分层抽样的意思是每个类别单独按比例切分而不是把所有图片混在一起随机打乱再切。我最开始偷懒直接对全量图片做随机划分结果数量最少的basophil在验证集里只分到1张训练日志里的loss曲线看着还行混淆矩阵却惨不忍睹。分享一个当时整理的简易分割逻辑核心是train_test_split做两次import os import shutil from sklearn.model_selection import train_test_split root raw_cells out_root data for cls_name in os.listdir(root): cls_dir os.path.join(root, cls_name) imgs [os.path.join(cls_dir, f) for f in os.listdir(cls_dir) if f.lower().endswith((.jpg, .jpeg, .png))] train_imgs, temp_imgs train_test_split(imgs, test_size0.2, random_state42) val_imgs, test_imgs train_test_split(temp_imgs, test_size0.5, random_state42) # 再分别复制到 data/train/classes、data/val/classes、data/test/classes这样切完每个类别在三个子集中都有一定数量。另外训练前我统一做了图片清洗把损坏的、纯黑底的、明显失焦的图片全部过滤掉。清洗这一步不能省脏数据对深度模型的伤害比数据量少还要大。格式上我统一转成RGB的JPG避免PNG带透明通道在某些推理环境下报错。YOLO训练时会对图像做自适应缩放原始图不一定要正方形但分辨率还是建议统一在256像素以上太小的图裁剪后细胞形态特征会丢失后面做224推理时细节也不够。3. 一键训练脚本的核心参数每一行都值得较真3.1 既要“一键”也要在代码里说明参数来源脚本本身不复杂把Ultralytics封装成一个Python文件替换数据集路径后直接运行即可。我给的训练参数不是随手写的每一项都对应这个数据集的具体情况from ultralytics import YOLO model YOLO(yolo11-cls.pt) # 加载预训练权重 model.train( datadata, epochs80, imgsz224, batch32, lr01e-3, patience10, seed42, cacheTrue, workers4, ampTrue, projectruns/classify, nameblood_cls, )imgsz用224是迁移学习最稳妥的起点预训练分类权重原本就在这个分辨率下优化过强行调到320或更高对于只有1000张图的数据集很容易过拟合。epochs我设成80但patience10意味着验证集指标连续10轮不升就提前停掉。血细胞分类数据集小实际跑下来常常在40到50轮就收敛了没必要机械跑满80轮。cacheTrue会在第一次读取时把图片全部缓存进内存1000张图占用不大但能明显加速训练尤其是小尺寸图片读盘频繁的时候。lr01e-3是经验值。如果是完全随机初始化这个学习率会偏大但因为我们用了yolo11-cls.pt预训练权重骨干网络的特征提取能力已经很强只需用较小的学习率微调最后分类头。如果训练过程中发现loss震荡先把学习率降到5e-4而不是去调batch size。batch size选32是在训练速度和显存占用之间的平衡点实测在RTX 3060 12G上能稳定跑完再往上加到64也能跑但收益很小反而容易在验证集上出现波动。3.2 针对血细胞图像的增强调整不能照搬自然图像Ultralytics默认会开一些数据增强包括随机翻转、色彩抖动、透视变换等。对自然图像这些增强很有效但血细胞图像有它的特殊性。细胞核和细胞质的染色强度是临床判读的重要依据过强的色彩抖动可能把嗜碱性颗粒的颜色直接改没了导致模型学到错误的颜色关联。我的做法是关掉高强度的透视和旋转保留水平翻转和轻微的缩放色彩抖动幅度调低。如果你用命令行跑可以这样覆盖默认参数yolo classify train datadata modelyolo11-cls.pt epochs80 imgsz224 batch32 hsv_h0.01 hsv_s0.3 hsv_v0.2 degrees0 fliplr0.5fliplr0.5的水平翻转对细胞形态没有破坏性可以保留。degrees0是我特意关掉的血细胞本身没有固定的方向性旋转理论上无害但我实测旋转增强在染色图像上会带来边缘伪影对极细小的颗粒结构不友好。如果你想打开建议设置成degrees45以内不要给90度或180度的特殊角度。另外一个容易被忽略的问题是类别不平衡。这个数据集里basophil只有80张neutrophil有250张模型天然会偏向样本多的类别。我在脚本里做了一步简单过采样把数量少的类别在训练目录里复制几份让每类图片数量大致接近。听起来粗暴但对小数据集确实有效比改损失函数门槛低很多。过采样只影响训练集验证集和测试集保持原始比例这样才能真实反映模型在自然分布下的表现。4. 训练完才是开始校验、混淆矩阵与真实血涂片上的表现4.1 进阶看confusion matrix不要只盯acc训练结束后结果保存在runs/classify/blood_cls目录下里面会有results.png、confusion_matrix.png、top1_acc.png、top5_acc.png这些文件。我一般先看top1准确率如果验证集总体准确率达到90%以上算是一个不错的起点。但只看这个数字会骗人当blast等异常类别占比不高时模型哪怕把blast全部漏掉总体准确率也可能很高。我的习惯是第一时间打开confusion_matrix.png重点看两处。第一blast这一行有没有被大量分到lymphocyte里第二basophil和lymphocyte之间是不是混得厉害。这两个混淆方向在形态学上非常常见不成熟的淋巴细胞和原始细胞在染色图像上本来就长得很像。如果混淆矩阵把大量blast判成lymphocyte那这个模型在辅助筛查里是危险的因为异常细胞会被当成正常细胞放过去。4.2 双置信度阈值我用它来消化回归误判模型推理走Ultralytics自带的命令就行yolo classify predict modelruns/classify/blood_cls/weights/best.pt sourcetest/blast/img_001.jpg输出结果会给出预测类别和置信度。但真实场景里单靠“取置信度最高的类别”不够稳。血涂片图像受染色方案、光照、显微镜型号影响同一张blast在不同环境下很可能被低置信度分给lymphocyte。我在脚本外专门加了一个后处理逻辑不直接采用top-1结果而是设置两个阈值预测情况处理方式最高置信度大于0.8直接采纳预测类别最高置信度在0.5到0.8之间标记为待复核输出到独立文件夹模型判断为blast但置信度低于0.5强制标记为高风险因为漏掉异常比误报正常更危险这套规则不能说多成熟但在只有1000张图的数据上很实用。模型即使判断错了置信度往往也会在边界区摆动我们把这个缓冲区留给人工复核比强行让模型给一个确定答案要安全得多。我在测试集上数过大约8%左右的低置信度样本会被当成正常细胞但套上双阈值之后真正“高置信度判错”的样本只剩不到1%这对异常细胞筛查是有意义的。4.3 外部图像表现崩盘先查颜色归一化做医学图像训练的人大概率遇到过这种情况模型在自己的验证集上准确率96%换到一批新拍的涂片图上立刻掉到70%。我排查过一次发现不是模型结构问题而是新的图像整体偏蓝调旧图像偏粉红调。细胞形状一样但颜色分布差异太大模型把颜色分布当成重要特征了。解决思路是增加数据的色彩多样性或者在推理前做颜色归一化。我后来在脚本里加了一个轻量的白平衡处理步骤把每个推理图像的RGB均值拉到训练集整体均值附近。这个方法不改变细胞形态只是让色彩中心回到模型熟悉的区间。如果你想省事也可以直接在数据增强里把hsv_s和hsv_v稍微调大一点让模型见过更多色彩变化但增强幅度过大的话容易把细胞核细节整糊需要自己权衡。5. 从这套数据出发还能往哪个方向扩5.1 半自动标注用小模型辅助整理新数据1000张图只能算起步真实场景里新涂片是一直在产生的。更好的方式是训练好baseline模型后用它去预测新采集的未标注图像把高置信度样本直接加入对应类别文件夹低置信度样本送给人工打标。这个过程可以循环迭代模型会越用越强。清洗时我再强调一遍加入的新样本一定要检查别让某个错误标签悄悄溜进去脏标签对分类模型的影响比缺少数据更致命。5.2 两级分类替代单模型硬分类如果后来数据量扩充到几千张我的下一步是把现在的六类别单模型拆成两级。第一级判断“正常/异常”第二级只对异常细分成blast和特定异常类型。好处是减少类别之间的全排列干扰basophil这种数量少且形态特殊的类不会因为和正常细胞混在一起而被牺牲。更关键的是二级结构在癌症筛查里更方便解释第一级是初筛第二级是定位具体可疑类型医生看到的不再是一个冷冰冰的类别标签而是有层级的技术判断链。训练好模型之后如果要做轻量化部署可以直接导出ONNX格式yolo export modelruns/classify/blood_cls/weights/best.pt formatonnx imgsz224导出后可以用ONNX Runtime或TensorRT加速推理单个细胞图像的推理时间能压到几毫秒级别放到本地工具或边缘设备上都没有问题。回头来看这个项目最核心的部分不是预训练模型有多强而是把数据按YOLO11cls的分类范式归置好再给每个训练参数找到合适的理由。我希望任何人拿到这套整理好的文件夹和训练脚本改个路径就能跑通自己的第一版血细胞分类模型。不要急着去堆数据和网络结构先老老实实把目录理顺把增强关到合适位置把混淆矩阵看明白模型的真实水平一定对得起你花在数据上的时间。本文还有配套的精品资源点击获取
返回列表