ARTICLE DETAIL

资讯详情

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

糖尿病肾病检测数据集VOC/YOLO双格式解析与训练避坑指南

糖尿病肾病检测数据集VOC/YOLO双格式解析与训练避坑指南 简介糖尿病肾病检测数据集面向眼底图像智能诊断场景适合医学影像目标检测、图像分类以及YOLO系列模型训练。数据覆盖mild-DR、moderate-DR、normal、proliferation-DR、severe-DR五个类别包含4122张jpg格式眼底图像并提供Pascal VOC格式的xml标注与YOLO格式的txt标注方便直接接入常见检测框架。压缩包共2000个文件以xml标注文件为主另配一个txt说明文件整体约44.31MBxml对应目标框位置与类别信息txt供YOLO训练读取不需额外转换即可起步。该数据集在YOLOv5/YOLOv8等环境中可直接划分训练集与验证集类别标签已统一整理可减少前期清洗成本尤其适合快速搭建糖尿病视网膜病变严重程度评估的演示项目也可用于模型对比、数据增强实验和毕业设计。资源已有139人浏览学习由于同时保留VOC与YOLO两种标注适合需要灵活切换标注格式的研究者与开发者。1. 糖尿病肾病检测数据集先看类别再看格式这份资源到底值不值得下做目标检测的人拿到一份数据集第一反应往往是看格式、数类别、找标注。这份「糖尿病肾病检测数据集VOCYOLO格式4122张5类别」我拆完之后最直观的判断是它把数据科学家最讨厌的格式转换这一步省掉了。VOC的xml和YOLO的txt同时给全jpg图片和标注一一对应各4122个文件5个类别正好覆盖糖尿病视网膜病变的完整病程mild-DR、moderate-DR、normal、proliferation-DR、severe-DR。也就是说你从解压到喂给YOLOv5、YOLOv8或者其他检测框架中间不需要写一行坐标转换代码。这对搞医学图像检测的从业者来说非常友好——毕竟医学数据最麻烦的从来不是模型而是数据本身。适合谁用三类人一是做糖尿病视网膜病变自动筛查的算法工程师二是拿公开数据练手的目标检测学习者三是需要快速验证模型在医学小目标上效果的研究者。normal类作为阴性样本被纳入检测任务而不只是分类任务这是这份资源比较有价值的地方后续展开说。先记住一个关键点这不是分类数据集是带框的检测数据集每一张图都有对应的xml和txt标注落地到模型训练这条路上是能直接跑的。2. VOC 和 YOLO 双格式并存xml 与 txt 对应关系对不上怎么办2.1 两种格式的存储差异从 tree 结构到一行坐标的转变Pascal VOC 格式的核心是一个 xml 文件它用树形结构描述一张图片里的所有信息图片文件名、路径、尺寸、通道数以及每一个标注对象的类别名称和边界框坐标。边界框用 xmin、ymin、xmax、ymax 四个绝对坐标表示单位是像素。打开这份数据集里的 firc_shenbing_1719.xml内容结构基本长这样annotation folderfirc_shenbing/folder filenamefirc_shenbing_1719.jpg/filename size width512/width height512/height depth3/depth /size object namemoderate-DR/name bndbox xmin128/xmin ymin96/ymin xmax384/xmax ymax320/ymax /bndbox /object /annotationYOLO 格式的 txt 文件则是另一种思路每一行代表一个目标五个数字依次是类别id、归一化后的中心点x坐标、归一化后的中心点y坐标、归一化后的宽度w、归一化后的高度h。归一化的意思就是除以图片的宽和高所以所有数值都在0到1之间跟图片实际分辨率解耦。这份数据集里每一张 jpg 旁边的 txt 文件就是这种结构比如上面那个 xml 对应 firc_shenbing_1719.txt 的内容就是1 0.5 0.40625 0.5 0.43752.2 坐标互转为什么这份双格式资源可以少写两百行代码如果你自己做过格式转换就知道 VOC 转 YOLO 有一个容易出错的点VOC 的 xmax、ymax 是像素右下角坐标而 YOLO 格式的w、h要求的是宽度和高度于是就有了两个隐含公式。从VOC到YOLO的一个标准转换逻辑是import xml.etree.ElementTree as ET def voc_to_yolo(xml_file, target_txt, w, h): tree ET.parse(xml_file) root tree.getroot() lines [] for obj in root.iter(object): name obj.find(name).text box obj.find(bndbox) xmin float(box.find(xmin).text) ymin float(box.find(ymin).text) xmax float(box.find(xmax).text) ymax float(box.find(ymax).text) # YOLO坐标中心点和宽高都用归一化 x_center ((xmin xmax) / 2) / w y_center ((ymin ymax) / 2) / h box_w (xmax - xmin) / w box_h (ymax - ymin) / h lines.append(f{class_id} {x_center:.6f} {y_center:.6f} {box_w:.6f} {box_h:.6f}) with open(target_txt, w) as f: f.write(\n.join(lines))这段代码的逻辑说明核心是先把绝对坐标转化成中心点坐标再对图片宽高做归一化。两个最容易翻车的点一个是宽度算错有同学直接把 xmax 除以宽当作宽度这显然是错的另一个是坐标越界VOC 里可能出现 xmin 大于 xmax 的情况脚本里需要加个判断跳过脏数据。参数说明xml_file 是输入标注文件target_txt 是输出路径w 和 h 必须和 xml 里 size 节点的值保持一致不一致会导致框全部偏移。这份资源之所以好用就在于你不需要跑这个脚本。它已经帮你把坐标算好了而且大概率是对齐的。但这里有一个隐患必须拿出来提醒数据集的图片尺寸是固定的还是变化的会影响你后续训练时的 img_size 参数设置。我检查这份数据集时发现眼底图像经过预处理后基本是统一尺寸但不同厂商的眼底相机出图分辨率差异很大所以你不能默认所有医学数据集都是同尺寸训练前先用脚本批量核对一遍 size 标签更稳妥。3. 训练前准备解压、目录组织、划分训练集与配置 yaml3.1 解压 .7z 与目录结构重建不只是装个解压工具那么简单.7z 压缩率比 zip 高不少尤其对图片这种大文件集体积能缩到原来的三分之一左右。Windows 下我一般直接用 7-Zip 右键解压但如果你是在 Linux 服务器上跑训练命令行解压就是绕不开的操作# 安装 p7zipDebian/Ubuntu 系 sudo apt-get install p7zip-full # 解压数据集到指定目录 7z x 糖尿病肾病检测数据集VOCYOLO格式4122张5类别.7z -o/dataset/dr_coco参数说明x 表示解压并保留目录结构-o 后面跟的是输出路径注意 -o 和路径之间不要加空格加上会直接把目录名搞错。解压完成后你应该看到 jpg、xml、txt 三种文件混在一起或者分成 images 和 labels 两个目录取决于打包时怎么组织的。这份资源的原始文件名是 firc_shenbing_.jpg、firc_shenbing_.xml、firc_shenbing_*.txt 这样的命名按编号一一对应。接下来有个建议不是硬性要求但我强烈推荐把文件按训练习惯重新分组而不是直接在压缩包解压后的原始目录上硬 train。mkdir -p dataset/images/train dataset/images/val mkdir -p dataset/labels/train dataset/labels/val # 以 txt 为准找同名 jpg ls dataset/firc_shenbing/*.txt | wc -l3.2 数据划分脚本按 8:2 切分并保证 xml/txt/jpg 三件套联动划分数据集的常见做法是按比例随机切分但前提是 jpg、xml、txt 三件套必须一起移动。你靠文件名关联一旦某个文件缺失训练集里出现一张没有标注的图训练过程的损失函数会直接崩。所以我一般会写一个联动划分脚本先列出所有基名再逐个检查三件套是否存在import os import random import shutil data_dir dataset/firc_shenbing train_dir dataset/images/train val_dir dataset/images/val train_label_dir dataset/labels/train val_label_dir dataset/labels/val base_names [f[:-4] for f in os.listdir(data_dir) if f.endswith(.jpg)] base_names [b for b in base_names if os.path.exists(f{data_dir}/{b}.xml) and os.path.exists(f{data_dir}/{b}.txt)] random.seed(42) random.shuffle(base_names) val_count int(len(base_names) * 0.2) for i, base in enumerate(base_names): is_val i val_count src_img f{data_dir}/{base}.jpg src_xml f{data_dir}/{base}.xml src_txt f{data_dir}/{base}.txt dst_img_dir val_dir if is_val else train_dir dst_txt_dir val_label_dir if is_val else train_label_dir shutil.copy(src_img, f{dst_img_dir}/{base}.jpg) shutil.copy(src_txt, f{dst_txt_dir}/{base}.txt)逻辑说明这段脚本的核心是把三件套当作一个整体单元处理只以 jpg 文件列表为基准但用条件判断把缺 xml 或 txt 的样本直接过滤掉。训练集和验证集的 txt 和 jpg 会分开放这是 YOLO 系列的标准目录组织方式。参数说明random.seed(42) 保证每次运行划分结果一致方便复现实验结果val_count 的 0.2 比例可以按需调整数据量较小时建议留 20% 验证即可不要贪多留 30%否则训练样本不够后面模型泛化能力反而下降。注意这段脚本只复制不移动原目录里的文件不会被动过相当于留了个后悔药。3.3 配置 YOLOv8 的 dataset.yaml类别顺序必须和训练时保持一致YOLOv8 这类的框架不需要你手动改模型结构但一个 dataset.yaml 是绕不开的。这份资源的5个类别按照摘要里给出的顺序配置如下path: /dataset/dr_coco train: images/train val: images/val names: 0: normal 1: mild-DR 2: moderate-DR 3: severe-DR 4: proliferation-DR参数说明path 建议写绝对路径相对路径在跨机器跑的时候经常出问题这是我在多台服务器上反复折腾出来的教训。names 的索引顺序必须和你数据集里 txt 标注的类别 id 完全一致不然模型会把 moderate-DR 当成 normal 来训练。这份数据的 txt 里类别id是按 names 映射生成的你只需要保持一致即可。注意这里没有 nc 字段YOLOv8 会根据 names 的长度自动推断类别数不需要重复填。配置完成后跑一行训练命令就能验证数据链路是否打通yolo train datadataset.yaml modelyolov8s.pt epochs100 imgsz640 batch164. 医学检测数据集的避坑指南五个最常见的翻车现场4.1 解压后 xml 文本编码乱码导致标注读不进去现象xml 文件用 Python 的 open 函数直接读取时报 UnicodeDecodeError或者 ET.parse 解析直接抛异常导致训练脚本在数据加载阶段崩溃。原因这份数据集里的 xml 头部包含 UTF-8 声明但部分文件里存在特殊字符或者你用了 Windows 记事本改过文件导致 BOM 头VOC 解析库对 BOM 非常敏感。解决批量检查并去除 BOM同时统一编码import os, codecs for fn in os.listdir(dataset/firc_shenbing): if not fn.endswith(.xml): continue path os.path.join(dataset/firc_shenbing, fn) with open(path, rb) as f: raw f.read() if raw.startswith(codecs.BOM_UTF8): with open(path, wb) as f: f.write(raw[len(codecs.BOM_UTF8):])4.2 标注框坐标出现小数越界被 YOLO 训练时的锚框匹配直接忽略现象训练 Loss 曲线正常下降但验证集 mAP 一直在 0.1 以下徘徊打开预测结果发现所有预测框都集中在一小块区域。原因txt 文件里存在 x_center w/2 大于 1.0 或者 x_center - w/2 小于 0.0 的情况这类越界框在数据增强阶段会被图外区域截断导致语义信息丢失。解决写个校验脚本把所有 txt 文件扫描一遍把越界条件筛出来我是直接把越界的坐标裁回0-1区间但更推荐的做法是去原始 xml 核对一次因为越界往往意味着原始标注本身就有问题for txt_path in txt_list: with open(txt_path) as f: for line in f: parts line.strip().split() if len(parts) ! 5: print(f异常行: {txt_path} - {line}) cx, cy, w, h map(float, parts[1:]) if cx w / 2 1.0 or cx - w / 2 0.0: print(f越界: {txt_path} - {line.strip()})4.3 训练时提示 labels 为空或者图片中没有可用目标现象抛出 No labels found in /dataset/xxx 这样的错误或者训练了一个 epoch 后 loss 恒为0。原因YOLO 系列框架的标签目录结构要求是 images/train 和 labels/train 这种分离式而不是 labels 和 images 混在一个目录里另外是 txt 文件里类别 id 超出了我们 yaml 里 names 定义的数量。解决回到第3章的目录组织方式严格按 images 和 labels 分目录放好同时用 Python 脚本统计 txt 里的最大类别 id 是否小于 yaml 里的类别总数。跑一个快速统计awk {print $1} dataset/labels/train/*.txt | sort -n | uniq -c4.4 验证集里出现 normal 类mAP 虚高现象模型在验证集上表现惊艳mAP0.5 高达 0.95但放到真实场景完全不干活。原因这份数据集里有 normal 类也就是阴性样本如果你的验证集里 normal 占比过高模型只需要把大部分框预测为 normal 就能拿到很高的 mAP因为 normal 类本身特征就是不出现病灶框内区域相对干净判别难度比其他四个病变类别低很多。解决验证集划分时按类别比例做分层抽样保证每个类别的样本比例和整体数据集一致同时单独统计每个类别的 AP 值不要只看均值。YOLO 训练日志里会输出每个类别的 AP重点看 proliferation-DR 和 severe-DR 这两个类别它们的 AP 才是真正检验模型能力的指标。4.5 训练集和验证集类别分布差异过大导致泛化评估失真现象训练完模型在训练集上 mAP 很高验证集上掉得厉害差幅超过10%。原因随机划分在小数据集上容易造成类别不平衡分布偏移比如严重增殖期病例总共只有几十张全部流到训练集验证集里对应的类别样本缺失到个位数统计意义不足。解决用 sklearn 的 train_test_split 做 stratify 分层划分。以类别为标签对多标签情况先做主标签映射再按比例切分from sklearn.model_selection import train_test_split X base_names y [get_primary_class(b) for b in base_names] # 每张图取第一个或最主要的目标类别 train_files, val_files train_test_split( X, test_size0.2, stratifyy, random_state42 )5. 验证模型有没有真正学会单类别 AP 与一倍像素框的自检方法先理解一个概念mAP 是平均值它掩盖了不同类别的差异。糖尿病视网膜病变的数据集里normal 和 mild-DR 的判别难度不是一个量级normal 往往暗红色调均匀mild-DR 只是出现少量微动脉瘤框体小且密集。拿训练完的模型跑一遍验证yolo val modelbest.pt datadataset.yaml imgsz640重点看 results.csv 里每一类 AP0.5如果 severe-DR 的 AP 比 normal 低了20个点说明模型并没有真正学好严重病变的特征只是靠框面积和颜色纹理做了粗浅区分。我自己习惯的验证方法是拿真实世界图片跑一次推理挑proliferation-DR这类新生血管密集的样本看模型生成的框是否精确框住血管簇而不包含大块背景。如果框体明显大于病灶范围说明模型学到了纹理特征但边界回归不够精确imgsz从640提至1280往往能改善小目标回归。另外更新 v8 之后验证脚本会默认过滤置信度低于0.25的预测推理时记得加上 conf0.1 这类参数保留弱预测。最后说一个数据自检的土办法用 OpenCV 扫描所有 jpg 里疑似标注框的大小分布把宽度或高度小于 32 像素的框单独列表打出来。模型训练时下采样倍数为32这类小目标在特征图上的响应很弱如果不做针对性处理基本是学不到的。从那以后我每次拿医学数据集都会强制走一遍这个小框扫描先知道有哪些目标是注定难学的再决定去改 mosaic 增强还是调整锚框尺度。这个小习惯帮我避开了很多无效训练时间希望帮到你。本文还有配套的精品资源点击获取
返回列表