news 2026/9/24 21:20:17

淋巴细胞目标检测数据集详解:从HE切片到YOLOv8训练

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
淋巴细胞目标检测数据集详解:从HE切片到YOLOv8训练

简介:淋巴细胞目标检测数据集是一份面向医学影像与YOLO目标检测任务的行业级数据集,适用于病理辅助诊断、免疫微环境评估、淋巴细胞计数等AI模型开发场景。压缩包共2000个文件,以1152个txt标注文件、846张jpg病理图像为核心,另附1个yaml配置和1个docx说明文档,整体约67.68MB,目录结构清晰,可直接用于模型训练与推理。数据集总计1152张医学图像,按训练580、验证290、测试282划分,类别为Lymphocyte(淋巴细胞),全部采用YOLO格式边界框标注,由医学专家校验,覆盖密集细胞簇等复杂病理分布场景,能很好适配YOLOv5/v7/v8及更高版本算法。数据源自医学病理图像数据库,涵盖淋巴细胞典型分布场景,标注文件支持扩展至细胞计数、密度分析等下游任务。已有60人浏览学习,适合医疗AI研究人员、病理诊断系统开发者及免疫治疗分析者,可用于淋巴细胞自动识别、癌症病理分析、药物疗效评估中的免疫细胞定量研究。

1. 淋巴细胞目标检测数据集:1,152 张 HE 切片为什么值得一跑

病理科每天要出几百张免疫组化切片,淋巴细胞计数是淋巴瘤分级和免疫状态评估的硬指标,人工在 40 倍镜下逐视野点数,一天下来眼睛都是花的。如果你需要训练一个目标检测模型去自动识别病理切片里的淋巴细胞,这个资源就是为这件事准备的:训练 580、验证 290、测试 282,合计 1,152 张医学图像,统一 YOLO 标注格式,类别聚焦 Lymphocyte,可直接喂给 YOLOv5/v7/v8 甚至更新的检测框架,不用再花一周去整理格式、划分数据集。它解决的不只是“有没有数据集”的问题,而是把数据划分、标注格式、医学专家校验这些原本要返工的活提前做完。适合正在做病理辅助诊断、免疫治疗研究,或者刚入门想拿医疗数据练手的开发者。

2. 数据集拆解:从 CD3CD20 文件名读懂标注与切片来源

2.1 压缩包里的文件构成:Roboflow 导出结构的典型样子

这批数据从文件名看,明显是从 Roboflow 平台导出的。.rf.后缀就是 Roboflow 导出时给每张图像加的唯一标识,后面跟一串 hash。文件名主体的CD3CD20_Lymphocyte_193_069632_081920_HE_png,每一段都有含义,后面我会逐个拆。先看压缩包解开后最可能出现的目录结构:

lymphocyte_dataset/ ├── train/ │ ├── images/ │ │ ├── CD3CD20_Lymphocyte_193_069632_081920_HE_png.rf.xxx.jpg │ │ └── ... │ └── labels/ │ ├── CD3CD20_Lymphocyte_193_069632_081920_HE_png.rf.xxx.txt │ └── ... ├── valid/ │ ├── images/ │ └── labels/ ├── test/ │ ├── images/ │ └── labels/ ├── data.yaml └── README.txt

这里train/imagestrain/labels必须一一对应,同名 jpg 和 txt 配对。如果你解压后看不到data.yaml,自己在根目录建一个就行,这个文件后面训练的时候要喂给 YOLO。压缩包里的划分比例是 580:290:282,约等于 5:2.5:2.5,这在目标检测数据集里属于合理水平,测试集占了近四分之一,说明划分者希望模型在独立数据上的表现能被真实评估,而不是只盯着验证集调参。由于文件名明确带.rf.,我判断这是 Roboflow 导出时勾选了“YOLO format”后生成的目录结构,标准做法是每张图配套一个同名的.txt标注文件。

2.2 文件名里的信息:从 CD3CD20 到坐标编号

文件名CD3CD20_Lymphocyte_193_069632_081920_HE_png能读出几个关键信息。CD3CD20是免疫组化双标染色的标志物组合,CD3 标记 T 细胞,CD20 标记 B 细胞,这在淋巴瘤病理诊断里非常常见。Lymphocyte是类别名,说明这批数据标注的对象就是淋巴细胞,而不是单独区分 CD3 阳性还是 CD20 阳性。193大概率是病例或切片编号,069632_081920更像原始全切片(WSI)上某个 patch 的像素坐标。最后HE_png表示这是 HE 染色切片导出的 PNG 图像。

我处理过不少病理切片导出的数据集,这种命名方式几乎成了惯例:从 WSI 上裁剪 patch 时,把病例编号和 patch 原点坐标写进文件名,方便后续追溯。这意味着什么?如果你要做数据划分,绝对不能按文件名随机分,而应该按193这类切片编号去分。否则同一个切片上的相邻 patch 会同时出现在训练集和测试集里,验证时指标虚高,部署到真实切片上立刻翻车。这个问题我后面在避坑章会展开。

2.3 YOLO 标注格式的读取:把归一化坐标转成像素框

YOLO 格式的标注文件是纯文本,每行代表一个目标,五个数字依次是类别ID 中心点x 中心点y 框宽 框高,所有坐标都做了归一化,值域在 0 到 1 之间。要可视化检查标注质量,你需要把这些归一化坐标乘回图像的宽高。下面这个脚本可以快速把标注转成像素坐标并打印出来:

from PIL import Image img_path = "CD3CD20_Lymphocyte_193_069632_081920_HE_png.rf.xxx.jpg" label_path = img_path.replace(".jpg", ".txt") with Image.open(img_path) as im: w, h = im.size # 图像实际宽高,单位像素 with open(label_path, "r") as f: lines = [line.strip() for line in f if line.strip()] for line in lines: cls, cx, cy, bw, bh = line.split() cx, cy, bw, bh = map(float, (cx, cy, bw, bh)) x1 = int((cx - bw / 2) * w) y1 = int((cy - bh / 2) * h) x2 = int((cx + bw / 2) * w) y2 = int((cy + bh / 2) * h) print(f"class={cls} bbox=({x1}, {y1}, {x2}, {y2}), size={x2 - x1}x{y2 - y1}")

逻辑上没什么技巧,核心是wh必须从图像读出来,不能猜,不能用 640 或 512 硬算。病理切片的原始分辨率经常是 1024 或 2048,猜错尺寸会导致画出来的框全部偏移。跑完后建议随机挑 20 张图,把x1, y1, x2, y2cv2.rectangle画上去人工看一眼:淋巴细胞的框应该是紧贴细胞边界、没有大面积包含周围组织,如果框整体偏小或偏大,说明标注或转格式过程有问题,趁早发现比训练完再排查省力得多。

2.4 类别与场景分布:单类别数据集的任务边界

整个数据集只有一个类别Lymphocyte,这既是优势也是边界。优势在于训练简单,不需要做类别不平衡处理,直接训练收敛快。边界在于它做不了后续的亚型分析——你不能从这套数据知道某个淋巴细胞是 CD3 阳性还是 CD20 阳性。如果项目需求是“辅助诊断淋巴瘤并区分 T/B 细胞来源”,这套数据只能作为第一阶段的检测模型,第二阶段需要额外标注 CD3/CD20 的类别信息。摘要描述里也明确了它的应用场景是“识别病理切片中的淋巴细胞,辅助医生评估免疫微环境”,所以拿到数据后先想清楚需求再动手,单类别模型和细粒度分类模型的训练管线差别不小。

3. 把数据集跑进 YOLOv8:环境配置、data.yaml 与训练参数

3.1 解压与目录规划:unzip 之后先做这两件事

这一步看似基础,但我在处理 Roboflow 导出的数据时踩过坑。压缩包解压到 Linux 服务器上,unzip是最直接的方式:

mkdir -p ~/projects/lymphocyte_detection cd ~/projects/lymphocyte_detection unzip lymphocyte_dataset.zip -d ./lymphocyte_dataset

如果解压报错“Invalid or unsupported zip format”,大概率是 Windows 下压缩的 zip 带了特殊标记,可以用 7z 兜底:

7z x lymphocyte_dataset.zip -oly mphocyte_dataset

解压后第一件事是确认目录完整性:检查train/labels下的 txt 数量和train/images下的 jpg 数量是否一致,差一个都会在训练时报找不到标注文件。我一般用一条命令快速核对:

cd ~/projects/lymphocyte_detection find ./lymphocyte_dataset/train/images -name "*.jpg" | wc -l find ./lymphocyte_dataset/train/labels -name "*.txt" | wc -l

两个数字对不上,先回到解压环境排查,别急着开训练。第二件事是确认 txt 内容格式,随机挑一个用cat查看:

cat ./lymphocyte_dataset/train/labels/xxx.txt

正常输出是一行五个数字,例如0 0.3125 0.6789 0.0234 0.0312。如果你看到的是Lymphocyte 0.31 0.67 0.02 0.03这种带类别名的格式,说明导出的不是纯 YOLO 格式,需要先做一次类别名到 ID 的映射转换,YOLO 训练时读的是数字 ID,不是字符串。这两种格式我在不同数据集里都碰到过,0.1 秒的确认能省下一下午的排错时间。

3.2 写 data.yaml:路径、类别与训练/验证/测试指向

YOLOv8 系列训练时需要一个data.yaml文件告诉训练器三件事:数据路径、类别数量、类别名称。先看标准写法:

path: ./lymphocyte_dataset train: train/images val: valid/images test: test/images nc: 1 names: 0: Lymphocyte

这里有几个细节容易错。path字段是基准路径,如果设置成相对路径,YOLO 会以当前工作目录为基准拼接train/images;如果设置成绝对路径,就写死机器上的位置。我一般推荐写成相对路径,方便把整个项目目录打包带走。nc: 1表示单类别,names的长度必须等于nc,类别名可以自由起,但必须和标注文件里的 ID 一一对应。test字段不是必须的,训练阶段只用trainvaltest是后续评估专用。如果你拿到手的压缩包只给了 train 和 valid,test 目录不存在,就把test那行删掉,不影响训练。

3.3 启动训练:YOLOv8s 起步,显存不够就换 nano

环境用 ultralytics 官方包,一条命令装完:

pip install ultralytics

然后启动训练:

cd ~/projects/lymphocyte_detection yolo detect train \ model=yolov8s.pt \ data=data.yaml \ epochs=100 \ imgsz=640 \ batch=16 \ device=0 \ seed=42

逐个解释参数。model=yolov8s.pt选择预训练权重作 backbone,s 版本在速度和精度之间最均衡。如果你的显卡显存只有 8G,把模型换成yolov8n.pt,精度掉一点但训练和推理都快很多。imgsz=640是输入分辨率,淋巴细胞的直径在 HE 切片上通常只有 10-20 像素,640 的分辨率对单细胞检测偏小,我建议显存够就拉高到 960,这个后面避坑章细说。batch=16按显存容量调整,太大直接 OOM,太小训练慢。device=0指定第一块 GPU,没 GPU 就删掉这行用 CPU 跑,但 1,152 张图 CPU 训练会非常痛苦,不推荐。seed=42固定随机种子,确保两次训练结果可复现,这个对论文和实验对比很重要。

启动后终端会打印每轮的 loss 和 mAP 指标,同时生成runs/detect/train目录,里面存了权重、日志和训练曲线。首次训练建议先跑 20 个 epoch 验证流程通不通,再跑满 100 个,避免第三天发现数据路径配错导致白跑。

3.4 训练过程监控:日志、曲线与断点续训

训练不是启动完就撒手不管。前 10 个 epoch 重点看两处:loss是否在下降,val的 mAP 是否从 0 开始抬升。如果 loss 在 1.5 附近震荡超过 10 个 epoch,大概率是学习率或数据问题。ultralytics 默认会自动做 cosine 学习率衰减,前 3 个 epoch 是 warmup,所以前期 loss 有波动是正常的,但 20 个 epoch 后仍无明显下降趋势就要干预了。断点续训用以下命令:

yolo detect train \ model=runs/detect/train/weights/last.pt \ data=data.yaml \ epochs=100 \ imgsz=640 \ batch=16 \ device=0

注意model参数换成last.pt,训练进度会从断点继续,但 epochs 记得改成总轮数而不是剩余轮数,否则会自动停下来。训练结束后,best.pt是验证集指标最优的权重,last.pt是最后一个轮次的权重,我一般只保留best.pt

4. 验证结果与模型落地:从 mAP 到 ONNX 导出的完整链路

4.1 验证集指标解读:mAP50、mAP50-95 与医学场景的取舍

训练完第一件事是跑验证集,看看模型在没见过的数据上的真实水平:

yolo detect val \ model=runs/detect/train/weights/best.pt \ data=data.yaml

终端会打印mAP50mAP50-95precisionrecall四项指标。病理检测场景里,我更看重recall,因为漏掉一个淋巴细胞意味着诊断信息的丢失,而误检的框医生还能在复核时发现。recall 低时优先降低置信度阈值或提高输入分辨率。mAP50-95 是一个更严格的综合指标,对框的位置精度敏感,淋巴细胞这种小目标,mAP50-95 通常只有 mAP50 的 6-8 成,如果差距太大说明框定位有系统偏差,检查标注框和报告坐标是否一致。

4.2 用 predict 跑一张 HE 图:可视化与阈值调整

验证集跑完,挑一张测试图像的检测结果直观感受下:

yolo predict \ model=runs/detect/train/weights/best.pt \ source=test/images/xxx.jpg \ conf=0.25 \ save=True

conf=0.25最低置信度阈值,高于这个值的框才会输出。病理切片上标注噪声相对大,建议先 0.25 偏低跑,看漏检有多少,再逐步提升到 0.5 观察误检比例。用 Python 推理可以拿到更细的中间结果:

from ultralytics import YOLO model = YOLO("runs/detect/train/weights/best.pt") results = model.predict( source="test/images/xxx.jpg", conf=0.25, iou=0.45, save=True, ) boxes = results[0].boxes for box in boxes: x1, y1, x2, y2 = box.xyxy[0].tolist() score = box.conf[0].item() print(f"bbox=({int(x1)}, {int(y1)}, {int(x2)}, {int(y2)}) conf={score:.3f}")

iou=0.45是 NMS 的 IoU 阈值,细胞密集场景下框很容易互相重叠(两个淋巴细胞挨在一起),这个值设太高会把相邻框误合并成一个,设太低则同一个细胞出多个框。我一般从 0.45 开始调,密集团块数据调到 0.3 效果更好。

4.3 导出 ONNX 与部署前的后处理

模型要落地到病理辅助诊断系统,PyTorch 权重通常不够。ultralytics 一行导出 ONNX:

yolo export model=runs/detect/train/weights/best.pt format=onnx opset=12

导出的best.onnx可以直接用 ONNX Runtime 推理,不需要再依赖 PyTorch 环境。部署时注意输入分辨率必须和训练时一致:训练用imgsz=640,推理时就 resize 到 640;如果部署管线里用别的分辨率,结果会明显变差。病理图像通常是大尺寸(几千乘几千),常见做法是先把整图切成 patch,逐 patch 推理,再把坐标映射回原图坐标系,这一步推荐用slice-inference这类小工具,能省掉自己写 overlap 逻辑的时间。如果只做研究不部署,这章看到这里就够了,直接跳到下一章避坑。

5. 避坑与排查:病理切片检测的五个真实教训

5.1 训练不收敛:loss 不降或直接 NAN

现象:train loss 在前 10 个 epoch 里从 2.1 掉到 1.9 后横住不动,val loss 反而上升;严重时 loss 变成 NAN。 原因:学习率过高导致梯度震荡;输入分辨率太低,淋巴细胞特征被下采样糊掉。 解决:先把学习率降到lr0=0.001,开warmup_epochs=5;同时把imgsz从 640 提到 960,让单个细胞的像素面积更大。改完再跑 20 个 epoch,loss 明显稳步下降再继续。医学小目标数据集上,我遇到的不收敛案例 80% 是分辨率问题,不是网络结构问题。

5.2 验证集高分、测试集翻车:数据泄露这一关

现象:val mAP50 到了 0.85,test 一跑只有 0.4,差了一倍。 原因:数据划分时按图像随机分配,同一个切片(文件名里的 193、167 那些编号)的相邻 patch 同时进了训练集和测试集,模型相当于“看过”测试图的一部分区域。 解决:重新做数据划分,按文件名中的病例编号分组,同一个编号的所有 patch 必须全部进同一集合。用 python 脚本按编号切分,例如编号 193 的 patch 全进训练集、编号 222 的全进测试集。我自己的血泪经验是:病理切片数据集任何时候都先按病例分组划分,再谈训练。

5.3 密集细胞簇漏检严重:小目标与 NMS 的博弈

现象:单张图里有 50 个淋巴细胞聚成一团,模型只检出 15 个,且漏掉的大多是紧挨着的相邻细胞。 原因:默认 anchor 尺寸偏大,对直径 20-40 像素的小目标不敏感;NMS 阈值太高导致相邻细胞的框被合并。 解决:把imgsz提高到 960 甚至 1280,iou=0.3降低 NMS 合并倾向。还可以用 ultralytics 的自动 anchor 优化脚本重新统计数据集的框尺寸分布。最直接的做法是看results的框尺寸直方图,如果绝大多数框宽高在 20 像素以下,就考虑用更高倍率切图或者小目标检测专用模型。

5.4 显存溢出:batch、imgsz 与梯度累加

现象:RuntimeError: CUDA out of memory。 原因:imgsz=960batch=16叠加后显存超了。 解决:先降batch=8,再不行开梯度累加。ultralytics 没有内置的 accumulate 参数,但可以在 pyTorch 里手动模拟:每 2 个 batch 更新一次梯度。其实最省事的策略是换成yolov8n.pt,显存占用能砍一半,精度掉 2-3 个点,对于淋巴细胞检测这种单类任务影响不大。显存不足时优先换小模型,不要急着降分辨率。

5.5 换一台机器推理时误检暴增:染色差异与数据增强陷阱

现象:训练集验证 mAP 0.8,把模型放到另一家医院的切片上推理,框出来一片假目标。 原因:数据增强里的hsv_hhsv_s随机变换把 HE 切片的颜色分布拉得过宽,模型学到的是颜色不变性而非形态特征;新切片的染色条件和训练集差异巨大,产生了分布外偏移。 解决:训练时调低增强参数,hsv_h=0.01hsv_s=0.2,甚至关掉;更稳的方案是推理前对新数据做染色归一化,把色调映射到训练集的分布上。病理染色差异是这类数据集最大的坑,没有之一,模型精度再高换个染色批次照样翻车,所以增强参数宁保守不要激进。

6. 进阶:用检测结果做淋巴细胞计数与免疫评分

6.1 从 bbox 到细胞计数

检测的最终目的是计数。模型跑完一张图,框的数量近似等于淋巴细胞数量,但直接数框容易把低置信度误检也数进去。我会在计数时额外加一个稍高的置信度门槛:

from ultralytics import YOLO model = YOLO("best.pt") results = model.predict( source="whole_slide_patch/001.jpg", conf=0.4, iou=0.3, verbose=False, ) boxes = results[0].boxes count = len(boxes) print(f"lymphocyte count: {count}") # 计算细胞密度 area_cm2 = 0.0125 # 单视野面积,单位平方厘米 density_per_cm2 = count / area_cm2 print(f"density: {density_per_cm2:.1f} cells/cm2")

这里的conf=0.4比推理阈值高,是为了过滤低质量检测。area_cm2需要根据切片实际面积换算,不同显微镜参数差异很大,直接写死数值复现不了,得用你自己显微镜的视场直径算。

6.2 从单类扩展到 CD3/CD20 亚型分析

当前数据是单类Lymphocyte,但文件名里的CD3CD20提示这批切片来自双标染色。如果你的后续研究需要区分 T 细胞和 B 细胞,可以在这个数据集的基础上做二次标注:把Lymphocyte细分为CD3+CD20+两类,然后继续用 YOLO 训练。这种做法比从零收集数据省事,因为位置信息已经标好了,只需要在现有 bbox 上追加类别属性。标注工具用 labelImg 或 Roboflow 都行,别手动改 txt,容易把坐标改坏。

6.3 固定随机种子,让实验不再是玄学

同一个数据集反复训练,两次结果差距很大,这种情况十有八九是随机种子没固定。YOLO 训练命令里显式传seed=42,NumPy 和 PyTorch 的随机种子也要在脚本开头固定:

import random import numpy as np import torch random.seed(42) np.random.seed(42) torch.manual_seed(42) torch.cuda.manual_seed_all(42)

从那以后,我每次换新数据集都会强制走一遍“先固定种子 → 再训练 → 再人工核对 20 张可视化结果”这个流程,一步都不省。实验对比时能明确知道指标差异来自模型改进而不是随机噪声。希望帮到你。

本文还有配套的精品资源,点击获取

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/24 21:19:57

小批量包装如何做出高口碑?五家样本企业的打法与成本控制

做了十几年包装印刷,早年间听到最多的一句话是:“你这么点量,连一包矿泉水的外箱都凑不齐,谁会给你开机?”那时候,小批量在供应链里就是个尴尬词,工厂不想接,采购不敢找,…

作者头像 李华
网站建设 2026/9/24 21:19:24

基于Spring Boot的智能物流管理系统设计与实现全指南

做毕业设计或者课程设计,选择“基于Spring Boot的智能物流管理系统”这个题目的人非常多。原因很简单:物流行业是当下真正在大量使用信息系统的领域,选题有真实业务背景,不是空架子;Spring Boot又是Java后端招聘和毕设…

作者头像 李华
网站建设 2026/9/24 21:19:09

基于FPGA的AM信号调制度测量系统设计与实现

这篇稿子拖了挺久。前阵子做了一个基于FPGA的调制度测量系统,从方案设计到仿真、上板调试,前后折腾了一个多月,中间踩了不少坑。趁着记忆还热乎,把整个过程整理成手记,工程代码也做了详细注释,希望能给做信…

作者头像 李华
网站建设 2026/9/24 21:18:52

文献综述高效写作指南:9款工具实测与全流程实操

1. 文献综述为什么难写:9款工具到底在帮你解决什么问题毕业论文里最磨人的一关,十个人有九个会说是文献综述。我当年写硕士论文的时候,光是文献综述就拖了一个半月。不是不想写,是真的无从下手:文献库检索出来几百篇论…

作者头像 李华
网站建设 2026/9/24 21:18:45

YOLOv8捕鱼识别实战:1813张数据集从标注检查到模型训练全流程

简介:这是一套面向YOLO系列目标检测任务的捕鱼识别数据集,适合需要训练、验证或测试渔业检测模型的算法工程师与研究者,可直接用于智慧渔场、捕捞监控等场景。压缩包内标注文件共2000个,含1584个XML与416个TXT,分别对应…

作者头像 李华
网站建设 2026/9/24 21:18:36

我靠这套脚本搞定自媒体批量改写,绕开了90%的审核坑

上周运营组扔过来270篇历史旧稿,要求3天内改完过平台原创校验,我头直接大了一圈。之前手动改个十几篇我还能摸鱼做完,这次量翻了十几倍,硬扛肯定不现实。前后花了一天半搭完这套自动化的自媒体批量改写流水线,踩了一堆…

作者头像 李华