ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

YOLO红细胞数据集详解:标签格式、划分脚本与训练避坑

YOLO红细胞数据集详解:标签格式、划分脚本与训练避坑 简介面向目标检测入门与医学图像实验场景YOLO红细胞目标检测数据集收录1000张真实场景红细胞图片并分别提供VOCxml、COCOjson和YOLOtxt三种格式标签覆盖场景丰富、标注质量较高可直接用于YOLO系列模型训练与效果验证。压缩包内共2000个文件以xml、txt格式的检测标签为主同时包含yaml配置文件、Python划分脚本及HTML格式的YOLO环境搭建与训练教程整体约19.82MB便于快速下载查阅。已有347人学习使用适合需要数据集进行目标检测实践的高校学生、课程学习者及算法研究人员。随包附赠Linux与Windows双版本环境搭建教程和训练案例并配有训练集、验证集、测试集划分脚本用户可根据自身数据规模灵活拆分数据集减少从标注到训练的上手成本是入门YOLO红细胞检测任务的一套紧凑资料。1. 这份红细胞数据集能让你少走两个月弯路做目标检测的人最烦的一件事就是模型结构调得差不多了结果卡在数据集上。自己标注几百张图标到眼花不说标完还得写脚本转格式、划分训练集验证集一套流程走下来两周时间没了。我拿到这份 YOLO 红细胞目标检测数据集时第一反应是终于能把精力放在模型本身而不是数据工程上了。这份资源包含 1000 张真实场景下的红细胞图片难点在于细胞粘连、边缘模糊、背景噪声大属于典型的小目标检测场景。最省心的是它同时给了 VOCxml、COCOjson、YOLOtxt三种格式的标签分别放在不同文件夹下意味着你不需要自己写格式转换脚本拿过来就能喂给 YOLOv5、YOLOv8 或者最新版的 YOLO11。此外还附带了三个数据集划分脚本和完整的环境搭建、训练教程文档覆盖 Linux 和 Windows 两种系统。适合谁两类人一是刚接触 YOLO 目标检测、想找个现成数据集跑通整个训练流程的新手二是做医学图像分析、细胞检测方向需要基准数据验证算法效果的从业者。这篇笔记我会从数据集结构讲到训练流程再把我实际操作中踩过的坑逐个拆给你看。2. 数据集结构拆解三种标签格式的本质与取舍2.1 拿到压缩包后先看清目录组织解压之后你会看到一堆 HTML 教程文件和 .py 脚本还有图片和标签文件夹。先说整体结构这份资源的目录大概是这样的. ├── 1、YOLO环境搭建Windows版本.html ├── 2、YOLO训练教程Windows版本根据案例修改训练自己的数据集.html ├── 1、YOLO环境搭建Linux版本.html ├── 2、YOLO训练教程Linux版本根据案例修改训练自己的数据集.html ├── 1、Linux之Ubuntu环境安装教程.html ├── 训练集、验证集、测试集划分脚本图片标签划分写入新文件夹.py ├── 训练集、验证集划分脚本图片标签划分写入新文件夹.py ├── split_train_val生成ImageSets下txt文件划分脚本.py ├── train_list.txt ├── JPEGImages/ # 图片 ├── Annotations/ # VOC 格式的 xml 标签 ├── COCO/ # COCO 格式的 json 标签 └── YOLO/ # YOLO 格式的 txt 标签图片在 JPEGImages 文件夹下xml、json、txt 三种标签分别在各自的文件夹里。文件名一一对应比如一张图叫001.jpg那它的标签就是001.xml、001.json和001.txt。这种组织方式在目标检测数据集里很常见跟公开的 VOC 数据集目录风格一致熟悉常规数据集的不会陌生。train_list.txt 这个文件很重要里面列了用于训练的图片文件名清单。有的划分脚本会读取这个文件来决定哪些图进训练集我建议你先打开看看格式——每行一个文件名不带路径带不带扩展名都行取决于脚本里怎么处理的。2.2 三种标签格式到底什么关系同一个标注信息用三种格式表达。VOC 格式是 xml一个文件对应一张图里面是object节点每个object里包含name类别名和bndbox左上角右下角坐标。COCO 格式是单个 json 文件汇总所有图片的标注信息用images、annotations、categories三个数组组织。YOLO 格式是每张图一个 txt每行一个目标格式是类别 中心点x 中心点y 宽 高全部归一化到 0~1。三种格式的坐标表达本质不同我列个表方便你对比格式文件内容坐标类型坐标含义VOC (xml)每图一个文件绝对值xmin, ymin, xmax, ymaxCOCO (json)全部图一个文件绝对值xmin, ymin, width, heightYOLO (txt)每图一个文件归一化cx, cy, w, h除以图宽高用 YOLO 格式训练时有个细节容易被忽略YOLO 的 txt 里坐标是归一化的训练时模型读入后要乘以图片宽高还原成像素坐标。如果归一化算错了或者图片实际尺寸和你脚本里读的不一致模型训练出来的框全偏。我拿到数据第一件事是写个小脚本检查标签和图片是否对得上确认没有空 xml、没有越界框。这是血泪教训换来的习惯——之前用过一份公开数据集训练到一半发现 Loss 异常偏高排查了半天结果是一批标签的归一化坐标算错了。2.3 写个快速校验脚本确认标签质量这份资源自带的是 Text 标签文件如果你看过不好直接判断可以用下面这段 Python 脚本快速检查YOLO 格式标签的参数是否都在合理范围内import os img_dir JPEGImages label_dir YOLO img_files set(os.listdir(img_dir)) label_files set(os.listdir(label_dir)) # 找出有图没标签、有标签没图的文件 only_img img_files - label_files only_label label_files - img_files if only_img: print(f警告: {len(only_img)} 张图片缺少标签) if only_label: print(f警告: {len(only_label)} 个标签缺少图片) # 检查标签内容格式 for f in sorted(label_files)[:50]: path os.path.join(label_dir, f) with open(path, r, encodingutf-8) as fh: lines fh.readlines() for line in lines: parts line.strip().split() if len(parts) ! 5: print(f{f} 格式错误: {line.strip()}) continue cls, cx, cy, w, h int(parts[0]), float(parts[1]), float(parts[2]), float(parts[3]), float(parts[4]) # 归一化坐标必须在 0~1 之间宽高不能为 0 if not (0 cx 1 and 0 cy 1 and 0 w 1 and 0 h 1): print(f{f} 坐标越界: cx{cx}, cy{cy}, w{w}, h{h})检查逻辑分三个层次先对文件名再检查每行长度是否为 5class, cx, cy, w, h最后检查归一化坐标范围。50 个样本不够就全量检查遍历所有标签也就几秒钟。这段脚本我反复用过因为标签文件是直接训练的前提文件名对不上会导致训练脚本直接报错找不到图片。3. 划分脚本实战训练集、验证集、测试集怎么分最合理3.1 三个脚本的分工差异资源包里给了三个划分脚本用途不同新手容易搞混第一个是训练集、验证集、测试集划分脚本图片标签划分写入新文件夹.py它把图片和对应标签按比例复制到train/、val/、test/三个新文件夹里图片和标签同步移动形成独立的目录结构。第二个是训练集、验证集划分脚本图片标签划分写入新文件夹.py只分训练集和验证集两部分适合不需要测试集的实验场景。第三个是split_train_val生成ImageSets下txt文件划分脚本.py它的产物不是新的文件夹而是在ImageSets/Main/下生成train.txt、val.txt、test.txt三个文件内容分别是各集合的文件名列表模仿的是 VOC 数据集的目录结构。YOLO 官方仓库默认不直接使用这种组织方式需要配合自定义 Dataset 类去读。我个人的习惯做法是如果只是验证 YOLO 模型能不能跑通用第二个脚本分 train/val 就够了如果要评估最终模型在新数据上的表现必须保留 test 集合用第一个脚本。3.2 修改脚本关键参数的落地操作这三个脚本我都在 Windows 和 Linux 上跑过参数修改逻辑是一样的核心要改的部分就三处输入路径、输出路径、划分比例。下面以训练集验证集测试集三划分的脚本为例说明。打开任意文本工具、编辑器你就能看到脚本头部有类似这样的内容import os import shutil import random # 需要修改的部分路径和比例 image_dir JPEGImages # 原始图片路径 label_dir Annotations # 假设这里放 VOC 格式标签 output_dir dataset_split # 划分后输出的根目录 train_ratio 0.8 # 训练集比例 val_ratio 0.1 # 验证集比例 # test_ratio 1 - train_ratio - val_ratio 0.1三个比例加起来的和必须等于 1否则样本会丢。比如 0.8 0.1 0.1 就是 80% 训练、10% 验证、10% 测试。1000 张图片对应下来就是 800/100/100这个数据量对小目标检测来说略微偏少但做算法验证和教学案例绰绰有余了。接下来随机划分部分原理如下先通过os.listdir()拿到所有图片的文件名再用random.seed()固定随机种子、random.shuffle()打乱顺序然后按比例切片最后用shutil.copy2()把图片和同名标签考到新目录下。random.seed(42) # 固定随机种子保证每次运行划分结果一致 random.shuffle(file_list) train_files file_list[:int(len(file_list) * train_ratio)] val_files file_list[int(len(file_list) * train_ratio): int(len(file_list) * (train_ratio val_ratio))] test_files file_list[int(len(file_list) * (train_ratio val_ratio)):]固定随机种子这个操作很关键。如果脚本里没有random.seed()每次划分的结果都不一样你昨天训练和今天训练的图片组合完全不同实验对比就没有意义了。手动补上一行random.seed(42)就行。如果要把三种格式的标签都划分过去脚本里的label_dir需要从Annotations改为YOLO或COCO或者写一个循环把三个标签文件夹都拷一遍。实际做法可以给label_dirs设一个列表label_dirs [Annotations, COCO, YOLO] for ld in label_dirs: for sub in [train, val, test]: os.makedirs(os.path.join(output_dir, ld, sub), exist_okTrue) for fn in train_files: ...这个思路很简单但可以让你在一个脚本里同时完成三种格式标签的划分不用改一次跑一次。3.3 划分结果如何和 YOLO 训练对接YOLO 训练时读取的数据格式是 txt 标签目录结构是期望的data/ ├── images/ │ ├── train/ │ └── val/ └── labels/ ├── train/ └── val/注意后缀名是一致的图片和标签的文件名相同。上面split_train_val生成ImageSets下txt文件划分脚本.py脚本通常生成的是的 txt 文件列表需要配合自定义的数据加载逻辑才能和 YOLO 仓库接上。但这份资源的两个「划分写入新文件夹」脚本生成的就是上面这种物理目录结构更推荐。data.yaml文件路径和类别数量要对上尤其nc1表示只有一个类别红细胞。如果标签文件里类别 ID 是 0那么 yaml 里names的列表对应的是[red_blood_cell]或者你自己定义的名字具体看标签是怎么标记的。4. 环境配置与训练全流程从 0 到 Loss 收敛的关键细节4.1 环境搭建的选型建议资源里附带的教程覆盖了 Linux 和 Windows 两个平台Linux 版本用的典型命令是# Ubuntu/CentOS 下安装显卡驱动、CUDA、cuDNN遇到问题先查驱动版本 nvidia-smi # 创建轻量的虚拟环境避免把系统 Python 搞乱 conda create -n yolov8 python3.8 -y conda activate yolov8 # 安装 Pytorch版本要和 CUDA 版本匹配如果这里装错了后面编译时各种报错都来了 pip install torch torchvision --index-url https://download.pytorch.org/whl/cu118 # 安装 Ultralytics 包 pip install ultralyticsWindows 上的安装思路完全一样只是命令行的使用方式不同。Win R 打开命令行输conda create -n yolov8 python3.8 -y回车然后conda activate yolov8后面一模一样。建议 Python 版本选 3.8 或 3.10避开 3.9 早期版本的兼容性问题。显卡驱动、CUDA、PyTorch 三者版本必须匹配。常见场景是驱动版本新但 PyTorch 装错变成 CPU 版训练慢到怀疑人生。装完后用 Python 验证 PyTorch 能不能调用 GPUimport torch print(torch.cuda.is_available()) # 输出 True 说明 GPU 可用 print(torch.cuda.get_device_name(0))如果两次都是False或者名字显示 CPU说明 PyTorch 版本和 CUDA 版本不匹配经济舱建议从头看教程。4.2 修改训练入口的关键配置启动 YOLO 训练其实是在入口代码里指向你的数据集路径并设置超参数。以下是基于 Ultralytics 框架的标准训练代码from ultralytics import YOLO # 如果只是快速验证流程使用预训练权重如果从零开始训练指定 yaml 文件构建新模型 model YOLO(yolov8n.pt) # 训练入口必须认真核对数据路径 results model.train( datapath/to/dataset.yaml, # 关键指向你的 yaml 文件 epochs100, batch16, imgsz640, lr00.01, patience10, # 若连续 10 轮训练验证集指标不涨则提前终止 device0, # 指定 GPU 设备多卡用 0,1,2,3 workers4, # Windows 上 threads 或 workers 设置不当容易卡死 pretrainedTrue, # 换用预训练收敛显著加速 )参数解析imgsz640是 YOLO 系列的默认输入尺寸红细胞相对图片较小时可能适合用 640 这个尺寸输入简单情况不用调batch16取决于显卡显存6G 显存建议 812G 推荐 16epochs经过 100 轮训练基本就收敛了。这几个基础参数不用像网上段子说的那样调几百个够跑通就合理。Windows 下训练的经典问题是workers0默认值是 8可能导致程序卡在 DataLoader 不往下走表现为训练进度条不起。这是因为 Windows 的多进程和 Linux 实现不一样保守做法是workers0单进程数据加载速度稍慢但至少不会卡死。4.3 训练过程怎么判断正常还是翻车训练开始后正常的情况是 loss 逐轮下降比如box_loss、cls_loss、dfl_loss三个指标都逐步走低到后 30 轮趋于平稳最终验证集的mAP50能到 0.8 以上这个数据集标注质量高特征明显是好到的。如果出现这样的现象基本就是标签和图片对应关系出了问题loss 前几轮不降反升mAP 一直是 0训练完了模型预测框全部偏到角落先检查标签内容是不是全零。如果 txt 里第一行长这样0 0.5 0.5 1 1说明框就画满了整张图这种标签属于严重越界如果只有图像纵横比和标注框尺寸有关系90% 以上是归一化坐标换算忘了除以原图尺寸。4.4 对教程文档内容的理解说明资源包里的 HTML 教程文档属于一站式指南内容是按 Windows/Linux 分别写的环境搭建文档还额外包含一个从训练到修改自定义数据的教程「根据案例修改训练自己的数据集」。对新手来说这比网上零散的博客更友好。不过注意教程里的路径建议按你这个资源的实际目录结构改掉再复制不然跑不通。我在验证环境搭建时普遍踩过这类路径问题。5. 避坑指南这些坑我替你踩过了别再踩5.1 Windows 下训练卡死进度条不动现象训练命令敲下去提示正在下载预训练权重或者加载数据时直接卡在那里等半小时还是老样子。原因workers参数在 Windows 上默认值是 8Windows 多进程数据加载在部分环境下会卡死。另外如果你用的 Python 是 3.8 以上配合旧版 PyTorch 可能并行时会有兼容性问题。解决训练参数里强制指定workers0或者改用torch.set_num_threads(1)限制线程数。如果用的不是 GPU 而是笔记本 OLED 屏幕内显驱动和 CUDA 不方便装的直接改用 CPU 训练devicecpu配合 1000 张图的小数据集单轮也就一分多钟的事。5.2 训练完后预测框全偏移现象训练跑完了mAP50看着也不差拿新图一测框是画出来了但位置全部偏到图片右下角或者框是斜的。原因最常见的是训练和预测阶段图片尺寸不一致。训练时模型吃的是imgsz640的数据预测时如果输入的是另一张分辨率相差很大的图模型内部对坐标做了缩放但你的后处理代码没有还原正确框就歪了。解决预测阶段把imszg640和训练时保持一致使用model.predict(sourcexxx.jpg, imgsz640)。如果还不行就要去检查输入图片有没有 EXIF 旋转信息有的手机拍摄的医学镜检图带旋转方向被 OpenCV 读进来后实际尺寸和标注时的尺寸不一致。5.3 标签文件和图片文件不在一个目录导致路径报错现象训练时报错AssertionError: train: No labels in data/train/labels或者FileNotFoundError。原因脚本划分之后把图片和标签分到了不同的子目录但data.yaml里的路径只改了train/imagestrain/labels指向的还是一个空目录或错误路径。解决按 YOLO 的预期目录结构重新梳理确保images/train和labels/train中文件数量完全一致。之后可以顺手比对数量差一个就说明划分脚本有漏网的。我一般跑一遍ls data/train/images | wc -l ls data/train/labels | wc -l两个数字不等就该检查了。5.4 显存爆掉训练中途中断现象训练到第 20 轮左右日志报CUDA out of memory进程被杀前面所有轮次白跑。原因默认imgsz640加上batch16在 8G 显存左右的显卡上很容易爆。红细胞数据集的图片通常不需要太高分辨率但如果你的图片尺寸是 3000×2000 甚至更大模型要把它们缩放后再输入内存占用也会上涨。解决有一种方案是把batch直接降到 4让imgsz416对红细胞这种中小目标来说416 输入仍然可以保证精度或者开ampTrue混合精度训练。如果模型本身是yolov8m或更大的换成yolov8n参数量是它的几分之一显存占用小得多。前提是这个数据集的简单程度配一个轻量模型就足够了。5.5 训练教程文档里的路径不改直接抄现象完全照着文档命令行去复制结果换个电脑就报错说路径不存在。课程资源里的路径往往写死的是作者本机的路径。原因这个不算环境问题但新手在这里卡的时间不短。解决双击运行脚本时用脚本所在目录作为基准路径如果脚本里的路径写的是绝对路径直接把.py文件和这本 HTML 教程放到数据集同级的目录下再运行可以减少一大半路径问题。教训就是99% 的路径报错问题是脚本里写死的路径和你的实际目录不一致造成的。如果你想改路径用编辑器打开脚本全局搜索/home/或C:\Users\把那一行换成你自己的路径就行。6. 进阶用法用数据分布分析和数据增强把 mAP 再往上拉当你的模型 baseline 已经跑通训练 Loss 也能正常收敛了下一个目标通常就是提点。针对红细胞这类小目标、粘连多的数据我建议你优先做两件事一是对标签做一次统计分析确认目标的尺寸分布情况二是针对性地做数据增强策略调整。先做标签统计分析。很多工具箱自带analyze功能你也可以写个脚本统计目标框的宽度和高度分布判断目标框是不是普遍小于32x32像素。如果相当一部分框这么小就属于典型小目标意味着import os from PIL import Image img_dir JPEGImages label_dir YOLO small_cnt 0 total_cnt 0 for f in sorted(os.listdir(img_dir)): img_path os.path.join(img_dir, f) label_path os.path.join(label_dir, f.replace(.jpg, .txt)) if not os.path.exists(label_path): continue w, h Image.open(img_path).size with open(label_path, r) as fh: for line in fh: parts line.strip().split() _, _, _, bw, bh parts bw, bh float(bw) * w, float(bh) * h total_cnt 1 if bw 32 or bh 32: small_cnt 1 print(f小目标(边长32px)占比: {small_cnt / total_cnt * 100:.1f}%)如果比例超过 30%模型最好用yolov8n或带 P2 检测层的模型通常是 scaled 版本才有。这一点决定了你对模型结构的选择方向。数据增强策略方面有一个临时调整项对红细胞这类均匀分布的数据有帮助建议在训练配置里增加马赛克增强和适度旋转model.train( datadata.yaml, epochs120, mosaic0.8, # 马赛克增强概率默认 1.0 degrees10, # 允许旋转角度 ±10°红细胞方向性不明显小角度旋转安全 scale0.2, # 缩放范围 0.8~1.2 fliplr0.5 # 水平翻转率红细胞没有左右语义区别 )红细胞显然是圆形为主旋转增强上限不用给太高给 10 度其实足够带来多样性。如果你增加旋转到 45 度模型可能会把圆形目标学歪边界框的回归精度会受影响。验证阶段我通常用同一个测试集对比不同配置的 mAP50 和 mAP50-95。例如跑一个 baseline 一个增强策略两个模型各推理一遍测试集# 用 best.pt 推理并输出指标对比两次结果即可 yolo predict modelruns/detect/train1/weights/best.pt sourcetest_images imgsz640 saveTrue以上就是我拿到这份资源后从头到尾跑通一遍的完整过程。说实在的花在数据校验和环境折腾上的时间比调模型多得多——如果能让后来的人少踩几个我已经踩过的坑这份笔记就有价值了。从那以后我每次拿到新数据集都强制走一遍标签校验、比例统计、划分脚本检查的流程不吃后悔药。希望帮到你。本文还有配套的精品资源点击获取
返回列表