ARTICLE DETAIL

资讯详情

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

『已增强』皮肤疾病检测数据集实战:YOLO/VOC格式转换与泄漏排查

『已增强』皮肤疾病检测数据集实战:YOLO/VOC格式转换与泄漏排查 简介面向医学影像目标检测任务这份数据集围绕9种常见皮肤疾病整理共11294张已增强的jpg图像覆盖光化性角化病、基底细胞癌、皮肤纤维瘤、黑素瘤、痣、脂溢性角化病、鳞状细胞癌等类别并同步提供VOC格式xml与YOLO格式txt标注可直接用于目标检测模型训练与评估。压缩包约2000个文件以xml标注文件为主同时包含txt标签说明整体体积约380.8MB解压后JPEGImages、Annotations、labels三个目录分别存放图像、xml与txt文件结构清晰便于接入现有训练流程。各标签类型均配有独立边框标注整体框数较为均衡且图像经过增强处理适合作为皮肤病变检测的入门数据集、迁移学习基座或算法对比基准。目前已有167人学习下载适合需要现成标注数据进行实验的深度学习开发者、医学影像算法工程师及相关方向研究者。1. 拿到医学皮肤疾病检测数据集先别急先看清“已增强”这三个字上周一个做医疗 AI 的朋友来找我说他从一个公开渠道下载了一份皮肤疾病检测数据集11294 张图覆盖 9 种常见皮肤疾病压缩包叫“数据集-医学常见9种皮肤疾病检测数据集11294张YOLOVOC格式已增强.zip”。他急着想丢进 YOLO 里跑一版问我要不要直接开始。我瞄了一眼标题第一反应是先问他验证集是不是也被增强过他愣了一下——没检查。这个标题里最有信息量的不是 11294 张不是 9 类不是 YOLOVOC而是“已增强”。离线增强做得不规范会让训练集和验证集出现同源样本模型背答案而不是学病灶特征。这篇笔记就围绕这个压缩包展开YOLO 和 VOC 两套格式怎么对应、解压后目录怎么规范、训练参数怎么定、最常见的坑在哪最后告诉你如何验证增强到底有没有带来真实收益。适合手里已经有这类数据集、准备用 YOLOv8/YOLOv5 训练的人也适合想系统处理医学图像检测数据的新手。2. YOLO与VOC格式如何对应九类皮肤疾病的标签解析2.1 这9类皮肤疾病为什么该用目标检测而不是分类皮肤疾病数据集最常见的两种任务是整图分类和目标检测。标题里写的是“检测数据集”说明它给的是病灶位置的框而不是给整张照片一个标签。这个区分很重要皮肤镜下的一张图经常同时出现多个病灶比如一个患者皮肤上既有普通痣又有可疑黑色素瘤甚至同一张照片里有几处不同类型的病变。图像分类模型学的是“整张图的全局特征”很容易被背景肤色、光照、毛发干扰而目标检测强制模型定位到病变区域再分类信息量更大也更接近医生看片的习惯。9 类皮肤疾病具体是哪 9 类我拿不到原始包之前不会替你断死。从类似的公开皮肤疾病数据集来看常见的组合会覆盖痤疮、黑色素瘤、基底细胞癌、脂溢性角化病、皮炎、银屑病、湿疹、荨麻疹、单纯疱疹这类高频病种。但这里有个非常重要的动作解压后第一时间打开 classes.txt 或者任意一个 VOC 标注文件来确认类别顺序。很多这类数据集的坑就藏在类别顺序里文件名排序和 YOLO 的 class_id 对不上会在训练阶段造成灾难。这类数据集一般会附带两种格式VOC 格式是每张图一个 xml 文件里面记录目标类别和 bndbox 坐标YOLO 格式是每张图一个 txt 文件每行记录 class_id 和归一化后的中心点坐标。两种格式内容等价但组织方式和字段单位完全不同。VOC 容易阅读适合人工校对YOLO 适合直接训练但一旦 class_id 写错模型会在全部类别上集体翻车。2.2 VOC 的 xml 与 YOLO 的 txt字段与换算公式VOC 格式的标注文件长这样annotation folderJPEGImages/folder filenameskin_0001.jpg/filename size width1280/width height720/height depth3/depth /size object namemelanoma/name bndbox xmin312/xmin ymin198/ymin xmax456/xmax ymax342/ymax /bndbox /object /annotationYOLO 格式对应的 txt 文件内容是0 0.300 0.375 0.112 0.200这一行数字依次是类别 id、框中心点的 x 归一化坐标、框中心点的 y 归一化坐标、框的宽度归一化值、框的高度归一化值。x_center 的计算方式是 (xmin xmax) / 2 / widthy_center 是 (ymin ymax) / 2 / heightw 是 (xmax - xmin) / widthh 是 (ymax - ymin) / height。工程上把 VOC 转 YOLO 不需要手算用 Python 脚本批量处理即可。我一般会把脚本参数化输入 VOC 标注目录、输出 txt 目录、类别名列表脚本自动过滤没有标注的图片并生成 classes.txt。下面这个脚本是常见做法可以直接抄import xml.etree.ElementTree as ET import os from pathlib import Path VOC_DIR path/to/voc_labels YOLO_DIR path/to/yolo_labels IMG_W 1280 # 如果 xml 里有 size 字段优先读 xml此处是兜底 IMG_H 720 CLASS_NAMES [acne, melanoma, bcc, sk] # 以实际 classes.txt 为准 os.makedirs(YOLO_DIR, exist_okTrue) for xml_path in Path(VOC_DIR).glob(*.xml): tree ET.parse(xml_path) root tree.getroot() size root.find(size) if size is not None: img_w int(size.find(width).text) img_h int(size.find(height).text) else: img_w, img_h IMG_W, IMG_H txt_name xml_path.stem .txt lines [] for obj in root.findall(object): name obj.find(name).text if name not in CLASS_NAMES: continue class_id CLASS_NAMES.index(name) bndbox obj.find(bndbox) xmin int(bndbox.find(xmin).text) ymin int(bndbox.find(ymin).text) xmax int(bndbox.find(xmax).text) ymax int(bndbox.find(ymax).text) x_center ((xmin xmax) / 2) / img_w y_center ((ymin ymax) / 2) / img_h box_w (xmax - xmin) / img_w box_h (ymax - ymin) / img_h lines.append(f{class_id} {x_center:.6f} {y_center:.6f} {box_w:.6f} {box_h:.6f}) with open(os.path.join(YOLO_DIR, txt_name), w) as f: f.write(\n.join(lines))脚本逻辑很直接解析 xml 拿到对象名和 bndbox 坐标通过 CLASS_NAMES 列表把类别名映射为整数 id然后转换成归一化的 YOLO 格式写入 txt。需要注意两个参数一个是 CLASS_NAMES 的顺序必须和数据集包里的类别定义完全一致否则训练时类别对不上另一个是 xml 如果带 size 字段优先用 size 里的真实宽高而不是写死 IMG_W/IMG_H否则缩放过的图转换出来坐标会整体偏掉。转换完成后必须做校验。统计图像文件数、xml 文件和 txt 文件数是否一一对应抽查 3 到 5 个样本用 labelImg 或在线可视化工具打开看框是否贴在病灶边缘。这个步骤偷懒后面训练的 mAP 就会给你颜色看。2.3 “已增强”三个字才是排查重点标题里写“已增强”意味着压缩包里的图片可能不是原始照片而是经过了翻转、旋转、亮度对比度扰动、HSV 扰动、随机裁剪等操作的副本。增强本身不是坏事医学图像数据集规模普遍偏小离线增强是常见补数手段。但增强有一个颠扑不破的原则验证集不能参与任何形式的增强。很多数据集打包时不够严谨会直接把增强副本全部塞进训练集这没问题但有些是把增强后的图片按文件名后缀顺序划分 train 和 val导致 val 里有某张训练图的增强副本。比如原图叫 skin_0001.jpg翻转后叫 skin_0001_flip.jpg两张图一张在 train一张在 val模型在验证时看到的其实就是“背过的题”。训练曲线非常漂亮mAP 高得吓人但换一批真实拍摄的皮肤照片去测效果立刻跌回谷底。拿到压缩包后第一步别急着训练先统计增强副本的分布。看文件名有没有规律比如包含 flip、rot、bright、aug 这样的后缀再对 train 和 val 做感知哈希查重把相似度过高的图片对找出来。查重脚本长什么样放在第 3 章讲这里先说结论验证集必须是纯原始图像最好还来自不同的患者或拍摄来源才能反映模型在真实场景下的泛化能力。3. 解压与目录规范从 zip 到能直接喂给 YOLOv8 的训练集3.1 解压前先查完整性伪加密和中文路径zip 压缩包在 Windows 和 Linux 下都可能踩坑。标题这个文件名本身带中文解压到 Windows 时如果路径里有中文目录部分旧版图形化解压工具会报错或者解出乱码文件夹。我一般建议直接解压到纯英文路径比如D:/datasets/skin9路径里不要有空格和中文否则后面训练时 YOLO 的数据加载层会遇到莫名其妙读不到图的问题。伪加密也是 zip 文件里常见的老问题。它的原理是文件头里的加密标志位被置位但实际上内容并没有加密。遇到解压要求输密码的情况先不要急着找暴力破解工具先用 Python 的 zipfile 读一下试试import zipfile zip_path 数据集-医学常见9种皮肤疾病检测数据集11294张YOLOVOC格式已增强.zip with zipfile.ZipFile(zip_path, r) as zf: for info in zf.infolist(): print(info.filename, info.flag_bits, info.compress_size, info.file_size) # 读取第一个文件内容来判断是否真的加密 try: zf.read(info.filename) print(可以正常读取属于伪加密或未加密) break except RuntimeError: print(文件内容真加密读取失败)这个脚本打印每个文件的名字、flag_bits、压缩前后大小然后尝试读取第一个文件内容。如果 zipfile 能直接读出来说明它是伪加密换 7-Zip 或者 Bandizip 打开即可不需要密码如果确实抛 RuntimeError说明内容是真加密这不是技术问题而是权限问题应该按照数据提供者的要求联系对方获取解压方式而不是自行破解。自己做数据集打包时也注意别误勾伪加密选项否则别人解压会困惑。解压完成后做两件事目录结构总览和文件计数。用命令行看一眼根目录下有哪些文件夹和文件类型然后统计数量是否和标题相符find . -type f | sed s/.*\.// | sort | uniq -c find . -name *.jpg | wc -l find . -name *.xml | wc -l find . -name *.txt | wc -l第一条命令统计所有文件类型的数量分布后面三条分别统计 jpg、xml、txt 数量。11294 张图对应的标注文件应该在数量上接近。如果不是说明解压不完整或者 zip 里本身就有空标注文件需要进一步排查。很多数据集会有少量背景图或空标注文件YOLO 训练时需要单独处理不能直接删掉标注留一张无标签图否则训练报错。3.2 目录结构怎么摆成 YOLO 习惯无论是 YOLOv5、YOLOv8 还是 YOLO11数据加载器默认认可一种目录组织方式。常见做法是这样的skin9/ ├── images/ │ ├── train/ │ └── val/ ├── labels/ │ ├── train/ │ └── val/ └── data.yamlimages 和 labels 必须是一一对应的images/train/skin_0001.jpg对应labels/train/skin_0001.txt。图片文件名和标注文件名完全相同只是后缀不同。YOLO 训练时会按这个对应关系去找标签名字对不上就找不到标签训练时这张图会被跳过或直接报错。原始压缩包里如果只有 VOC 标注就先按第 2 章的脚本把所有 xml 转成 txt。如果要不要拆 train/val就看包的说明。很多已增强数据集会直接把 train/val 划分好没划分的话按 8:1:1 或者 9:1 拆。注意拆的时候用random.seed()固定随机种子方便复现。下面这段 Python 负责按比例拆分并保证图像和标签同名迁移import os import random from pathlib import Path import shutil IMAGE_SRC Path(skin9/jpg) # 所有jpg所在目录 LABEL_SRC Path(skin9/labels) # 所有txt所在目录 TRAIN_RATIO 0.9 VAL_RATIO 0.1 random.seed(42) imgs list(IMAGE_SRC.glob(*.jpg)) random.shuffle(imgs) train_n int(len(imgs) * TRAIN_RATIO) train_imgs imgs[:train_n] val_imgs imgs[train_n:] def copy_split(img_list, split_name): img_dst Path(fskin9/images/{split_name}) lab_dst Path(fskin9/labels/{split_name}) img_dst.mkdir(parentsTrue, exist_okTrue) lab_dst.mkdir(parentsTrue, exist_okTrue) for img in img_list: label LABEL_SRC / (img.stem .txt) if not label.exists(): continue shutil.copy(img, img_dst / img.name) shutil.copy(label, lab_dst / label.name) copy_split(train_imgs, train) copy_split(val_imgs, val)这个脚本的逻辑是把所有 jpg 读进来按固定随机种子洗牌按比例分成 train 和 val 两份然后逐对复制图片和同名 txt。有一个细节建议如果是从包含增强副本的完整数据里拆务必先把原始图像和增强副本分开再各自按比例划分而不是直接 shuffle 全部文件。直接 shuffle 会让增强副本和原图随机散落在 train/val 里造成同源泄漏。3.3 增强副本查重避免训练验证一半泄漏“已增强”数据集的副本通常有命名特征但有些打包者会把增强后的文件重命名为不带后缀的新名字靠文件名看不出来。这时需要算感知哈希perceptual hash来做查重。感知哈希会把图像缩小成 8x8 或 16x16 的灰度图计算每个像素的均值关系生成一串哈希值。相似的图片哈希值也接近用汉明距离判断相似度。下面是一个最小实现from PIL import Image import imagehash from pathlib import Path imgs list(Path(skin9/images/train).glob(*.jpg)) hash_dict {} for img_path in imgs: h imagehash.phash(Image.open(img_path), hash_size8) for existing, path in hash_dict.items(): if h - existing 6: # 汉明距离小于6视为疑似重复 print(f疑似重复: {path} {img_path}, 距离: {h - existing}) break else: hash_dict[h] img_path这里用 imagehash 库的 phash 方法hash_size8生成 64 位哈希阈值 6 表示两张图可视为同源近似。这个脚本的作用不是删图而是把疑似重复对的名单打印出来人工确认后决定验证集是否要剔除增强副本。阈值可以调6 偏严格8 以上会放过很多光照变化较大的副本。建议从 6 开始先看输出量再决定放不放宽。查重的真正意义在于验证集如果包含训练图的增强版本mAP 会上浮 5 到 15 个点给后续调参造成错觉。这个处理在医学图像里尤其重要因为皮肤照片的拍摄光照、角度差异本身就会带来不小的分布偏移如果模型在增强副本上“作弊”真实评估时完全无法判断是模型学得好还是泄漏在起作用。4. 用 YOLOv8 训练自己的皮肤疾病数据集命令、参数与曲线判读4.1 环境准备、预训练模型与显存预算训练选 YOLOv8 是目前社区生态最顺的选择文档全、报错少、在线增强默认合理。环境准备只需要一个干净的 conda 环境Python 3.10 左右然后安装 ultralyticsconda create -n skin python3.10 -y conda activate skin pip install ultralytics预训练模型方面ultralytics 会自动下载但国内网络环境容易下载失败。常见做法是手动下载 yolov8n.pt、yolov8s.pt、yolov8m.pt 放到工作目录训练时指定本地权重路径。皮肤病灶在图像里往往只占很小一块区域yolov8n 的模型容量偏小建议从 yolov8s 或 yolov8m 起步。用 m 还是 s 取决于显存yolov8m 在 imgsz640、batch16 时显存开销约 16G 到 20GV100 32G 能跑如果只有 8G 显存就得降到 batch8 或者换 yolov8s。batch 大小和显存的计算没有玄学按这个经验公式估算yolov8s 在 640 分辨率下单卡每张图约 1.2G 到 1.5G 显存yolov8m 约 2G 到 2.5G。这只是激活值和梯度的占用还没算优化器状态和 batch 累积。显存不够时优先降 batch不要降 imgsz因为皮肤病灶偏小分辨率一旦降下来小目标就彻底丢了。4.2 一份 data.yaml 和一条训练命令怎么定data.yaml 是 YOLO 训练的数据入口。按上面的目录结构文件内容这样写path: D:/datasets/skin9 train: images/train val: images/val names: 0: acne 1: melanoma 2: bcc 3: sk 4: dermatitis 5: psoriasis 6: eczema 7: urticaria 8: herpespath 指向数据集根目录train 和 val 是相对路径names 里的 id 顺序必须和 labels txt 里的 class_id 完全一致。别人给你的包一般会带一个classes.txt你读里面的行顺序填进 names 就行千万别自己按字母排序否则类别就错位了。训练命令我一般这样写yolo train \ modelyolov8m.pt \ dataskin9.yaml \ epochs120 \ imgsz640 \ batch16 \ device0 \ optimizerAdamW \ lr00.001 \ mosaic0.5 \ flipud0.0模型选择 yolov8m.pt 是因为皮肤疾病类别之间差异往往不大比如基底细胞癌和脂溢性角化病外观接近轻量模型学不到足够判别性的特征。epochs 设 120 是因为增强数据集样本量过万100 轮以内通常也能收敛但医学小病灶容易欠拟合多训 20 轮更稳。optimizerAdamW 适合医学小样本场景SGD 收敛稍慢但泛化有时更好如果想严谨对比可以两种都试。flipud0.0是关闭上下翻转医学图像里上下翻转会产生不符合解剖常识的样本不是所有病种都适合开。mosaic0.5是相比默认的 1.0 做了削减因为皮肤病灶被马赛克拼接后会产生错误的上下文信息且这个数据集本身已经做过增强mosaic 再全开会造成双重扰动。如果训练时发现验证集 loss 一路走高优先查两件事数据泄漏和类别错位。不要立刻调学习率那是最容易浪费时间的方向。4.3 损失函数、mAP 和混淆矩阵怎么看训练日志里会出现三个 loss 分量box_loss、cls_loss、dfl_loss。box_loss 衡量预测框和真实框的位置偏差cls_loss 衡量分类是否正确dfl_loss 是分布焦点损失负责框边界的精准度。对皮肤疾病检测来说关注点主要在 cls_loss 和 box_loss 的下降斜率。类别不平衡时 cls_loss 会在前 20 轮快速下降然后进入平台期甚至小幅震荡这是正常现象不是过拟合信号。mAP50 和 mAP50-95 需要分开看。mAP50 只要求预测框和真实框的 IoU 大于 0.5 就算命中对框位置的精度要求低mAP50-95 是多个 IoU 阈值下的平均对定位精度敏感。如果 mAP50 很高但 mAP50-95 明显偏低说明模型“找到了病灶但框不准”这时优先调盒回归相关的参数而不是去加数据。如果两个指标都偏低回到第 3 章的泄漏排查或者提高 imgsz。混淆矩阵在runs/detect/train*/confusion_matrix.png。Ultralytics 的混淆矩阵默认按行归一化每一行之和是 100%所以“每一列加起来不等于 100%”是正常的这不是 bug。读的时候重点看对角线之外的高亮格子皮肤疾病里最典型的误判是基底细胞癌和脂溢性角化病互相混淆以及黑色素瘤被误判为普通痣。这两个误判直接关系到模型能否用于辅助筛查比整体 mAP 更重要。5. 皮肤疾病检测数据集踩坑记录5 个翻车现场与补救方案5.1 训练指标漂亮但换图就翻车增强泄漏现象训练集 mAP50 达到 0.92验证集也高达 0.90但拿到新拍摄的皮肤镜像上检测mAP 掉到 0.55。原因验证集里混入了训练集的增强副本。模型在验证时识别的是“这张图的变体我看过”而不是病灶本身。解决按第 3 章的感知哈希脚本对 train 和 val 做交叉查重凡是在 val 中与某张 train 图汉明距离小于 6 的在验证集中删除保留最接近原始状态的版本。重新划分后指标会下降但那个下降后的数字才是真实水平。这个步骤必须在训练前做训练后做只能后悔。5.2 loss 不降、mAP0九成是类别 id 错位现象训练 20 轮后 box_loss 明显下降但 cls_loss 基本不动验证集 mAP 一直为 0predict 输出所有框都标成同一个类别。原因VOC 转 YOLO 时 class_id 映射错了。比如数据集包里的 classes.txt 第 1 行是 melanoma转换脚本里 CLASS_NAMES 的第 1 个元素却是 acne导致所有标签整体平移一个类别。解决解压后先打印 classes.txt 的内容与任意一个 VOC xml 的name字段对比。如果包里两类格式都给了随机挑 3 张图同时打开 xml 和 txt手工计算一遍归一化值是否一致。不要信任任何“现成转换出来的 txt”除非你验证过至少 5 个样本。5.3 小病灶漏检召回率低imgsz 太小和切片推理现象mAP50 尚可但 recall 很低尤其是雀斑样痣、早期黑色素瘤这类只占图像 2% 面积的小目标经常整张三四个病例一个都没框出来。原因imgsz640 会把原始图压缩小病灶缩到只剩十几个像素特征完全丢失。解决先看原始图的标注框尺寸分布统计 bbox 宽度占图像宽度的比例。如果大量目标占比小于 5%把 imgsz 提到 960 或 1280batch 相应下调。显存不够时用 SAHI 这类切片推理工具把图像切成重叠小块分别推理再合并结果比盲目降 batch 更有效。这一步是血泪经验皮肤病变非常依赖局部纹理分辨率就是你模型的命根子。5.4 高分辨率病理图缩放后再标注框全错位现象有人用 labelImg 打开 4000x3000 的大图后习惯性地先缩放到 1024 再画框保存标注后直接训练发现模型收敛但预测框位置全部偏移。原因VOC 标注文件里的 bndbox 坐标必须对应原始图像像素坐标。如果你在缩放后的视图上标注labelImg 默认保存的是当前显示尺寸下的坐标训练时数据加载器把原图 resize 到 imgsz会对坐标做一次 resize 变换但你的标注坐标已经在错误的尺寸体系里。解决在 labelImg 里把view设置为 auto 后只用于显示不要缩放保存。检查 xml 里的 width/height 是否等于原始图片的宽高如果不一致坐标会整体比例偏移。遇到这种情况就按第 2 章的转换思路反向换算把坐标先还原到原图坐标系再转 YOLO。5.5 同一患者多张图同时出现在 train 和 val身份泄漏现象模型指标奇高尤其 mAP50 能到 0.95但部署到另一家医院的数据上效果断崖。原因皮肤疾病数据集拍摄时同一个患者可能有多张图按文件随机划分 train/val 时同一患者的照片被拆到两侧。模型学到的是“这位患者的皮肤纹理特征”而不是泛化的病灶特征。这是医学图像里最隐蔽的泄漏方式比增强泄漏更难防。解决数据集如果带患者 ID 或来源字段按患者 ID 分组后再划分 train/val保证同一个患者的所有图都在同一侧。如果压缩包里没有患者字段靠文件名猜测——通常同一个患者会有前缀相同的命名。这类泄漏的隐蔽之处在于训练曲线不会有任何异常只能靠人工检查文件名分布。建议自己也养成习惯凡是医学数据划分维度永远是患者而不是图像。6. 最后一课怎么量化“已增强”数据的真实收益6.1 A/B 对照实验怎么设计很多数据集的“已增强”是打包者的劳动成果但增强到底带来多少收益应该自己亲手验证一遍而不是想当然。我的习惯做法是在数据集里分离出原始子集和增强副本子集然后用同一份干净验证集做 A/B 对照。设计如下A 组只用原始图像训练B 组用原始图像加增强副本训练验证集固定用同一批纯原始图像且保证验证集不参与任何增强。两组的训练参数完全一致只允许 epochs 不同因为增强副本会让数据量翻倍需要的迭代轮次可能不同。每组训练完记录 mAP50、mAP50-95、recall、precision 四个指标对比如下指标A 组原始B 组原始增强mAP500.780.84mAP50-950.510.58recall0.720.79precision0.810.83如果 B 组全面领先说明离线增强有效放心用全量数据训练如果 A 组和 B 组差别不大说明增强副本在增加训练时间的同时没有带来泛化提升如果 B 组验证指标反而下降说明增强过度或者增强分布偏离了真实拍摄分布。这个实验最多多花一次训练时间但它能直接决定你后续是继续收集数据还是把精力花在调参上。6.2 边际效应与关闭在线增强还有一个容易被忽视的点数据集已经做过多重增强训练时 YOLO 默认的在线增强还在叠加。A/B 实验做完如果发现 B 组胜出有限我通常会再跑一组 CB 组数据不变关闭 mosaichsv 扰动降到 0.1。很多时候 C 组会在 mAP50-95 上反超因为过度的颜色扰动会让皮肤病灶的红色纹理失真。最终你要交付的模型验证集必须只有原始图像最好来自不同的采集设备。这是医学图像部署的底线也是我对每个用这份数据集做实验的朋友最后都强调的点训练集的增强怎么做都没关系验证集必须干净。如果你真的照着这套流程走了一遍你会发现 11294 张图带来的提升很大一部分其实来自你前期的数据和目录规范处理而不是那一行训练命令。希望帮到你。本文还有配套的精品资源点击获取
返回列表