☰
YOLO妇科皮肤病检测数据集实战:4418张带标签图像训练与避坑指南
2026/9/28 15:25:25 网站建设 项目流程

简介:本资源为面向YOLO系列目标检测算法的妇科皮肤病图像数据集,适用于医学图像识别方向的算法学习与模型训练,覆盖黑色素、猴痘、水痘、痤疮、疣、花斑癣、粉刺、银屑病、湿疹、癣等多类皮肤病变。数据集已按训练与验证需求划分完毕,并附带data.yaml配置文件,可直接适配yolov5、yolov7、yolov8、yolov9、yolov10及yolo11等主流版本。压缩包共2000个文件,以xml标注文件为主,同时提供YOLO格式txt与VOC格式xml两套标签,分别存放于独立文件夹,便于不同框架直接读取;YOLO标签采用类别索引与归一化中心点、宽高坐标,符合标准检测训练规范。整包约169.39MB,目录结构清晰,已有98人学习下载。读者可据此快速搭建皮肤病检测实验环境,完成模型训练、验证与类别对比分析,省去数据清洗与格式转换环节。

1. 妇科皮肤病检测数据集:4418 张带标签图像能直接喂给 YOLO 吗

手里这份资源叫「yolo算法-妇科皮肤病数据集-4418张图像带标签」,覆盖黑色素、猴痘、水痘、痤疮、疣、花斑癣、粉刺、银屑病、湿疹、癣十类皮肤病变。它不是单纯的图片压缩包,而是已经按目标检测任务整理好的成品:图像、YOLO 格式 txt 标签、VOC 格式 xml 标签、划分好的训练验证目录,外加一份 data.yaml。对正在找「yolo系列算法目标检测数据集」的人来说,这类资源的稀缺点不在图片数量,而在于标签格式双份、目录结构完整、拿到就能接进 yolov5 到 yolo11 的训练管线。适合两类人:一类是想跑通皮肤病检测 demo 的算法工程师,另一类是拿它做数据增强、类别不平衡、小目标检测实验的研究者。下面按「这份资源是什么 → 怎么接进训练 → 哪里会翻车」的顺序拆开讲。

2. 数据集结构与标签格式:先看清目录再动手

2.1 目录布局与 data.yaml 的对应关系

拿到压缩包解压后,常见做法是先别急着改路径,用一条命令把目录树打出来。这份资源的典型结构是 images 与 labels 平行,train/val 各自成对,VOC 的 xml 单独放一个文件夹。先确认三件事:图像和标签是否同名、类别索引是否从 0 连续、data.yaml 里的 path 是不是相对路径。

# 打印两层目录,确认 images/labels 是否成对 find . -maxdepth 2 -type d | sort # 统计图像数量,和简介里的 4418 对一下 find ./images -type f \( -name "*.jpg" -o -name "*.png" \) | wc -l # 抽查一个标签文件,看类别索引和坐标范围 head -n 5 ./labels/train/img_0828_234.txt

逻辑说明:第一条命令只列目录,避免被几千个文件名刷屏;第二条用wc -l核对图像总数,如果明显少于 4418,多半是解压不完整或混入了非图像文件;第三条抽查标签,YOLO 格式每行是<class> <x_center> <y_center> <width> <height>,五个值用空格分隔,坐标必须是 0 到 1 之间的归一化值。如果看到大于 1 的数,说明这份标签是像素坐标没归一化,直接训练会全框错位。

data.yaml 是整份资源的入口,常见字段是path、train、val、nc、names。nc必须等于 10,names的顺序必须和标签里的类别索引严格对应。这里有个血泪经验:很多人只改path不改names顺序,训练能跑起来,但混淆矩阵会整体错位,最后模型把痤疮认成水痘还找不到原因。

2.2 YOLO txt 与 VOC xml 双格式怎么选

资源同时给了 txt 和 xml,不是让你两个都用,而是让你按框架选。YOLO 系列(v5/v7/v8/v9/v10/v11)直接吃 txt;如果你要转 COCO、做 MMDetection 或 MMrotate 那类框架的实验,xml 更省事,因为 VOC 转 COCO 的脚本成熟。判断标准很简单:训练入口是 ultralytics 就用 txt,训练入口是 mmdetection 或需要 json 标注就用 xml 起步。

格式存放位置坐标类型适用框架转换成本
YOLO txtlabels/归一化 0-1yolov5~yolo11零成本
VOC xmlAnnotations/像素绝对值mmdetection、COCO需转 json

选 txt 时要注意一个细节:YOLO 的x_center y_center是框中心点,不是左上角。有些从 VOC 转过来的脚本会漏掉除以宽高这一步,结果标签全挤在左上角。验证方法是对着一张图把标签画出来,框和病灶对不上就说明转换环节有问题。

2.3 类别不平衡:十类皮肤病的真实分布

十类病变里,黑色素、痤疮、湿疹通常样本多,猴痘、水痘、疣这类偏少。训练前先统计每个类别的框数量,别等训练完看混淆矩阵才发现某类几乎没学到。

import os from collections import Counter label_dir = "./labels/train" counter = Counter() for f in os.listdir(label_dir): if not f.endswith(".txt"): continue with open(os.path.join(label_dir, f)) as fp: for line in fp: cls = int(line.split()[0]) counter[cls] += 1 for cls_id in sorted(counter): print(f"class {cls_id}: {counter[cls_id]} boxes")

逻辑说明:遍历 train 下所有 txt,取每行第一个字段作为类别索引累加。参数上,label_dir换成你的实际路径即可。跑完如果发现最少类和最多类差一个数量级,常见做法是开 YOLO 的cls损失权重、用 mosaic 增强,或者在 data.yaml 之外单独做重采样。别直接复制少数类图片,容易过拟合到那几张。

3. 接进 YOLOv8/v11 训练:从 data.yaml 到第一个 epoch

3.1 环境与依赖:别在版本上翻车

ultralytics 的版本迭代快,yolov8 和 yolo11 的 API 基本一致,但和 yolov5 的仓库是两套。这份资源标称适用 v5 到 v11,实操上我一般分两条路:v8/v9/v10/v11 走 ultralytics 统一接口,v5/v7 走各自的仓库。先装环境再谈训练。

# 推荐用虚拟环境,避免和系统包冲突 python -m venv yolo_env source yolo_env/bin/activate # 装 ultralytics,覆盖 v8/v9/v10/v11 pip install ultralytics # 验证安装和版本 yolo version

逻辑说明:python -m venv建独立环境,source激活(Windows 用yolo_env\Scripts\activate)。pip install ultralytics会连带装 torch、torchvision,如果机器有 CUDA,建议先去 pytorch 官网拿对应 CUDA 版本的安装命令,再装 ultralytics,否则可能装成 CPU 版,训练慢到怀疑人生。yolo version确认装上了再往下走。

3.2 改 data.yaml 与启动训练

data.yaml 是唯一必须改的文件。把path指向解压后的数据集根目录,train、val指向 images 下的子目录。注意 YOLO 的路径解析是相对path的,写绝对路径也行,但换机器就得再改。

# data.yaml 示例,按实际目录调整 path: /data/skin_dataset train: images/train val: images/val nc: 10 names: 0: melanoma 1: monkeypox 2: chickenpox 3: acne 4: wart 5: tinea_versicolor 6: comedo 7: psoriasis 8: eczema 9: tinea

逻辑说明:nc必须和 names 条数一致,names 顺序必须和标签索引一致。类别英文名可以按你的习惯改,但改了之后评估脚本里的映射也要同步。启动训练:

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

参数说明:model用预训练权重能明显加快收敛,yolov8n.pt是最小的,显存紧张就选它;imgsz=640是常见输入尺寸,皮肤病病灶偏小可以试 800 或 1024,但显存翻倍;batch=16按显存调,OOM 就减半;device=0指定第一块 GPU,CPU 训练去掉这行但会很慢。训练日志里重点看box_loss、cls_loss和 mAP50,前几个 epoch loss 不降通常是学习率或标签问题。

3.3 验证与推理:确认模型真的学到了

训练完在 runs 目录下会有best.pt,拿它跑验证和单图推理。验证看整体指标,推理看具体框得对不对。

# 在验证集上评估 yolo detect val model=runs/detect/train/weights/best.pt data=./data.yaml # 对单张图推理并保存结果 yolo detect predict \ model=runs/detect/train/weights/best.pt \ source=./images/val/img_0828_234.jpg \ save=True \ conf=0.25

逻辑说明:val会输出 mAP50、mAP50-95 和每类指标,重点看少数类是不是接近 0。predict的conf=0.25是置信度阈值,皮肤病病灶边界模糊,阈值太高会漏检,太低会误检,常见做法是先在验证集上扫 0.1 到 0.5 找平衡点。save=True把带框的图存到 runs 目录,肉眼核对比看数字更直接。

4. 避坑与排查:标签、路径、显存这三处最容易出事

4.1 训练 loss 不降,标签坐标超范围

现象:训练几个 epoch 后box_loss一直在高位震荡,mAP 接近 0。原因:标签坐标没归一化,或者混入了像素坐标的 txt。解决:写个脚本扫一遍所有标签,任何坐标大于 1 就报错定位到具体文件,重新用 VOC xml 转一次。

import os bad = [] for root, _, files in os.walk("./labels"): for f in files: if not f.endswith(".txt"): continue p = os.path.join(root, f) with open(p) as fp: for i, line in enumerate(fp): vals = line.split() if len(vals) != 5: bad.append((p, i, "字段数不对")) continue coords = list(map(float, vals[1:])) if any(c < 0 or c > 1 for c in coords): bad.append((p, i, "坐标越界")) for b in bad[:20]: print(b) print("问题文件数:", len(bad))

逻辑说明:遍历 labels 下所有 txt,检查每行是否 5 个字段、坐标是否在 0 到 1。只打印前 20 条避免刷屏,最后给总数。跑出来有问题就说明这份标签需要重新归一化,别硬训。

4.2 路径写错,训练报「No labels found」

现象:启动训练立刻报找不到标签或图像数为 0。原因:data.yaml 的path和train拼接后指向了不存在的目录,或者 images 和 labels 没在同一层级。解决:用ls逐层确认,YOLO 默认在 images 同级找 labels,目录名必须是images和labels,不能改成imgs。

4.3 显存 OOM 与 batch 设置

现象:训练中途报 CUDA out of memory。原因:imgsz或batch超过显存。解决:先把 batch 减半,还不行就降 imgsz 到 512,或者换更小的模型(n 换 s 是反向,n 最小)。另外workers太多也会吃内存,设成 4 或 8 就够。

4.4 类别索引与 names 错位

现象:训练正常,但混淆矩阵里类别名和实际对不上。原因:data.yaml 的 names 顺序和标签索引不一致。解决:抽一张图,用标注工具打开对应 txt,看类别索引,再和 names 逐条核对。这个坑最隐蔽,因为指标看着正常,只有肉眼看预测框才发现。

4.5 验证集泄漏进训练集

现象:验证 mAP 高得离谱,换新图就崩。原因:train 和 val 里有重复或高度相似的图像。解决:对 train 和 val 的图像做哈希去重,皮肤病图像如果有同一患者的多张近似图,要按患者划分而不是随机划分。

5. 进阶技巧:用双格式标签做交叉验证与数据增强

这份资源给的双格式标签,最大的价值不是二选一,而是互相校验。我一般会写个脚本,把 VOC xml 转成 YOLO txt,再和资源自带的 txt 逐行比对,差异超过阈值的文件单独拎出来人工看。这一步能抓出转换脚本的 bug,也能发现标注本身的不一致。具体做法:用 xml 解析出像素坐标,按图像宽高归一化,和 txt 里的五个值对比,中心点偏差超过 0.01 就标记。

import xml.etree.ElementTree as ET from PIL import Image def xml_to_yolo(xml_path, img_path): tree = ET.parse(xml_path) root = tree.getroot() w, h = Image.open(img_path).size rows = [] for obj in root.findall("object"): cls = obj.find("name").text bbox = obj.find("bndbox") xmin = float(bbox.find("xmin").text) ymin = float(bbox.find("ymin").text) xmax = float(bbox.find("xmax").text) ymax = float(bbox.find("ymax").text) xc = (xmin + xmax) / 2 / w yc = (ymin + ymax) / 2 / h bw = (xmax - xmin) / w bh = (ymax - ymin) / h rows.append((cls, xc, yc, bw, bh)) return rows

逻辑说明:解析 xml 的 object 节点,取 bndbox 四个角点,换算成 YOLO 的中心点加宽高归一化格式。w, h从原图读,不能用固定值。拿到 rows 后和 txt 对比,类别名要先映射成索引再比。这个交叉验证跑一遍,基本能确认标签质量。

数据增强方面,皮肤病图像的颜色和纹理是重要特征,慎用大幅度的 HSV 偏移,容易把癣和湿疹的颜色特征改没。mosaic 和 mixup 可以用,但 mixup 在医学图像上要小心,两张病灶叠一起可能产生不存在的病变形态。我一般开 mosaic,关 mixup,加一点随机旋转和水平翻转。另外十类里小目标多,imgsz提到 800 对小病灶召回有帮助,代价是显存和训练时间。

还有一个容易被忽略的点:这份数据集的类别里有猴痘、水痘这类传染病相关病变,做 demo 没问题,但如果要往临床方向走,必须确认数据来源和伦理合规,别拿公开数据集直接当诊断依据。技术验证和实际部署是两回事,模型在验证集上的 mAP 不代表临床可用性。

从那以后我每次拿到新数据集,都强制先跑一遍标签坐标范围检查和 train/val 去重,再动训练脚本。这两步花不了十分钟,能省掉后面几小时的无效训练。希望帮到你。

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

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询