新闻详情

新闻详情

首页 / 资讯中心 / 详情

血细胞检测数据集三格式处理与YOLO训练避坑指南

发布时间:2026/9/28 16:33:08来源:尧图网络
血细胞检测数据集三格式处理与YOLO训练避坑指南
简介这款YOLO红白细胞血小板检测数据集压缩包面向医学影像目标检测方向的开发者与研究者提供1000张真实场景的高质量图片覆盖丰富血细胞形态配合voc、coco、yolo三种格式标签可直接接入YOLO系列模型训练省去手动标注和格式转换的繁琐工作。压缩包内共2000个文件其中xml为VOC格式标签、txt为YOLO格式标签另有python划分脚本和html版教程文档整体大小约29.34MB。已有191人在CSDN学习下载。除数据集外还附带Windows与Linux两种环境下的YOLO搭建及训练教程以及训练集、验证集、测试集划分脚本可依据实际需求自由分配数据比例快速开展目标检测实验或课程项目。数据集详情与更多资源可在作者博客获取适合作为课程设计、毕业设计或YOLO入门练习的实用资料。1. 血细胞检测数据集到手后先别急着开训三个格式本身就是第一道门槛这套数据集把最麻烦的三件事一次配齐了——图像、三种格式标签、划分脚本和训练教程。但正因为它太省事反而容易让人跳过检查直接开训。我拿到YOLO红白细胞血小板检测数据集这类三格式包时不会急着丢进训练脚本而是先花一小时把文件结构、坐标系和类别ID理顺。做医学显微图像目标检测的人都知道红细胞、白细胞、血小板三类目标形态差异大、血小板还特别小标注稍有偏差模型的收敛曲线就会变得很难看而且很难从训练日志里直接看出问题根源。这套数据适合两类人一是刚接触目标检测、想用一份规范数据跑通yolo训练全流程的初学者二是正在做医学图像识别、需要拿真实血细胞数据做预研或小规模验证的工程师。对前者来说三种格式是最好的学习素材对后者来说必须先把格式差异和标注一致性排查清楚否则后面做的所有调参工作都白费。所以本文不打算只讲训练命令而是把格式转换、数据检查、划分脚本和调试经验完整走一遍。2. 三种标签格式同包发行VOC/COCO/YOLO的结构差异与转换发行方同时提供voc、coco和yolo三种格式本意是让不同框架的用户拿到就能用VOC适合标注软件和传统检测工具COCO是MMDetection、Detectron2等框架的标准输入YOLO则是Ultralytics系列直接吃txt的训练格式。但“全都要给”也意味着同一份标注内容被转换了三遍任何一遍转换出了偏差你都不知道该信谁。所以拿到手的第一件事不是挑一个格式开始训练而是把三种格式对照着看一遍。2.1 VOC一张图一个XML目录结构本身是规则VOC格式的惯例布局是JPEGImages放图片、Annotations放XML、ImageSets/Main放train.txt和val.txt。每个XML里必须有size节点记录宽高每个object节点里有name和bndboxbndbox给出左上角和右下角的绝对像素坐标。这套结构很简单但有两个容易踩的点一是size里的宽高必须和真实图片一致某张图resize过但XML没更新训练时坐标就会整体偏移二是ImageSets里的train.txt往往包含没有对应XML的空白样本有些工具加载时会直接跳过有些则会报错。我一般会写一个小脚本把Annotations下的XML逐个解析和JPEGImages的文件名求交集找出“有图无标注”和“有标注无图”的文件。这个操作很快1000张图几秒钟就能跑完但它能避免训练中途才炸出FileNotFoundError。2.2 COCO一个JSON管理全部信息要重点核对image_id和category_idCOCO格式和coco2017数据集结构一样把所有信息塞进一个JSONimages数组记录id、file_name、width、heightannotations数组记录image_id、bbox、area、segmentation、iscrowdcategories数组记录类别id和name。血细胞检测数据集里一般只有三个类别所以categories不长但恰恰因为短容易让人放松警惕。需要重点核对的是annotations里的image_id是否真的对应images里的id。转换工具常见的错误是把索引从0开始还是从1开始搞混一旦错位某些图片会加载到别的图的标注画面里出现一个位置完全对不上的框。另一处是bboxCOCO标准是[x, y, width, height]而不少标注软件导出的是[x1, y1, x2, y2]差一个坐标语义检测框就会整体偏向右下角。2.3 YOLO一行一个目标归一化坐标错一个量级就是爆框YOLO格式最简洁每张图一个同名txt每一行是“类别ID x_center y_center width height”全部归一化到0到1之间。模型训练时不会再去读XML或JSON完全依赖这套txt。所以它的问题也是隐蔽的坐标范围错了、类别ID写错、文件没生成训练过程往往不会直接报错而是loss曲线表现诡异。拿到数据集后我建议先抽查十张图的txt。看类别ID是否在0到2之间前提是三类目标看五个数值是否都在0到1区间内如果出现负数或大于1的值说明归一化写错了。还有一种更隐蔽的情况某些转换脚本把归一化后的坐标四舍五入成了整数结果所有框都聚在画面的一角。这种问题靠肉眼看txt很难发现需要下一章的坐标分布统计来排查。2.4 从VOC转YOLO转换脚本的基准写法与两个边界坑训练YOLO模型时最终用到的是txt但发行包通常把VOC作为最原始的标注形态所以自己写一遍VOC转YOLO的脚本能同时校验发行方给的txt是否可靠。核心逻辑是这样的import xml.etree.ElementTree as ET import os def voc_to_yolo(xml_path, out_dir, class_map): tree ET.parse(xml_path) root tree.getroot() size root.find(size) width int(size.find(width).text) height int(size.find(height).text) lines [] for obj in root.iter(object): name obj.find(name).text.strip() cls_id class_map[name] # 类别名映射成数字ID bndbox obj.find(bndbox) x1 float(bndbox.find(xmin).text) y1 float(bndbox.find(ymin).text) x2 float(bndbox.find(xmax).text) y2 float(bndbox.find(ymax).text) # YOLO需要中心点坐标和宽高全部除以图像宽高完成归一化 x_center (x1 x2) / 2.0 / width y_center (y1 y2) / 2.0 / height w (x2 - x1) / width h (y2 - y1) / height # 越界值会直接导致训练时该目标被忽略先做一次截断 x_center min(max(x_center, 0.0), 1.0) y_center min(max(y_center, 0.0), 1.0) w min(max(w, 0.0), 1.0) h min(max(h, 0.0), 1.0) lines.append(f{cls_id} {x_center:.6f} {y_center:.6f} {w:.6f} {h:.6f}) base_name os.path.splitext(os.path.basename(xml_path))[0] with open(os.path.join(out_dir, base_name .txt), w) as f: f.write(\n.join(lines)) class_map {红细胞: 0, 白细胞: 1, 血小板: 2}这段代码的关键在最后四行格式化输出保留六位小数避免精度丢失导致框位偏移。class_map的定义必须和你最终训练用的data.yaml保持一致这是整个链条里最容易埋雷的地方。用这份脚本重新生成一遍txt再去和发行包自带的txt做diff如果diff结果大面积不一致说明原始txt和VOC标注之间本身就对不上这种情况下应以你认为更准确的那份为准通常是人工标注的VOC源文件。另外要注意脚本里如果某个XML的object缺少bndbox子节点ET会抛异常批量转换时最好先捕获异常并打印文件名。3. 1000张图片做一致性检查尺寸、损坏、标注三对齐数据集的图片数量是1000张够跑通流程但在模型眼里一张损坏图或一个错位标注就能让验证指标产生明显波动。血细胞显微图还有一个特点它们往往来自不同的涂片、不同的染色条件、不同拍摄设备亮度、色温和噪点差异都很大。如果训练集和验证集恰好分到不同风格的图模型会很自然地在验证集上表现差这种问题跟模型结构无关纯粹是数据划分的问题。所以我建议先做一轮系统性检查。3.1 文件名对齐找出有图无标、有标无图的孤儿文件无论是VOC的XML、COCO的JSON还是YOLO的txt最终都要落到文件名基名匹配上。常见的情况是XML文件名是slide_001.xml图片名是Slide_001.jpg字母大小写不一致在某些大小写敏感的文件系统上就会漏匹配。from pathlib import Path images {p.stem.lower() for p in Path(images).glob(*.*)} xmls {p.stem.lower() for p in Path(Annotations).glob(*.xml)} txts {p.stem.lower() for p in Path(labels).glob(*.txt)} print(只在图片中存在的基名:, images - xmls) print(只在XML中存在的基名:, xmls - images) print(只在TXT中存在的基名:, txts - images)这段代码把三类文件的基名转成小写再比较目的是把大小写差异也纳入检查范围。执行后如果“只在图片中存在的基名”为非空说明有图片没有标注反过来则是标注没落在图片上。这一步骤不需要修数据只是让你心里有数但划分脚本和训练脚本都需要基于这份对齐结果来过滤不然加载到一半就会因为缺少文件而中断。3.2 坏图、灰度图与不规则尺寸统一到RGB三通道显微图像在各实验室之间差异很大有些是显微镜软件直接导出的PNG带Alpha通道有些是从报告里截屏得来的JPG本身是灰度还有些是一整页切片扫描图尺寸达到几千乘几千。1000张图如果尺寸不一致训练时YOLO会自动resize到imgsz问题不大但通道不一致会让dataloader报错或者在归一化时出现意料之外的色偏。from PIL import Image from pathlib import Path bad_files [] sizes set() modes set() for img_path in sorted(Path(images).glob(*.*)): try: img Image.open(img_path) img.verify() with Image.open(img_path) as im: sizes.add(im.size) modes.add(im.mode) except Exception: bad_files.append(str(img_path)) print(损坏文件:, bad_files) print(尺寸种类:, sizes) print(颜色模式:, modes)如果发现modes里有L或RGBA就需要在训练前统一转成RGB并另存为JPG或PNG。这里给一个提醒verify()之后要重新打开一次因为verify()会关闭文件句柄直接再访问属性会报错。尺寸种类如果很多不用强行统一分辨率YOLO训练本身就支持任意尺寸输入只要dataloader能把它们batch到一起就行。3.3 类别分布统计白细胞少、血小板小先做好心理准备接下来统计三类目标的标注数量。这一步直接决定训练策略如果红细胞占了大头血小板只有几十个框模型大概率会牺牲血小板指标去保红细胞。更麻烦的是血小板的框通常很小几十个像素的那种在特征图下采样后可能直接消失。import xml.etree.ElementTree as ET from collections import Counter from pathlib import Path counter Counter() for xml_path in Path(Annotations).glob(*.xml): tree ET.parse(xml_path) for obj in tree.getroot().iter(object): counter[obj.find(name).text.strip()] 1 print(类别数量分布:, counter)这个统计结果如果发现某类占比低于10%训练时就要考虑给该类做过采样或者把WBC白细胞的类别损失权重调高。YOLO默认按数据分布计算loss多数类主导梯度方向少数类很难学出来。3.4 框尺寸分布提前定位小目标风险除了类别数量还要看框的像素尺寸。把VOC XML里所有bndbox的宽高收集起来做一个简单统计看有多少框小于32x32。这个阈值不是拍脑袋定的YOLOv8输入640时32x32大约占整图的5%再经过下采样到20x20的特征图只剩约1x1像素基本属于极限检测目标。import xml.etree.ElementTree as ET from pathlib import Path small 0 total 0 for xml_path in Path(Annotations).glob(*.xml): tree ET.parse(xml_path) for obj in tree.getroot().iter(object): box obj.find(bndbox) w float(box.find(xmax).text) - float(box.find(xmin).text) h float(box.find(ymax).text) - float(box.find(ymin).text) total 1 if w 32 and h 32: small 1 print(f小目标框占比: {small / total * 100:.1f}%)如果这个比例超过三成后续训练里imgsz建议设到640以上mosaic关闭或降低使用概率因为mosaic会把小目标进一步截断让本就贫瘠的监督信号雪上加霜。4. 划分脚本这样改才不翻车多格式同步划分与三个必调参数发行包里带了划分脚本但通用脚本不一定适配你的训练策略。很多翻车现场都发生在划分阶段脚本只划分了图片没有同步移动标注文件或者只划分了VOC格式而训练用的是YOLO格式。还有一类问题是随机划分导致同一来源的涂片同时出现在训练集和验证集造成数据泄露。4.1 两种划分思路随机划分 vs 按来源分组划分随机划分适合图片之间相关性弱的场景比如不同病人、不同视野、不同染色制片图片内容彼此独立。血细胞数据集如果文件名带前缀比如same_slide_001、same_slide_002说明这些图来自同一张涂片的连续视野涂片之间的染色条件、细胞密度高度相关。这种数据如果随机切训练集和验证集会互相“透题”验证指标虚高部署到新场景时表现断崖式下跌。处理方式是先提取前缀作为分组键按组划分而非按单张图片划分。这样同一前缀的图要么全进训练集要么全进验证集或测试集。代价是划分后的类别分布可能不均匀所以要在分组前先统计每组内各类别框的数量让训练集、验证集、测试集的类别比例尽量接近。4.2 三格式同步划分一套基名三个目录同时落位我这里给出一份可直接改的脚本。它的核心思路是统一读取所有图片基名按设定比例切分后把图片、VOC的XML、YOLO的txt三个方向同时拷贝到目标目录。import os import random import shutil from pathlib import Path src_images Path(images) src_xmls Path(Annotations) src_txts Path(labels) out_prefix Path(split_output) train_ratio, val_ratio, seed 0.7, 0.2, 42 random.seed(seed) image_files sorted(src_images.glob(*.*)) image_files [f for f in image_files if f.suffix.lower() in (.jpg, .jpeg, .png)] random.shuffle(image_files) n_train int(len(image_files) * train_ratio) n_val int(len(image_files) * val_ratio) train_set image_files[:n_train] val_set image_files[n_train:n_train n_val] test_set image_files[n_train n_val:] def sync_copy(file_list, split_name): for img in file_list: stem img.stem shutil.copy2(str(img), out_prefix / split_name / images / img.name) xml_file src_xmls / (stem .xml) if xml_file.exists(): shutil.copy2(str(xml_file), out_prefix / split_name / Annotations / xml_file.name) txt_file src_txts / (stem .txt) if txt_file.exists(): shutil.copy2(str(txt_file), out_prefix / split_name / labels / txt_file.name) for name, subset in [(train, train_set), (val, val_set), (test, test_set)]: sync_copy(subset, name) print(train:, len(train_set), val:, len(val_set), test:, len(test_set)) print(未找到XML的文件:, [f.stem for f in image_files if not (src_xmls / (f.stem .xml)).exists()][:10])这里有个极易踩的细节shutil.copy2会保留文件元数据但在网络盘或某些文件系统上会变慢如果数据集在机械盘上1000张图全量拷贝可能要几分钟建议先确认磁盘空间。脚本最后打印了“未找到XML的文件”前十条这是为了逼你及时发现标签缺失而不是等训练报错。4.3 三个必调参数seed、train_ratio、val_ratioseed不固定每次跑脚本划分结果都不一样训练结果就无法复现。我习惯固定成42没有特殊原因只是便于向同事复述。train_ratio和val_ratio的组合也很讲究1000张图train0.7、val0.2、test0.1是比较常规的取值但如果某类目标数量特别少可以加大train比例到0.8给模型更多正样本。test集不要省它真正检验训练是否过拟合。如果你用的是COCO格式训练划分脚本还要额外处理JSON文件一种做法是把JSON按image_id拆成三个子JSON另一种是仍然用上述方式拷图片和txt然后单独把原始JSON按划分结果过滤一遍。第二种更保险因为COCO的annotations很难靠文件拷贝直接断开。划分完成后建议看一眼三个子集的类别分布如果某类在test集里只有个位数框改调train_ratio或改用分组划分。5. 血细胞检测训练避坑五个高频问题与排查记录训练跑起来之后剩下的问题大多不是模型结构不先进而是数据格式和参数配置挖的坑。以下五条是我在三格式数据集上反复见过的踩坑记录每一条都按“现象、原因、解决”的顺序写清楚。遇到问题先对照这份清单排查不要一上来就调学习率和网络结构那才是真的玄学。5.1 训练一开始就报FileNotFoundError图片找不到现象训练日志在加载第一张图时抛异常文件名指向split_output/train/images里的某个jpg。原因划分脚本只同步了图片没有同步labels目录或者图片存在但文件名大小写不一致Linux环境下严格区分大小写模型读的是小写文件名实际文件却以大写开头。解决先清点split_output/train/images和split_output/train/labels两个目录的文件数量确认它们一致。再把图片基名统一转为小写并重命名。我的习惯是划分完成后立刻跑一遍校验脚本检查每个目录文件数是否相等而不是等到训练时才验证。5.2 COCO的JSON里image_id对不上模型加载了别人家的标注现象训练正常跑loss也下降但画出来的预测框位置完全错位比如框落在背景区域跟细胞位置没有关系。原因COCO JSON里annotations的image_id和images数组的索引不匹配。有些脚本从0开始编号有些从1开始如果中途跳过某些样本这个错位不会在加载时报错。解决写一个简单脚本把annotations按image_id分组逐条检查image_id是否都存在于images数组的id集合中。血细胞数据集通常只有三个类别人工抽查几条也很快。最稳妥的做法是重新从VOC源格式转一遍COCO以XML为唯一事实来源不要直接拿发行包里的JSON去训练。5.3 YOLO的txt坐标全是整数所有框挤在角落现象训练时loss下降慢验证集mAP极低画图发现预测框全部堆叠在图像中心附近。原因转换脚本把归一化坐标直接做了round()转整数比如0.5327变成了1结果所有框聚在画面边界或角落。这种错误不报异常完全靠指标暴露。解决检查txt文件内容连续抽样几十份看数值是否包含大量小数。修复方法是改脚本把坐标格式保留到6位小数这和第2节给出的VOC转YOLO脚本里f{x_center:.6f}是同一件事。如果你拿到的txt已经是坏数据直接用第2节的代码重新转一份即可。5.4 白细胞一直学不会混淆矩阵里几乎全被认成红细胞现象训练100个epoch后红细胞AP很高白细胞AP趋近于0血小板也没好到哪去。原因先查类别ID映射。VOC的XML里类别名可能是中文“白细胞”也可能是英文WBC或leukocyte而YOLO txt的类别ID按字母顺序排列发行方在不同格式间转换时大概率没做手工映射导致白细胞ID和红细胞混了。其次是类别严重不平衡白细胞占比过低模型梯度被多数类主导。解决把class_map打印出来逐一比对。训练前统计各类别框数如果白细胞框数只有几百考虑在data.yaml里给白细胞提高loss权重或者在训练配置里开启类别过采样。这个问题在血细胞检测里非常典型因为一张图里红细胞几十个白细胞只有一两个模型天然倾向把不确定目标全判为红细胞。5.5 验证时mAP不错一部署到新图片上效果崩盘现象训练集和验证集mAP都过0.7但换一批完全没见过的涂片图漏检率明显升高。原因数据划分时随机切分同一涂片的连续视野图被同时分到训练和验证模型把涂片的染色背景特征当成了正样本依据新场景背景不同就失效。解决按文件前缀分组划分这是第4.1节里说的思路。如果发行包的文件名没有前缀就按图片的采集时间、目录结构或者图像直方图特征聚类分组。这一步在做医学图像检测时相当于必答题跳过它后面部署阶段必然补交学费。6. 用YOLO跑通红白细胞血小板检测训练命令与验证清单格式检查做完、划分脚本跑通就可以进入正题了。下面的命令以YOLOv8为例预训练权重从官方release页下载yolov8n.pt即可不需要自己从头训练。data.yaml的内容是整套训练的地基类别ID必须和前面VOC转YOLO脚本里的class_map完全一致。6.1 data.yaml与训练参数path: ./血细胞数据集 train: images/train val: images/val test: images/test nc: 3 names: 0: 红细胞 1: 白细胞 2: 血小板训练命令这么写yolo detect train data血细胞.yaml modelyolov8n.pt epochs100 imgsz640 batch16 patience20batch16是基于单张16GB显存的经验值显存小就降到8别让batch_size成为翻车点。关键参数是imgsz如果第3.4节里小目标占比高我建议imgsz设为768甚至更高代价是训练时长变长但对血小板这种小目标效果更明显。另一个值得关注的参数是mosaic显微图像裁剪后容易把小目标截断如果训练前期loss反复震荡把mosaic设为0.0再试往往能找到一条更平稳的收敛路径。6.2 验证清单与结果判断训练结束后跑一次验证yolo detect val data血细胞.yaml modelruns/detect/train/weights/best.pt重点看三样东西混淆矩阵、PR曲线、按类别的AP值。红细胞AP高而白细胞AP低大概率是类别不平衡血小板AP低而其他两类正常大概率是mosaic关闭不够彻底或imgsz偏小。也可以从runs/detect/train目录里挑几十张验证集推理图用肉眼扫一遍漏检情况。漏检比错检更难从指标里看出来人工抽查是最后的保险。我自己的习惯是任何数据集到手花在清洗和格式校验上的时间至少占整个项目周期的三分之一。血细胞检测这类医学目标检测任务数据质量直接决定模型上限换网络结构只是在下限附近挣扎。把这些检查和训练流程固定成一套脚本下次再拿到任何多格式数据集都能少走几轮弯路希望这些经验能帮到你。本文还有配套的精品资源点击获取
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

应届生产品经理面试全攻略:从 0 到 1 准备指南与 TaoToken 配置助力 2026/9/28 19:44:01

应届生产品经理面试全攻略:从 0 到 1 准备指南与 TaoToken 配置助力

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
Windows下编译IEC 61850依赖库:TaoToken统一Key接入VS工程配置骨架 2026/9/28 19:44:01

Windows下编译IEC 61850依赖库:TaoToken统一Key接入VS工程配置骨架

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
每天介绍一家新质生产力公司37 2026/9/28 19:44:01

每天介绍一家新质生产力公司37

https://mp.weixin.qq.com/s/Xe3JtKppkLaIOAHDZOP3mw

阅读更多 →
从0开始:小白也能学会的 Cline 配置 fetch MCP 服务器模块完整教程 2026/9/28 19:44:01

从0开始:小白也能学会的 Cline 配置 fetch MCP 服务器模块完整教程

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
YOLO人体行为检测数据集实战:从标签格式校验到模型训练排错 2026/9/28 19:44:01

YOLO人体行为检测数据集实战:从标签格式校验到模型训练排错

简介:面向目标检测初学者、YOLO实践者及需要人体行为数据的计算机视觉课程设计,这份数据集提供了1000张真实场景下的人体行为图片,标注覆盖VOC、COCO、YOLO三种格式(分别对应xml、json、txt),可直接用于YOL…

阅读更多 →
Windows 安装 Codex 并接入自己的 API:CC Switch 配置与 settings.json 骨架详解 2026/9/28 19:43:55

Windows 安装 Codex 并接入自己的 API:CC Switch 配置与 settings.json 骨架详解

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉