
简介本资源为YOLO红细胞目标检测数据集面向从事医学图像检测、目标检测算法学习与课程实践的学生和开发者帮助解决红细胞识别任务中数据获取与标注格式转换的问题。压缩包共2000个文件约19.82MB包含1000张真实场景高质量图片以及对应的vocxml、cocojson和yolotxt三种格式标签另附yaml配置文件、划分脚本与训练教程网页可直接接入YOLO系列模型训练。资源还提供训练集、验证集、测试集划分脚本支持按需重新划分数据并附Linux与Windows环境搭建及训练案例教程便于快速复现和迁移到自有数据集。目前已有347人学习下载适合需要完整标注数据、格式转换参考和训练流程指引的目标检测入门与进阶读者。1. 红细胞检测数据集怎么选1000 张真实场景图 三格式标签能省掉多少标注时间做血涂片红细胞检测的同行都清楚公开数据集里能直接拿来训 YOLO 的少之又少。要么只有几十张图不够收敛要么标注格式单一拿到手还得自己写转换脚本。这份 YOLO 红细胞目标检测数据集给的是 1000 张真实场景图片标注工具用的是 labelImg同时提供 VOC 的 xml、COCO 的 json 和 YOLO 的 txt 三种格式标签分别放在独立文件夹里。这意味着不管你是跑 YOLOv5、YOLOv8 还是更早的 v3标签都能直接对上不用再折腾格式转换。配套还给了数据集划分脚本和 Linux、Windows 两个平台的 YOLO 环境搭建与训练教程对刚接触目标检测、想拿一个完整小数据集跑通全流程的人比较友好。下面按「数据集结构 → 划分脚本 → 训练配置 → 避坑 → 进阶验证」的顺序拆一遍。2. 数据集结构与三种标签格式先搞清楚每个文件夹在干什么2.1 目录布局与文件对应关系拿到压缩包解压后常见做法是先别急着改代码把目录树看一遍。这份资源的典型结构大致如下不同版本可能略有差异以实际解压为准红细胞数据集/ ├── JPEGImages/ # 1000 张原始图片 ├── Annotations/ # VOC 格式 xml 标签 ├── labels/ # YOLO 格式 txt 标签 ├── coco/ # COCO 格式 json 标签 ├── ImageSets/ │ └── Main/ # 划分后的 train/val/test txt ├── split_train_val.py # 生成 ImageSets 下 txt 的脚本 ├── 训练集、验证集划分脚本.py # 按比例划分图片和标签到新文件夹 └── train_list.txtVOC 的 xml 里存的是绝对坐标xmin, ymin, xmax, ymaxYOLO 的 txt 存的是归一化后的class_id cx cy w hCOCO 的 json 则是[x, y, width, height]加类别 id。三种格式描述的是同一批标注框只是坐标系和存储方式不同。红细胞检测通常只有一个类别所以 class_id 基本都是 0这一点在写 data.yaml 时要注意别写成 1 导致训练时类别数对不上。2.2 三种格式的读取与校验在正式训练前我一般会先写个小脚本抽查几张图确认标签和图片能对上。下面这段代码同时读三种格式打印同一张图的标注框用来验证转换有没有错位import xml.etree.ElementTree as ET import json import os from PIL import Image img_id 000001 # 换成实际图片名 img_path fJPEGImages/{img_id}.jpg w, h Image.open(img_path).size # VOC xml tree ET.parse(fAnnotations/{img_id}.xml) for obj in tree.findall(object): bnd obj.find(bndbox) xmin float(bnd.find(xmin).text) ymin float(bnd.find(ymin).text) xmax float(bnd.find(xmax).text) ymax float(bnd.find(ymax).text) print(VOC:, xmin, ymin, xmax, ymax) # YOLO txt with open(flabels/{img_id}.txt) as f: for line in f: cls, cx, cy, bw, bh map(float, line.split()) # 反归一化回像素坐标方便和 VOC 对比 print(YOLO:, (cx-bw/2)*w, (cy-bh/2)*h, (cxbw/2)*w, (cybh/2)*h) # COCO json with open(coco/annotations.json) as f: coco json.load(f) for ann in coco[annotations]: if ann[image_id] int(img_id): x, y, bw, bh ann[bbox] print(COCO:, x, y, xbw, ybh)逻辑说明VOC 直接读像素坐标YOLO 的cx, cy, w, h是相对整图宽高的比例乘回w, h才能和 VOC 对齐COCO 的 bbox 是左上角坐标加宽高。三个输出如果数值接近说明标签一致。参数上唯一要改的是img_id换成你实际抽查的图片名即可。如果发现某个格式明显偏移优先检查图片是否被 resize 过而标签没同步更新。2.3 类别定义与 data.yaml红细胞数据集一般只有一个类别data.yaml 写法如下path: ./红细胞数据集 train: ImageSets/Main/train.txt val: ImageSets/Main/val.txt test: ImageSets/Main/test.txt nc: 1 names: [RBC]nc是类别数红细胞只有一类就写 1。names里的名字随意但训练和推理时要保持一致。常见翻车点是nc写了 2 但标签里只有 0训练时不会报错但 mAP 会异常低排查半天才发现是类别数写错。3. 划分脚本怎么用从 ImageSets 到独立 train/val/test 文件夹3.1 split_train_val.py 生成索引文件资源里给了split_train_val.py作用是在ImageSets/Main/下生成train.txt、val.txt、test.txt里面存的是图片名不带扩展名。典型实现如下import os import random xml_dir Annotations save_dir ImageSets/Main trainval_rate 0.9 # 训练验证占总数据比例 train_rate 0.9 # 训练占 trainval 的比例 os.makedirs(save_dir, exist_okTrue) names [f[:-4] for f in os.listdir(xml_dir) if f.endswith(.xml)] random.seed(42) # 固定随机种子保证可复现 random.shuffle(names) trainval_num int(len(names) * trainval_rate) train_num int(trainval_num * train_rate) trainval names[:trainval_num] test names[trainval_num:] train trainval[:train_num] val trainval[train_num:] for name, subset in zip([train, val, test], [train, val, test]): with open(os.path.join(save_dir, f{subset}.txt), w) as f: f.write(\n.join(subset))逻辑说明先按trainval_rate切出训练验证集和测试集再从 trainval 里按train_rate切出训练集和验证集。random.seed(42)是关键固定种子后每次运行划分结果一致方便复现实验。参数上1000 张图常见做法是 8:1:1即trainval_rate0.9、train_rate0.89左右这样 train 约 800 张、val 约 100 张、test 约 100 张。如果数据量更小可以调成 7:2:1验证集大一点更能反映泛化。3.2 按划分结果把图片和标签复制到新文件夹split_train_val.py只生成索引真正训练时有些框架要求图片和标签放在独立目录。资源里另一个「训练集、验证集划分脚本图片标签划分写入新文件夹.py」就是干这个的import os import shutil img_dir JPEGImages label_dir labels out_root dataset_split splits [train, val, test] for s in splits: os.makedirs(f{out_root}/images/{s}, exist_okTrue) os.makedirs(f{out_root}/labels/{s}, exist_okTrue) with open(fImageSets/Main/{s}.txt) as f: names [line.strip() for line in f if line.strip()] for name in names: shutil.copy(f{img_dir}/{name}.jpg, f{out_root}/images/{s}/{name}.jpg) shutil.copy(f{label_dir}/{name}.txt, f{out_root}/labels/{s}/{name}.txt)逻辑说明读索引文件逐张把图片和对应 txt 复制到dataset_split/images/{split}和dataset_split/labels/{split}。用shutil.copy而不是move保留原始数据改划分比例时不用重新解压。参数上out_root可以改成你训练目录下的datasets路径。注意标签文件名必须和图片名一致否则 YOLO 找不到标签训练时会把该图当负样本处理loss 会异常。3.3 划分后的自检划分完别直接开训先数一下三个子集的图片数和标签数是否相等for s in train val test; do echo $s images: $(ls dataset_split/images/$s | wc -l) echo $s labels: $(ls dataset_split/labels/$s | wc -l) done如果某个子集图片数和标签数不一致说明有图片没有对应标签或者标签文件名写错。红细胞数据集里偶尔会有空标签文件图片里没有目标这种图在 YOLO 里是合法的负样本但数量不能太多否则模型会偏向预测背景。4. 训练配置与参数Linux 和 Windows 两条路怎么走4.1 环境搭建的差异点资源里分别给了 Linux 和 Windows 的环境搭建教程。Linux 版本通常基于 Ubuntu用 conda 建虚拟环境后装 PyTorch 和 ultralyticsWindows 版本则要注意 CUDA 版本和显卡驱动匹配。常见做法是conda create -n yolo_rbc python3.9 -y conda activate yolo_rbc pip install torch torchvision --index-url https://download.pytorch.org/whl/cu118 pip install ultralyticscu118对应 CUDA 11.8如果你的驱动只支持到 11.6就换成cu116。Windows 下如果 pip 装 torch 很慢可以先下 whl 再本地安装。这一步的坑在于装完 torch 后一定要验证torch.cuda.is_available()返回 True否则训练会跑在 CPU 上1000 张图一轮可能要几十分钟。4.2 训练命令与关键参数以 YOLOv8 为例训练命令如下yolo detect train \ data红细胞数据集/data.yaml \ modelyolov8n.pt \ epochs100 \ imgsz640 \ batch16 \ lr00.01 \ patience20 \ projectruns/rbc \ nameexp1参数说明modelyolov8n.pt用 nano 版预训练权重红细胞检测任务简单nano 版通常够用显存小也能跑imgsz640是输入尺寸红细胞在血涂片里尺寸差异大640 是精度和速度的平衡点batch16在 8G 显存下比较稳显存不够就降到 8lr00.01是初始学习率小数据集不建议太大patience20表示 20 轮没提升就早停避免过拟合。如果训练 loss 震荡厉害先把lr0降到 0.001 试试。4.3 训练过程要看哪些指标训练日志里重点看三个box_loss、cls_loss和mAP50。红细胞只有一类cls_loss应该很快降到接近 0box_loss反映框回归质量如果一直不降检查标签坐标有没有归一化错误。mAP50在验证集上能到 0.9 以上说明标注质量不错。如果mAP50很低但 loss 在降常见原因是验证集和训练集分布差异大或者类别数配置错误。5. 避坑与排查红细胞数据集训练时最容易翻车的五件事5.1 现象训练一开始 loss 就是 nan原因学习率过大或者标签里有坐标超出 [0,1] 范围。YOLO 的 txt 标签要求cx, cy, w, h都在 0 到 1 之间如果某张图的标注框超出图片边界归一化后可能大于 1 或小于 0。解决先跑一遍标签检查脚本把所有越界框找出来。常见做法是遍历 labels 目录对每行判断四个值是否在 [0,1] 内越界的直接修正或删除该标注。同时把lr0从 0.01 降到 0.001 再试。5.2 现象mAP 一直是 0原因data.yaml 里的nc和标签里的 class_id 不匹配或者train/val路径写错导致读不到数据。解决先确认nc: 1再检查标签文件里第一列是不是都是 0。路径方面YOLOv8 的path是数据集根目录train是相对路径如果写成绝对路径要注意斜杠方向。Windows 下路径用反斜杠容易出问题统一用正斜杠。5.3 现象验证集图片数和标签数对不上原因划分脚本按 xml 文件名生成索引但复制时只复制了图片没复制标签或者标签扩展名不是.txt。解决跑一遍 3.3 节的自检命令找出缺失的标签。如果是空标签图片里没有红细胞可以保留但控制比例在 5% 以内如果是文件名不一致批量重命名对齐。5.4 现象训练到一半显存爆了原因batch设太大或者imgsz设太高。红细胞图片如果分辨率很高640 的输入可能不够但调到 1280 显存翻倍。解决先把batch降到 8 或 4再考虑用imgsz640配合多尺度训练。如果必须用大尺寸可以开混合精度ampTrue能省不少显存。5.5 现象推理时框的位置整体偏移原因训练时用了 letterbox 填充推理时没有做同样的预处理导致坐标映射回原图时偏移。解决用 ultralytics 的predict接口时框架会自动处理 letterbox不用手动改。如果是自己写推理脚本要按原图宽高比缩放后再映射别直接按 640 映射。6. 进阶验证用混淆矩阵和 PR 曲线判断数据集能不能直接用训练完别只看 mAP 就下结论。YOLO 训练结束后会在runs/rbc/exp1/下生成confusion_matrix.png和PR_curve.png。红细胞只有一类混淆矩阵应该是 2x2背景 RBC重点看 RBC 被误判成背景的比例。如果这个比例高说明模型漏检多可能是标注框太小或者训练轮数不够。PR 曲线看曲线下的面积如果曲线在低召回区就掉下来说明高置信度下漏检少但低置信度下误检多实际部署时可以把置信度阈值调高。另一个验证方法是拿几张没参与训练的图片跑推理肉眼比对框的位置。我一般会抽 10 张用yolo detect predict批量跑然后写个脚本把预测框画到原图上和原始标注对比。如果预测框和标注框 IoU 普遍在 0.7 以上这份数据集就可以直接用于后续实验如果偏差大先回头查标签格式别急着换模型。从那以后我每次拿到新数据集都强制先跑一遍标签校验和划分自检再开始训练。这份红细胞数据集三种格式齐全省掉了最耗时的格式转换但划分比例和类别数这两处还是得自己确认一遍。希望帮到你。本文还有配套的精品资源点击获取