ARTICLE DETAIL

资讯详情

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

妇科皮肤病数据集YOLO实战:从4418张图像到高精度检测模型

妇科皮肤病数据集YOLO实战:从4418张图像到高精度检测模型 简介本资源为面向YOLO系列目标检测算法的妇科皮肤病图像数据集适合医学图像识别方向的算法工程师、研究生及竞赛选手使用可用于黑色素瘤、猴痘、水痘、痤疮、疣、花斑癣、粉刺、银屑病、湿疹、癣等多类皮肤病变的检测模型训练与验证。压缩包共2000个文件以xml标注文件为主同时提供YOLO格式txt与VOC格式xml两套标签分别存放于独立文件夹并附带data.yaml配置文件可直接适配yolov5、yolov7、yolov8、yolov9、yolov10及yolo11等主流版本。YOLO标签采用类别索引与归一化中心点、宽高坐标便于直接读取训练。资源包整体约169.39MB目录划分清晰训练集与验证集已预先切分省去自行整理与格式转换的环节。目前已有98人学习下载适合希望快速搭建皮肤病检测基线、对比不同YOLO版本效果或开展医学图像迁移学习实践的读者参考使用。1. 妇科皮肤病数据集遇上 YOLO4418 张带标签图像能跑出什么结果手里有一份 4418 张图像、带标注的妇科皮肤病数据集类别覆盖黑色素、猴痘、水痘、痤疮、疣、花斑癣、粉刺、银屑病、湿疹、癣文件名后缀是 .zip。这个标题真正要解决的问题不是「数据集有多大」而是「这批图像能不能直接喂给 YOLO 做检测或分类怎么喂喂完效果差在哪」。妇科皮肤病这个场景的特殊性在于病灶区域往往面积小、边界模糊、颜色和正常皮肤接近而且不同疾病之间的视觉差异可能只有几个像素级的纹理区别。如果你拿 COCO 预训练的 YOLO 直接推理大概率会把银屑病的鳞屑当成噪点把花斑癣的色素减退当成光照不均。适合读这篇的人手里有类似医学图像数据集、想用 YOLO 做基线、但不确定预处理和标注格式怎么对齐的工程师以及已经跑过一版、发现 mAP 卡在 0.3 上下、想找具体调参方向的从业者。下面按「数据先看懂 → 格式转对 → 训练跑通 → 坑位排查 → 进阶技巧」的顺序拆。2. 先看懂这批妇科皮肤病图像再谈 YOLO 训练2.1 4418 张图像里到底藏着什么分布问题拿到一个 zip 不要急着解压就 train。先做三件事统计每类图像数量、看图像尺寸分布、抽样看标注框的宽高比。妇科皮肤病数据集里黑色素和痤疮通常是高发类样本可能过千猴痘、水痘这类相对少见可能只有一两百张。这种长尾分布直接决定你后面是用加权损失还是做重采样。我一般会先写一个统计脚本不依赖任何深度学习框架纯 PIL os 就能跑import os from PIL import Image from collections import Counter img_dir data/images label_dir data/labels class_names [黑色素, 猴痘, 水痘, 痤疮, 疣, 花斑癣, 粉刺, 银屑病, 湿疹, 癣] sizes [] class_counter Counter() for fname in os.listdir(img_dir): if not fname.lower().endswith((.jpg, .png, .jpeg)): continue img Image.open(os.path.join(img_dir, fname)) sizes.append(img.size) # 对应 YOLO 格式标签 txt os.path.splitext(fname)[0] .txt txt_path os.path.join(label_dir, txt) if os.path.exists(txt_path): with open(txt_path) as f: for line in f: cid int(line.split()[0]) class_counter[class_names[cid]] 1 print(尺寸分布:, Counter(sizes).most_common(5)) print(类别框数:, class_counter)这段代码的逻辑是遍历图像目录记录每张图的 (宽, 高)同时读取同名 txt 标签文件里的类别 id累加每个类别的标注框数量。参数上class_names 的顺序必须和标注时的类别映射完全一致否则统计全错。跑完你会得到两个关键信息如果尺寸集中在 512×512 或 1024×1024说明数据已经过统一缩放如果尺寸五花八门YOLO 的 letterbox 预处理会引入更多黑边小病灶被进一步压缩。注意如果标签文件不是 YOLO 格式而是 VOC XML 或 CSV先别改脚本先确认标注工具导出的是什么格式后面第 3 章会讲转换。2.2 为什么妇科皮肤病场景不能直接套 COCO 预训练权重COCO 预训练权重是在自然图像上学的它学到的边缘、纹理、颜色分布和皮肤镜/临床照片差距很大。妇科皮肤病图像里病灶和周围皮肤的对比度低而且很多病变是弥漫性的没有清晰边界。COCO 里学到的「物体有明确轮廓」这个先验在这里反而是负迁移。常见做法是用 COCO 权重做初始化但把学习率调低并且冻结 backbone 的前几层。我一般会先跑一个 10 epoch 的小实验看 loss 下降曲线。如果前 3 个 epoch loss 几乎不降说明预训练权重和当前域差距太大这时候要么换医学图像预训练权重比如在 ISIC 或 DermNet 上训过的要么直接从头训但加大数据增强。另一个选型理由是类别数。COCO 是 80 类你这里是 10 类。YOLO 的检测头输出维度要改不能直接 load 全部权重。用 Ultralytics 的 YOLOv8 的话它会自动根据你的 data.yaml 里的 nc 重建检测头但 backbone 权重还是能用的。2.3 标注格式对齐从 zip 到 YOLO 可读目录YOLO 要求的数据结构是datasets/skin/ ├── images/ │ ├── train/ │ ├── val/ ├── labels/ │ ├── train/ │ ├── val/ └── data.yaml每个标签文件是 txt每行class_id x_center y_center width height全部归一化到 0~1。如果你拿到的标签是 VOC XML转换脚本如下import xml.etree.ElementTree as ET import os def voc_to_yolo(xml_path, img_w, img_h, class_map): tree ET.parse(xml_path) root tree.getroot() lines [] for obj in root.findall(object): name obj.find(name).text if name not in class_map: continue cid class_map[name] 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) # 归一化并转为中心点宽高 x_c (xmin xmax) / 2.0 / img_w y_c (ymin ymax) / 2.0 / img_h w (xmax - xmin) / img_w h (ymax - ymin) / img_h lines.append(f{cid} {x_c:.6f} {y_c:.6f} {w:.6f} {h:.6f}) return lines参数说明class_map 是你自己定义的类别名到 id 的映射必须和 data.yaml 里的 names 顺序一致。img_w 和 img_h 从对应图像读取不能硬编码。归一化时保留 6 位小数足够YOLO 内部会再处理。转换完一定要抽查几张用可视化脚本把框画回图上确认没有坐标偏移。提示如果原始标签是分割掩码polygonYOLO 也支持但格式是class_id x1 y1 x2 y2 ...且需要确保多边形点数是偶数。妇科皮肤病里如果标注的是病灶区域轮廓用分割模式比检测框更合适但训练成本更高。3. 用 YOLOv8 在妇科皮肤病数据集上跑通第一版基线3.1 环境搭建与 data.yaml 的四个必填字段Ultralytics 的 YOLOv8 是目前上手最快的选择pip 就能装。但医学图像场景我建议锁版本避免自动更新带来的 API 变动。pip install ultralytics8.0.200 pip install torch2.0.1 torchvision0.15.2 --index-url https://download.pytorch.org/whl/cu118data.yaml 必须包含四个字段path: /home/user/datasets/skin train: images/train val: images/val nc: 10 names: [黑色素, 猴痘, 水痘, 痤疮, 疣, 花斑癣, 粉刺, 银屑病, 湿疹, 癣]path 是数据集根目录train 和 val 是相对路径。nc 是类别数names 的顺序必须和标签里的 class_id 一一对应。这里最常见的翻车是names 写了中文但标签里的 id 是从 1 开始而不是 0。YOLO 要求 class_id 从 0 开始如果原始标注从 1 开始要么改标签要么在 names 前面加一个占位类。3.2 训练命令与六个影响 mAP 的关键参数启动训练的命令本身很简单yolo detect train \ datadatasets/skin/data.yaml \ modelyolov8s.pt \ epochs100 \ imgsz640 \ batch16 \ lr00.001 \ patience20 \ augmentTrue \ cacheTrue \ nameskin_baseline逐个说参数。modelyolov8s.pt 是 COCO 预训练的小模型医学图像数据量 4418 张不算大s 或 m 足够l 容易过拟合。imgsz640 是默认值但如果你的病灶很小可以提到 1024代价是显存翻倍。batch16 在 8G 显存下跑 640 尺寸没问题如果 OOM 就降到 8。lr00.001 是初始学习率微调场景可以降到 0.0005。patience20 表示 20 个 epoch 验证集 mAP 不升就早停防止过拟合。augmentTrue 开启默认增强包括 HSV 抖动、翻转、缩放但医学图像要慎用垂直翻转因为皮肤病变没有上下对称性。cacheTrue 把图像缓存到内存4418 张 640 尺寸大概占 4~6G 内存能显著加快训练。如果内存不够就去掉。3.3 训练日志里该盯哪三个指标跑起来之后控制台会输出一堆列。你只需要盯三个box_loss、cls_loss、mAP50。box_loss 是边界框回归损失如果它一直不降说明标注框有问题或者学习率太大。cls_loss 是分类损失妇科皮肤病里如果某些类样本极少cls_loss 会震荡。mAP50 是 IoU0.5 时的平均精度第一版基线能到 0.4~0.6 就算正常低于 0.3 说明数据或标注有系统性问题。我一般会在训练结束后跑一次验证看混淆矩阵yolo detect val modelruns/detect/skin_baseline/weights/best.pt datadatasets/skin/data.yaml混淆矩阵能告诉你哪些类被互相误判。妇科皮肤病里湿疹和银屑病、花斑癣和癣这两组最容易混。如果混淆矩阵显示它们互相误判超过 30%说明特征区分度不够需要加针对性增强或者换更大的输入尺寸。注意YOLO 的混淆矩阵总和有时不唯一因为一个预测框可能同时匹配多个真实框在低 IoU 阈值下。看的时候关注对角线比例不要纠结绝对数值。4. 妇科皮肤病 YOLO 训练避坑5 个血泪踩坑记录4.1 现象mAP 一直卡在 0.1 不涨loss 也不降原因标签文件里的坐标没有归一化还是像素值。YOLO 期望的是 0~1 之间的浮点数如果传了 0~640 的整数它会把框全部压到图像左上角一个像素区域内模型根本学不到东西。解决写个检查脚本遍历所有标签文件如果任何一行的后四个数有大于 1 的就说明没归一化。重新用第 2 章的转换脚本处理确保除以了图像宽高。4.2 现象训练到 30 epoch 后验证集 mAP 突然掉下去原因过拟合。4418 张图像里如果某些类只有几十张模型会记住这些样本验证集稍微一变就崩。妇科皮肤病数据集里猴痘、水痘通常样本少最容易触发。解决三个手段叠加。第一对少样本类做过采样在 data.yaml 里用oversample或者手动复制图像到 train 目录。第二加更强的增强比如 Mosaic 和 MixUpYOLOv8 默认开了 Mosaic可以再加mixup0.1。第三降低模型容量从 yolov8s 换到 yolov8n或者冻结 backbone 前 5 层。4.3 现象推理时框全挤在病灶边缘中心点偏移原因标注时用的是外接矩形但病灶形状不规则中心点不在病灶质心。YOLO 的回归目标默认是框中心如果标注框本身偏了模型学到的就是偏的。解决如果原始标注是分割掩码改用 YOLOv8-seg 做实例分割输出掩码而不是框。如果只有框检查标注规范确保框紧贴病灶外缘不要留太多背景。已经标好的话可以在训练时用box损失里的 CIoU 替换为 SIoU对中心点偏移更鲁棒。4.4 现象验证集 mAP 正常但实际推理时漏检严重原因验证集和实际推理的图像来源不同。妇科皮肤病数据集可能来自皮肤镜而实际推理用的是手机拍摄的临床照片光照、色温、焦距全变了。域偏移导致模型在实际场景失效。解决在验证集里混入一部分实际场景图像哪怕没有标注也可以用无监督域适应方法。更简单的做法是推理前做颜色归一化用 Gray World 或 CLAHE 把不同来源的图像拉到相近的色调和对比度。我一般会在推理脚本里加一步 CLAHEimport cv2 def preprocess(img_path): img cv2.imread(img_path) lab cv2.cvtColor(img, cv2.COLOR_BGR2LAB) clahe cv2.createCLAHE(clipLimit2.0, tileGridSize(8, 8)) lab[:, :, 0] clahe.apply(lab[:, :, 0]) return cv2.cvtColor(lab, cv2.COLOR_LAB2BGR)clipLimit2.0 是经验值太高会放大噪声太低没效果。tileGridSize 用 8×8 适合 640 尺寸的图像。4.5 现象训练速度极慢GPU 利用率只有 20%原因数据加载是瓶颈。4418 张图像如果每张都从磁盘读而且没有 cacheGPU 大部分时间在等 IO。另外如果 imgsz 设了 1024 但 batch 只有 4GPU 也跑不满。解决开 cacheTrue 把图像缓存到内存。如果内存不够把图像统一缩放到 640 存一份副本用这份副本训练。num_workers 设成 CPU 核数的 2 倍但不要超过 16否则进程切换开销反而大。还有一点如果数据集在机械硬盘上换到 SSD。5. 妇科皮肤病 YOLO 进阶从基线到可用的三个技巧5.1 用类别加权损失处理长尾分布妇科皮肤病数据集里黑色素和痤疮可能占一半以上猴痘和水痘可能不到 5%。默认的 YOLO 分类损失对所有类一视同仁导致少样本类被淹没。可以在训练时给分类损失加权重权重和类别频率成反比。Ultralytics 没有直接暴露这个参数但可以通过自定义损失函数实现。更简单的做法是在 data.yaml 里复制少样本类的图像让每个类的框数大致均衡。我一般会把少于 200 个框的类把对应图像复制 3~5 份到 train 目录文件名加后缀避免覆盖。验证集不动这样 mAP 评估还是真实的。5.2 用测试时增强TTA提升推理稳定性TTA 的思路是对同一张测试图像做多种变换翻转、缩放、亮度调整分别推理再把结果融合。YOLOv8 的 val 和 predict 都支持augmentTrue但那是训练时的增强。推理时可以用yolo detect predict modelbest.pt sourcetest.jpg augmentTrue它会自动做水平翻转和多尺度融合。代价是推理速度慢 3~5 倍。如果做离线批量诊断可以接受如果做实时视频不建议开。我一般会在最终评估时开 TTA 看上限实际部署时关掉。5.3 用混淆矩阵反推标注错误混淆矩阵不只是看模型表现还能反查标注质量。如果湿疹和银屑病互相误判率很高抽样看几张被误判的图像很可能发现标注时这两个类的边界定义就不清晰。妇科皮肤病里湿疹和银屑病在早期阶段视觉上确实难分如果标注医生自己都不一致模型更学不会。这时候要么合并这两个类要么在标注规范里加更明确的判别标准比如银屑病有 Auspitz 征湿疹有渗出倾向。我自己的习惯是训练完第一版后把 top-20 高置信度误判样本导出来人工过一遍往往能发现 5%~10% 的标注错误。修完再训一版mAP 通常能涨 3~5 个点。最后一句话医学图像数据集的质量永远比模型结构重要4418 张里如果有 10% 标错了换什么 YOLO 版本都救不回来。先花半天查标注再花半天调参顺序不能反。希望帮到你。本文还有配套的精品资源点击获取
返回列表