新闻详情

新闻详情

首页 / 资讯中心 / 详情

YOLO皮肤疾病检测实战:2343张数据集训练与避坑指南

发布时间:2026/9/24 22:59:29来源:尧图网络
YOLO皮肤疾病检测实战:2343张数据集训练与避坑指南
简介这份资源是面向皮肤疾病检测方向的YOLO系列目标检测数据集适合计算机视觉学习者、医学图像研究者及需要开展痤疮、皱纹、皮肤发红、黑头、毛孔等皮肤问题识别项目的开发者使用。数据集共包含2343张带标签图像已按训练与验证需求划分完毕并提供data.yaml配置文件可直接适配YOLOv5、YOLOv7、YOLOv8、YOLOv9、YOLOv10及YOLO11等主流算法。压缩包内文件总数约2000个以1792个VOC格式xml标注文件和208个YOLO格式txt标注文件为主两种标注分别存放于独立文件夹便于按需转换与训练包体整体约98.44MB结构清晰、开箱即用。目前已有106人学习下载。读者可借助该数据集快速完成模型训练、验证与测试省去自行采集与标注皮肤图像的成本同时通过双格式标签灵活对接不同检测框架为皮肤疾病辅助识别研究提供可靠的数据基础。1. 从一份 2343 张的皮肤疾病数据集说起YOLO 到底能检测出什么皮肤科门诊里最耗时的环节往往不是治疗而是分诊和初筛。怀特黑德、皱纹、皮肤发红、黑头、毛孔、痤疮这六类问题在肉眼判断时高度依赖光照、角度和医生经验同一张脸在不同诊室可能得到不同结论。这份 2343 张图像带标签的皮肤疾病检测数据集就是冲着这个痛点来的它把六类常见皮肤表征做成 YOLO 格式的边界框标注让目标检测模型直接学会“在哪里、是什么”。它适合三类人想入门医学图像检测的算法工程师、需要做皮肤初筛原型的应用开发者、以及手里有类似数据但不知道怎么组织成 YOLO 训练集的学生。读完你能拿到一条从数据校验、环境配置、训练调参到推理验证的完整路径而不是停留在“YOLO 很强”这种空话上。数据集规模不大2343 张意味着它更适合做垂直场景的快速验证而不是直接上生产。2. 皮肤检测数据集拆开看六类标签的分布与 YOLO 格式校验拿到一个压缩包第一件事不是急着解压训练而是搞清楚里面到底装了什么。皮肤疾病检测和通用目标检测最大的区别在于类别之间视觉边界模糊。痤疮和皮肤发红经常同时出现在一块区域毛孔和黑头在低分辨率下几乎无法区分。所以数据校验阶段必须把类别分布和标注质量摸清楚否则训练出来的模型只会学到一堆玄学。2.1 六类皮肤表征的标注特点与难点怀特黑德通常指闭合性粉刺表现为肤色小凸起边界和正常皮肤接近标注框容易画大或画小。皱纹是线状结构用矩形框标注本身就存在信息损失模型学到的更多是“皱纹密集区域”而不是单条皱纹。皮肤发红是弥散性区域框的尺度往往偏大。黑头和毛孔属于点状或微小面状目标在 2343 张里如果分辨率不够标注一致性会很差。痤疮则包含炎性丘疹和脓疱颜色对比相对明显是六类里最好学的。这六类放在同一个检测头下模型会面临类间竞争。常见做法是先把数据按类别数量排序看看有没有长尾类别。如果某一类少于 150 个实例训练时就要考虑过采样或类别权重。2.2 用脚本统计类别分布和框尺寸解压后先别动训练代码用下面这段脚本把数据集的底细摸一遍。它统计每类实例数、每张图的框数量、以及归一化框的宽高分布。import os import glob from collections import Counter # 数据集根目录按实际解压路径修改 root ./skin_dataset label_dir os.path.join(root, labels) img_dir os.path.join(root, images) class_names [whitehead, wrinkle, redness, blackhead, pore, acne] class_counter Counter() boxes_per_img [] wh_list [] for txt in glob.glob(os.path.join(label_dir, *.txt)): with open(txt, r) as f: lines [l.strip() for l in f if l.strip()] boxes_per_img.append(len(lines)) for line in lines: parts line.split() cid int(parts[0]) w float(parts[3]) h float(parts[4]) class_counter[class_names[cid]] 1 wh_list.append((w, h)) print(类别实例数:, dict(class_counter)) print(每图平均框数:, sum(boxes_per_img) / len(boxes_per_img)) print(最大框数:, max(boxes_per_img), 最小框数:, min(boxes_per_img)) # 统计小目标占比宽高都小于 0.05 视为小目标 small sum(1 for w, h in wh_list if w 0.05 and h 0.05) print(小目标占比:, small / len(wh_list))逻辑说明YOLO 格式每行是class_id x_center y_center width height全部归一化到 0 到 1。参数方面class_names的顺序必须和标注时的类别映射一致如果顺序错了后面训练出来的类别全是乱的。小目标占比这个指标很关键皮肤数据里黑头和毛孔如果小目标超过 40%就要在训练时调整锚框或输入尺寸。2.3 校验图像与标签是否一一对应YOLO 训练最常见的翻车现场是图片和标签对不上有图没标签、有标签没图、文件名差一个后缀。下面这段校验脚本必须在训练前跑一次。import os img_files {os.path.splitext(f)[0] for f in os.listdir(img_dir)} label_files {os.path.splitext(f)[0] for f in os.listdir(label_dir)} only_img img_files - label_files only_label label_files - img_files print(有图无标签:, len(only_img), list(only_img)[:5]) print(有标签无图:, len(only_label), list(only_label)[:5]) # 检查标签内容是否越界 bad [] for txt in os.listdir(label_dir): path os.path.join(label_dir, txt) with open(path) as f: for i, line in enumerate(f): p line.split() if len(p) ! 5: bad.append((txt, i, 字段数不对)) continue x, y, w, h map(float, p[1:]) if not (0 x 1 and 0 y 1 and 0 w 1 and 0 h 1): bad.append((txt, i, 坐标越界)) print(异常标签数:, len(bad))逻辑说明第一段用集合差集找出不匹配的文件第二段逐行检查字段数和坐标范围。参数上YOLO 的归一化坐标必须严格在 0 到 1 之间宽度和高度不能为 0。如果发现越界大概率是标注工具导出时用了像素坐标没归一化需要重新转换。提示校验脚本跑完再划分训练集和验证集否则你会把时间浪费在修数据上而不是调模型。3. 从零跑通 YOLOv8 训练环境、配置与第一轮基线数据没问题之后进入训练环节。皮肤疾病检测数据集只有 2343 张属于小数据集选型上优先考虑轻量模型。YOLOv8n 或 YOLOv8s 在 640 输入下参数量小、收敛快适合先跑基线。如果你用 YOLOv5流程类似但配置文件格式不同。下面以 YOLOv8 为主线因为它的训练接口更统一社区里 yolov8训练自己的数据集 的参考资料也最多。3.1 环境配置与目录结构先建一个干净的 conda 环境避免和系统里的包打架。Python 版本建议 3.9 或 3.10PyTorch 按显卡驱动选对应版本。conda create -n skin_yolo python3.10 -y conda activate skin_yolo # 根据 CUDA 版本安装 torch这里以 cu118 为例 pip install torch torchvision --index-url https://download.pytorch.org/whl/cu118 pip install ultralytics opencv-python matplotlib安装完成后用一行命令验证yolo checks它会打印环境信息重点看 CUDA 是否可用。如果显示 CPU only训练速度会慢到让你怀疑人生。目录结构按 YOLO 官方约定组织skin_dataset/ images/ train/ val/ labels/ train/ val/划分比例常见做法是 8:2。2343 张里大约 1874 张训练、469 张验证。如果某些类别实例特别少划分时要保证验证集里每类至少有几个实例否则验证指标没有意义。3.2 写数据配置文件与训练参数在数据集根目录建一个skin.yamlpath: ./skin_dataset train: images/train val: images/val names: 0: whitehead 1: wrinkle 2: redness 3: blackhead 4: pore 5: acne然后启动训练yolo detect train \ dataskin.yaml \ modelyolov8s.pt \ epochs100 \ imgsz640 \ batch16 \ lr00.01 \ patience20 \ projectruns/skin \ namebaseline参数说明imgsz640是输入分辨率皮肤小目标多的话可以提到 768 或 896但显存占用会上升。batch16在 8GB 显存上比较稳如果爆显存就降到 8。lr00.01是初始学习率小数据集上如果 loss 震荡明显可以降到 0.005。patience20表示 20 轮没有提升就早停避免过拟合。训练过程中重点看三个指标box_loss是否稳定下降、mAP50是否在 50 轮后还在涨、验证集的cls_loss是否远高于训练集。如果验证 loss 早早抬头说明模型开始背训练集了。3.3 第一轮基线结果怎么读训练结束后runs/skin/baseline下会有results.csv和混淆矩阵。先看每类的 AP不要只看 mAP50。皮肤数据里痤疮和皮肤发红容易混如果这两类的混淆矩阵对角线不突出说明特征区分度不够。常见做法是先把最容易混的两类合并跑一版确认整体流程通再拆开调。如果 mAP50 低于 0.3先别急着换模型。按这个顺序排查标签类别映射是否错位、图像是否被过度压缩、小目标是否太多导致锚框不匹配。我一般会先抽 20 张验证图做可视化推理肉眼看看框到底偏在哪。4. 皮肤检测训练避坑从标签错位到小目标漏检的排查清单这一章是血泪经验集中区。皮肤疾病检测数据集不像 COCO 那么规整标注主观性强训练时翻车点很集中。下面 5 条按“现象 → 原因 → 解决”写遇到问题直接对号入座。4.1 现象训练 loss 正常下降但推理时所有框都标成同一类原因skin.yaml里的names顺序和标注文件里的class_id不一致。YOLO 格式只存数字 id不存类别名映射错了模型学到的就是错位标签。解决回到 2.2 的统计脚本打印每个 id 对应的实例数再和标注工具里的类别顺序核对。如果用的是 LabelImg类别顺序就是当时标注时输入的顺序不要凭记忆。4.2 现象黑头和毛孔几乎检测不到mAP 接近 0原因这两类目标太小640 输入下经过多次下采样后特征几乎消失。另外标注框可能只有几个像素归一化后宽高小于 0.01。解决把imgsz提到 896 或 1024同时在训练配置里开启mosaic和copy_paste增强。如果还是不行考虑把黑头和毛孔合并成一类“微小皮肤纹理”先保证召回。4.3 现象验证集 mAP 波动很大每次训练结果差很多原因验证集太小469 张里某些类别只有十几张随机划分导致分布不稳定。另外皮肤图像受光照影响大如果训练集和验证集的光照条件不均衡指标会跳。解决用分层抽样重新划分保证每类在验证集里的比例和整体一致。常见做法是按类别实例数排序后轮流分配而不是随机train_test_split。4.4 现象模型把皱纹框到脸颊以外框特别大原因皱纹是线状结构矩形框标注时标注者倾向于把整片区域框进去导致框尺度偏大。模型学到的是“大片区域”而不是“皱纹”。解决检查标注规范把皱纹框限制在皱纹密集带。如果数据已经这样了可以在损失函数里调低box_loss权重或者用CIoU替换默认的GIoU对大框的惩罚更合理。4.5 现象训练到 60 轮后验证 loss 开始上升但训练 loss 还在降原因2343 张对 YOLOv8s 来说偏少模型容量相对数据量偏大过拟合了。解决把patience调到 15或者换 YOLOv8n。同时加dropout和权重衰减数据增强里把degrees、translate、scale开大一点。如果还不行冻结 backbone 前几层做微调。注意避坑清单不是让你一次全用上而是按现象定位。每次只改一个变量否则你永远不知道是哪个改动起了作用。5. 推理验证与进阶技巧让皮肤检测模型真正可用训练出 mAP 只是第一步能不能在实际图像上稳定输出才是关键。这一章讲三个进阶点推理时的置信度与 NMS 调参、用验证集做误检分析、以及小数据集下的模型微调习惯。5.1 推理参数怎么调才不漏检YOLO 默认conf0.25、iou0.45。皮肤数据里黑头和毛孔的置信度普遍偏低如果按默认值这两类会大量漏检。我一般会把conf降到 0.15同时把iou提到 0.5让密集小目标保留更多框。yolo detect predict \ modelruns/skin/baseline/weights/best.pt \ source./test_images \ conf0.15 \ iou0.5 \ saveTrue参数说明conf是置信度阈值降太低会引入误检需要配合验证集看 Precision-Recall 曲线。iou是 NMS 的 IoU 阈值皮肤目标重叠多阈值太低会把相邻的痤疮框合并掉。5.2 用验证集做误检分析而不是只看 mAPmAP 是聚合指标看不出具体错在哪。我习惯把验证集推理结果按类别导出统计每类的误检来源。下面这段脚本读取 YOLO 的预测结果和真实标签做简单匹配输出每类的漏检和误检数量。import os from collections import defaultdict # 这里假设已经用 yolo predict 导出了 txt 结果 pred_dir ./runs/skin/predict/labels gt_dir ./skin_dataset/labels/val def load_boxes(path): boxes [] if not os.path.exists(path): return boxes with open(path) as f: for line in f: p line.split() if len(p) 5: boxes.append((int(p[0]), float(p[1]), float(p[2]), float(p[3]), float(p[4]))) return boxes def iou(a, b): ax1, ay1 a[1] - a[3]/2, a[2] - a[4]/2 ax2, ay2 a[1] a[3]/2, a[2] a[4]/2 bx1, by1 b[1] - b[3]/2, b[2] - b[4]/2 bx2, by2 b[1] b[3]/2, b[2] b[4]/2 ix1, iy1 max(ax1, bx1), max(ay1, by1) ix2, iy2 min(ax2, bx2), min(ay2, by2) iw, ih max(0, ix2 - ix1), max(0, iy2 - iy1) inter iw * ih union a[3]*a[4] b[3]*b[4] - inter return inter / union if union 0 else 0 stats defaultdict(lambda: {tp: 0, fp: 0, fn: 0}) for txt in os.listdir(gt_dir): gt load_boxes(os.path.join(gt_dir, txt)) pred load_boxes(os.path.join(pred_dir, txt)) matched_gt set() for p in pred: best_iou, best_idx 0, -1 for i, g in enumerate(gt): if i in matched_gt or g[0] ! p[0]: continue v iou(p, g) if v best_iou: best_iou, best_idx v, i if best_iou 0.5: stats[p[0]][tp] 1 matched_gt.add(best_idx) else: stats[p[0]][fp] 1 for i, g in enumerate(gt): if i not in matched_gt: stats[g[0]][fn] 1 for cid, s in sorted(stats.items()): print(f类别{cid}: TP{s[tp]} FP{s[fp]} FN{s[fn]})逻辑说明这段脚本用 IoU 0.5 做匹配阈值统计每类的真正例、假正例和假负例。参数上匹配阈值可以按类别调整小目标可以放宽到 0.4。跑完你会清楚看到哪一类漏检最多再针对性补数据或调参。5.3 小数据集微调的一个习惯2343 张的数据集我一般不会从头训 300 轮。更稳的做法是先用 COCO 预训练权重跑 50 轮保存 best.pt然后在此基础上用更低学习率再跑 50 轮。第二次训练时把lr0降到 0.001freeze设为 10冻结前 10 层。这样既保留了通用特征又让检测头适配皮肤数据。阶段epochslr0freeze目的第一阶段500.010快速适配第二阶段500.00110精细微调这个习惯帮我省了很多次“训到一半发现过拟合”的后悔药。皮肤检测这类垂直场景数据量永远嫌少与其堆轮数不如把微调策略做细。希望帮到你。本文还有配套的精品资源点击获取
网站建设高端定制企业官网
RELATED

相关资讯

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

较早相关资讯

最新相关资讯

GaN栅极驱动设计指南:电压窗口、负压关断与PCB布局 2026/9/25 6:55:44

GaN栅极驱动设计指南:电压窗口、负压关断与PCB布局

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

阅读更多 →
ST-LINK连不上STM32?一文讲透调试器连接失败排查方法 2026/9/25 6:55:44

ST-LINK连不上STM32?一文讲透调试器连接失败排查方法

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

阅读更多 →
Atlas 300V 24G跑YOLO?昇腾边缘推理卡部署全解析 2026/9/25 6:55:37

Atlas 300V 24G跑YOLO?昇腾边缘推理卡部署全解析

最近后台不少人拿着同一个问题来找我:atlas 300V 24G是不是运算加速卡,能不能用来部署YOLO。我猜你们多半是看了某宝上那张一千多块的拆机卡,或者某个群里的二手硬件推荐。先说结论:它是加速卡,而且属性非常明确——昇…

阅读更多 →
计算机二级Python真题满分代码解析与高效备考指南 2026/9/25 6:55:37

计算机二级Python真题满分代码解析与高效备考指南

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

阅读更多 →
gsd-core ADR-457 迁移第三批次:10 个运行时模块转向严格 TypeScript 源码与 Build-at-Publish 构建流程 2026/9/25 6:55:24

gsd-core ADR-457 迁移第三批次:10 个运行时模块转向严格 TypeScript 源码与 Build-at-Publish 构建流程

【免费下载链接】gsd-core Git. Ship. Done - Core 项目地址: https://gitcode.com/gh_mirrors/ge/gsd-core 点击查看 免费下载 本文为 gsd-core(GSD Core,一个面向 AI 编码代理的元提示与上下文工程系统)的运行时类型化工程实践…

阅读更多 →
内网流媒体安全:浏览器访问模式的四大优势与落地配置 2026/9/25 6:55:24

内网流媒体安全:浏览器访问模式的四大优势与落地配置

折腾内网流媒体的朋友,应该都经历过这种场景:家里NAS跑着Jellyfin或者Emby,手机、电视、电脑上各装一个客户端,家人用起来确实方便。但时间一长,你总会发现不对劲——客户端在后台做了什么你根本不知道,它有…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

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

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