70张手套图像YOLO小样本训练实战指南

发布时间:2026/9/28 15:34:53
70张手套图像YOLO小样本训练实战指南 简介本资源是一个专为YOLO系列目标检测算法设计的手套识别定制数据集面向计算机视觉初学者、模型训练实践者及工业质检场景开发者解决小样本手套目标检测模型的快速验证与微调需求。压缩包共211个文件包含70张带标注的JPG图像、70份YOLO格式txt与70份VOC格式xml标签文件以及1份适配YOLOv5/v7/v8/v9/v10/v11的data.yaml配置文件总大小仅3.96MB轻量易部署。已有104人学习下载体现了其在轻量级工业检测任务中的实用价值。用户可直接加载训练、验证与测试无需额外标注或格式转换双格式标签支持灵活适配不同框架yaml文件已预设类别名与路径目录结构清晰images/labels_yolo/labels_voc/大幅降低入门门槛特别适合教学演示、课程实验及边缘端手套佩戴检测原型开发。1. 70张手套图像YOLO标签小样本场景下怎么让检测模型不“认不出自家手套”你手头有一份名为yolo算法-手套定制数据集-70张图像带标签-手套.zip的压缩包——70张图、带YOLO格式.txt标签、目标明确是「手套」。这不是ImageNet级的百万图库也不是COCO那种多类别大杂烩而是一个典型的小样本、单类别、强业务导向的工业视觉起点。它解决不了“识别100种手部姿态”的学术问题但能立刻支撑产线手套佩戴合规性检查、仓储手套分拣定位、甚至AR试戴前的手部框选。很多人拿到这70张图第一反应是“太少了YOLO训不动”结果直接放弃也有人硬塞进YOLOv8默认配置训完mAP不到0.3怀疑人生。其实问题不在数据少而在没把这70张图的物理特性、标注质量、分布偏差和YOLO的先验结构对齐。本文就从这个zip包出发不加任何外部数据、不换模型主干、不调参玄学带你用纯本地环境Windows/Linux/macOS均可跑通从解压→校验→增强→训练→推理的全链路并重点拆解为什么70张图在YOLO里容易“集体失效”、哪些标签错误肉眼难见却致命、以及如何用3个关键增强策略把小样本的泛化力拉起来。适合正在做质检、安防、穿戴设备落地的一线算法/嵌入式工程师也适合想用真实小数据集理解YOLO底层约束的学生。2. 解压与结构校验先看清这70张图到底“长什么样”拿到手套.zip别急着扔进训练脚本。YOLO对数据路径、文件名、标签格式有硬性约定一步错后续所有loss曲线都是幻觉。我们先做三件事解压确认结构、批量校验图像可读性、检查标签是否符合YOLO规范归一化坐标类别ID。这是所有YOLO项目最常被跳过的“血泪前置步骤”。2.1 解压并建立标准YOLO目录结构常见错误是直接把zip解压到datasets/下得到gloves/文件夹里面混着images/和labels/但缺少train/val/test子目录。YOLOv5/v8默认要求按dataset/images/train/这种三级结构组织。我们手动构建清晰路径# 创建标准YOLO目录Linux/macOSWindows用户可用PowerShell或Git Bash mkdir -p gloves_yolo/{images,labels}/{train,val} # 解压原始zip假设当前目录下 unzip 手套.zip -d temp_gloves # 假设原始zip内结构为gloves/images/xxx.jpg gloves/labels/xxx.txt # 将全部内容复制到train目录小样本暂不分val后文说明原因 cp temp_gloves/gloves/images/*.jpg gloves_yolo/images/train/ cp temp_gloves/gloves/labels/*.txt gloves_yolo/labels/train/ # 清理临时目录 rm -rf temp_gloves提示为什么70张全放trainYOLOv8默认划分train:val8:270张分出来只有14张val极易因单张误标导致val mAP剧烈抖动失去评估意义。小样本阶段我们用k折交叉验证替代固定划分后文详述。2.2 批量校验图像与标签的完整性70张图看似不多但手工点开每张图看是否损坏、每个txt是否为空效率极低且易漏。写一个Python脚本一次性扫清# check_integrity.py import os from PIL import Image img_dir gloves_yolo/images/train label_dir gloves_yolo/labels/train img_files [f for f in os.listdir(img_dir) if f.lower().endswith((.jpg, .jpeg, .png))] label_files [f for f in os.listdir(label_dir) if f.endswith(.txt)] # 检查文件名匹配去掉扩展名后应完全一致 img_basenames set(os.path.splitext(f)[0] for f in img_files) label_basenames set(os.path.splitext(f)[0] for f in label_files) missing_labels img_basenames - label_basenames missing_images label_basenames - img_basenames print(f图像总数: {len(img_files)}, 标签总数: {len(label_files)}) print(f无对应标签的图像: {missing_labels}) print(f无对应图像的标签: {missing_images}) # 检查图像是否可读避免损坏的JPEG corrupted_imgs [] for img_name in img_files: try: img_path os.path.join(img_dir, img_name) with Image.open(img_path) as im: im.verify() # 验证文件完整性 except Exception as e: corrupted_imgs.append(img_name) print(f损坏图像: {img_name} - {e}) print(f损坏图像列表: {corrupted_imgs}) # 检查标签格式YOLO要求每行 class_id center_x center_y width height全部归一化到[0,1] invalid_labels [] for label_name in label_files: label_path os.path.join(label_dir, label_name) try: with open(label_path, r) as f: lines f.readlines() for i, line in enumerate(lines): parts line.strip().split() if len(parts) ! 5: invalid_labels.append(f{label_name}: 第{i1}行字段数≠5 ({len(parts)})) continue try: cls_id, cx, cy, w, h map(float, parts) if not (0 cls_id 100 and 0 cx 1 and 0 cy 1 and 0 w 1 and 0 h 1): invalid_labels.append(f{label_name}: 第{i1}行坐标越界 (cx{cx}, cy{cy}, w{w}, h{h})) except ValueError: invalid_labels.append(f{label_name}: 第{i1}行含非数字字符) except Exception as e: invalid_labels.append(f{label_name}: 读取失败 - {e}) print(f格式异常标签: {invalid_labels})运行后你会看到类似输出图像总数: 70, 标签总数: 70 无对应标签的图像: set() 无对应图像的标签: set() 损坏图像列表: [] 格式异常标签: [IMG_042.txt: 第1行坐标越界 (cx1.05, cy0.32, w0.4, h0.5)]参数说明cls_id必须是整数YOLO只支持整数类别ID此处手套为单类别应全为0若出现1.0或0.0需转为0。cx, cy, w, h越界如cx1.05通常因标注工具导出bug或图像尺寸计算错误必须修正否则YOLO训练时会静默忽略该框或报nan loss。此脚本不修复只报警——因为自动修复可能掩盖更深层的标注逻辑错误如镜像翻转未同步标签。2.3 可视化标签覆盖范围一眼识破“假阳性”标注YOLO标签是归一化坐标人眼无法直接判断是否合理。我们用OpenCV画出所有边界框观察空间分布# visualize_labels.py import cv2 import os import numpy as np img_dir gloves_yolo/images/train label_dir gloves_yolo/labels/train for img_name in os.listdir(img_dir)[:5]: # 先看前5张 if not img_name.lower().endswith((.jpg, .jpeg, .png)): continue img_path os.path.join(img_dir, img_name) label_path os.path.join(label_dir, os.path.splitext(img_name)[0] .txt) img cv2.imread(img_path) h, w img.shape[:2] if os.path.exists(label_path): with open(label_path, r) as f: for line in f: parts line.strip().split() if len(parts) 5: cls_id, cx, cy, w_norm, h_norm map(float, parts) # 转回像素坐标 x1 int((cx - w_norm/2) * w) y1 int((cy - h_norm/2) * h) x2 int((cx w_norm/2) * w) y2 int((cy h_norm/2) * h) cv2.rectangle(img, (x1, y1), (x2, y2), (0, 255, 0), 2) cv2.putText(img, fcls{int(cls_id)}, (x1, y1-10), cv2.FONT_HERSHEY_SIMPLEX, 0.6, (0, 255, 0), 2) cv2.imshow(Label Check, img) cv2.waitKey(0) cv2.destroyAllWindows()运行后逐张查看重点关注是否存在框远大于手套实际尺寸如框住整只手臂说明标注员误将“手部区域”当“手套”是否存在多个重叠小框可能因标注工具重复点击生成YOLO会当作多个目标但实际是同一手套是否存在框在图像外x10或x2w虽经归一化检查但可视化能发现裁剪导致的坐标偏移。这些“假阳性”框不会报错但会严重污染loss让模型学习到错误的空间先验。3. 数据增强策略70张图如何榨出300有效样本小样本训练最大的敌人不是数据少而是数据多样性不足导致模型过拟合纹理/背景/光照等无关特征。YOLO内置的albumentations增强很强大但对70张图直接开满参数反而会生成大量无效甚至负样本比如过度模糊后手套不可见。我们必须做定向增强只增强那些在真实产线中必然变化的维度——光照、遮挡、尺度。3.1 光照鲁棒性增强模拟产线不同打光条件手套在流水线上可能处于顶光、侧光、背光环境。单纯用RandomBrightnessContrast容易过曝或死黑。我们采用分区域Gamma校正保留手套边缘细节# augment_lighting.py import cv2 import numpy as np import random def adjust_gamma(image, gamma1.0): Gamma校正gamma1提亮阴影gamma1压暗高光 invGamma 1.0 / gamma table np.array([((i / 255.0) ** invGamma) * 255 for i in np.arange(0, 256)]).astype(uint8) return cv2.LUT(image, table) def lighting_augment(img_path, label_path, output_img, output_label): img cv2.imread(img_path) # 随机选择一种光照模式 mode random.choice([top_light, side_light, back_light, normal]) if mode top_light: # 顶部变亮底部渐暗 h, w img.shape[:2] mask np.zeros((h, w), dtypenp.float32) for y in range(h): mask[y] 1.0 - y / h * 0.5 # 顶部1.0底部0.5 img cv2.convertScaleAbs(img, alphamask, beta0) img adjust_gamma(img, gamma0.8) elif mode side_light: # 左侧亮右侧暗 mask np.zeros((h, w), dtypenp.float32) for x in range(w): mask[:, x] x / w * 0.5 0.5 img cv2.convertScaleAbs(img, alphamask, beta0) img adjust_gamma(img, gamma0.9) elif mode back_light: # 整体提亮但降低对比度模拟逆光 img cv2.convertScaleAbs(img, alpha1.2, beta-30) img adjust_gamma(img, gamma1.2) cv2.imwrite(output_img, img) # 标签文件直接复制光照不影响坐标 with open(label_path, r) as f_in, open(output_label, w) as f_out: f_out.write(f_in.read()) # 批量处理为每张原图生成2个光照变体 for i, img_name in enumerate(os.listdir(gloves_yolo/images/train)): if not img_name.lower().endswith((.jpg, .jpeg, .png)): continue base os.path.splitext(img_name)[0] src_img fgloves_yolo/images/train/{img_name} src_label fgloves_yolo/labels/train/{base}.txt # 生成两个变体 for j in range(2): new_name f{base}_light{j1}.jpg new_label f{base}_light{j1}.txt lighting_augment(src_img, src_label, fgloves_yolo/images/train/{new_name}, fgloves_yolo/labels/train/{new_label})为什么不用随机亮度产线光照变化是有规律的如顶光灯管老化导致中心亮边缘暗随机亮度会生成现实中不存在的“斑马纹”光照让模型学到虚假关联。分区域Gamma更贴近物理现实。3.2 遮挡增强模拟手套被手指/工具部分遮挡真实场景中手套常被手指弯曲、工具手柄、传送带边缘遮挡。我们用随机矩形遮挡CutOut但限制位置和大小确保只遮挡手套非关键区域避开指尖和腕口# augment_occlusion.py def occlusion_augment(img_path, label_path, output_img, output_label): img cv2.imread(img_path) h, w img.shape[:2] # 读取原始标签获取手套中心区域避开边缘 boxes [] with open(label_path, r) as f: for line in f: parts line.strip().split() if len(parts) 5: _, cx, cy, bw, bh map(float, parts) # 转为像素坐标 x1 int((cx - bw/2) * w) y1 int((cy - bh/2) * h) x2 int((cx bw/2) * w) y2 int((cy bh/2) * h) boxes.append((x1, y1, x2, y2)) if not boxes: # 无框则跳过 cv2.imwrite(output_img, img) with open(label_path, r) as f_in, open(output_label, w) as f_out: f_out.write(f_in.read()) return # 在手套框内随机选一个遮挡区域避开指尖y1上1/3腕口y2下1/4 for (x1, y1, x2, y2) in boxes: # 限定遮挡区域x方向居中1/2y方向避开上下1/4 roi_x1 max(x1 (x2-x1)//4, 0) roi_x2 min(x2 - (x2-x1)//4, w) roi_y1 max(y1 (y2-y1)//3, 0) # 避开指尖 roi_y2 min(y2 - (y2-y1)//4, h) # 避开腕口 if roi_x2 roi_x1 and roi_y2 roi_y1: # 随机生成遮挡矩形占ROI面积10%~30% occl_w random.randint(int((roi_x2-roi_x1)*0.1), int((roi_x2-roi_x1)*0.3)) occl_h random.randint(int((roi_y2-roi_y1)*0.1), int((roi_y2-roi_y1)*0.3)) occl_x random.randint(roi_x1, roi_x2 - occl_w) occl_y random.randint(roi_y1, roi_y2 - occl_h) # 用均值颜色填充比纯黑更自然 roi_mean cv2.mean(img[occl_y:occl_yoccl_h, occl_x:occl_xoccl_w])[:3] img[occl_y:occl_yoccl_h, occl_x:occl_xoccl_w] roi_mean cv2.imwrite(output_img, img) # 标签不变 with open(label_path, r) as f_in, open(output_label, w) as f_out: f_out.write(f_in.read())关键参数逻辑roi_x1/roi_x2限制遮挡在手套水平中心避免遮住边缘导致模型误判边界roi_y1从y1 1/3高度开始确保不遮指尖指尖是关键判别区域roi_y2到y2 - 1/4高度结束避开腕口腕口常有袖口干扰遮挡大小控制在ROI的10%~30%过大会破坏目标完整性过小则无增强效果。3.3 尺度与角度增强应对不同拍摄距离和手部姿态YOLO对尺度敏感70张图若全是固定焦距拍摄模型会丧失对远/近手套的泛化力。我们用仿射变换模拟轻微缩放旋转但严格限制角度±5°以内避免生成扭曲失真样本# augment_scale_rot.py def scale_rot_augment(img_path, label_path, output_img, output_label): img cv2.imread(img_path) h, w img.shape[:2] # 随机缩放0.9~1.1倍旋转-5~5度 scale random.uniform(0.9, 1.1) angle random.uniform(-5, 5) # 计算旋转矩阵以图像中心为原点 center (w // 2, h // 2) M cv2.getRotationMatrix2D(center, angle, scale) # 应用仿射变换 img_aug cv2.warpAffine(img, M, (w, h), flagscv2.INTER_LINEAR, borderModecv2.BORDER_REFLECT) # 同时变换标签坐标需反向计算 boxes_aug [] with open(label_path, r) as f: for line in f: parts line.strip().split() if len(parts) 5: cls_id, cx, cy, bw, bh map(float, parts) # 转为绝对坐标 x1_abs (cx - bw/2) * w y1_abs (cy - bh/2) * h x2_abs (cx bw/2) * w y2_abs (cy bh/2) * h # 四个角点 pts np.array([ [x1_abs, y1_abs], [x2_abs, y1_abs], [x2_abs, y2_abs], [x1_abs, y2_abs] ], dtypenp.float32) # 应用逆变换因为M是图像变换标签需用M的逆 M_inv cv2.invertAffineTransform(M) pts_aug cv2.transform(np.array([pts]), M_inv)[0] # 计算新框 x1n, y1n pts_aug[:, 0].min(), pts_aug[:, 1].min() x2n, y2n pts_aug[:, 0].max(), pts_aug[:, 1].max() # 归一化回[0,1] cxn (x1n x2n) / 2 / w cyn (y1n y2n) / 2 / h w_n (x2n - x1n) / w h_n (y2n - y1n) / h # 边界检查 if 0 cxn 1 and 0 cyn 1 and 0 w_n 1 and 0 h_n 1: boxes_aug.append(f{int(cls_id)} {cxn:.6f} {cyn:.6f} {w_n:.6f} {h_n:.6f}) cv2.imwrite(output_img, img_aug) # 写入新标签 with open(output_label, w) as f_out: f_out.write(\n.join(boxes_aug) \n) # 批量生成每张原图生成1个尺度旋转变体 for img_name in os.listdir(gloves_yolo/images/train): if not img_name.lower().endswith((.jpg, .jpeg, .png)): continue base os.path.splitext(img_name)[0] if _light in base or _occl in base: # 跳过已增强的 continue src_img fgloves_yolo/images/train/{img_name} src_label fgloves_yolo/labels/train/{base}.txt scale_rot_augment(src_img, src_label, fgloves_yolo/images/train/{base}_scale.jpg, fgloves_yolo/labels/train/{base}_scale.txt)为什么角度限制在±5°手部自然姿态变化中手腕旋转超过5°时手套纹理会发生显著形变如褶皱方向改变此时仅靠仿射变换无法真实模拟强行增大角度会导致标签框严重偏离实际目标产生噪声。±5°是保真度与多样性平衡点。4. YOLOv8训练配置小样本专用超参与损失函数调整YOLOv8默认配置为COCO大数据集设计直接用于70张图会遭遇三大问题学习率过大导致early loss震荡、置信度阈值过高漏检小目标、分类损失权重压制定位损失。我们必须做针对性调整。4.1 修改训练配置文件gloves.yamlYOLOv8要求一个.yaml文件定义数据路径和类别。创建gloves.yaml# gloves.yaml train: gloves_yolo/images/train val: gloves_yolo/images/train # 小样本暂不设val用k折验证 nc: 1 # 类别数 names: [glove] # 类别名注意val仍指向train目录是因为我们后续用k折交叉验证而非YOLO内置划分。若此处填错路径yolo train会报No images found。4.2 关键超参调整学习率、批次、预热策略在命令行中传入以下参数不修改源码用CLI覆盖yolo detect train \ datagloves.yaml \ modelyolov8n.pt \ # 用nano版小样本够用且快 epochs300 \ batch8 \ # 70张图batch8 → 每epoch约9步避免梯度更新过频 imgsz640 \ namegloves_v8n_300e \ lr00.001 \ # 初始学习率降为默认0.01的1/10 lrf0.01 \ # 终止学习率lr0*lrf1e-5防止后期过拟合 warmup_epochs5 \ # 前5个epoch线性warmup稳定起步 box7.5 \ # 定位损失权重默认7.5小样本保持 cls0.5 \ # 分类损失权重默认0.5小样本保持 dfl1.5 \ # DFL损失权重默认1.5小样本保持 hsv_h0.015 \ # 色调增强上限降为默认0.015原0.015 hsv_s0.7 \ # 饱和度增强降为0.7原1.0 hsv_v0.4 \ # 明度增强降为0.4原1.0 degrees0.0 \ # 禁用随机旋转我们已做定向旋转增强 translate0.1 \ # 平移增强保留模拟手部微移 scale0.5 \ # 缩放增强保留配合我们的尺度增强 fliplr0.5 \ # 水平翻转手套左右对称安全 mosaic0.0 \ # 关闭mosaic小样本下mosaic会拼接出不合理手套组合 mixup0.0 \ # 关闭mixup同理 copy_paste0.0 # 关闭copy-paste参数深意解析batch870张图batch8→ 每epoch约9次梯度更新。若用batch16则每epoch仅4步更新太稀疏loss波动大batch4则更新过频易陷入局部最优。lr00.001小样本数据少梯度噪声大大学习率易震荡。实测0.001比0.01收敛更稳最终mAP高5%。mosaic0.0YOLOv8默认开启mosaic四图拼接但70张图拼出的“手套手套手套手套”场景在现实中不存在模型会学到虚假的密集排列先验导致单图检测时漏检。hsv_*三参数下调原始增强过强会使手套颜色失真如白色手套变灰削弱颜色作为判别特征的作用。4.3 自定义损失函数聚焦小目标定位精度YOLOv8的DetectionLoss默认对所有尺度特征图同等加权。但手套在640x640图中常为中等目标100x100像素主要由P3层80x80负责。我们通过修改ultralytics/utils/loss.py中的__call__方法提升P3层损失权重# 修改 ultralytics/utils/loss.py 中 DetectionLoss.__call__ # 在 def __call__(self, preds, batch) 函数内找到循环 # for i, pred in enumerate(preds): # ... # 在循环内添加 if i 0: # P3层索引为0YOLOv8顺序P3,P4,P5 loss_box * 1.5 # P3定位损失加权1.5倍 loss_cls * 1.2 # P3分类损失加权1.2倍为什么只加权P3查看yolov8n.yaml结构P3输出80x80特征图对应stride8最适合检测100px目标80x8640。P440x40,stride16适合200px目标P520x20,stride32适合400px目标。70张图中手套尺寸集中在80-150pxP3是主力层。加权后模型更专注优化这个尺度的定位精度。5. 避坑指南70张手套数据集训练中5个致命陷阱小样本YOLO训练不是“参数调调就行”很多坑藏在数据和流程深处现象隐蔽但后果严重。以下是我在3个手套项目中踩过的5个真实陷阱附带现象、根因和可执行解决方案。5.1 现象训练loss下降很快但验证时mAP始终为0原因标签文件中class_id写成了1.0或0.0浮点数而YOLO要求整数。YOLOv8在读取时会静默转换为int(1.0)1但你的数据集只有1个类别ID应为0。模型学到的是“类别1”而推理时默认预测cls0导致所有框被过滤。解决运行check_integrity.py中的cls_id检查段批量修正sed -i s/^1\.0 /0 /g gloves_yolo/labels/train/*.txt # Linux/macOS # Windows PowerShell: Get-ChildItem gloves_yolo\labels\train\*.txt | ForEach-Object { (Get-Content $_.FullName) -replace ^1\.0 , 0 | Set-Content $_.FullName }5.2 现象训练中box_loss突然飙升至nan几轮后崩溃原因某张图的标签中w或h为0如0 0.5 0.5 0 0.3YOLO计算GIoU时除零。归一化检查脚本可能漏掉w0因0w1成立。解决在check_integrity.py的标签检查循环中增加if w 1e-6 or h 1e-6: invalid_labels.append(f{label_name}: 第{i1}行宽高为0 (w{w}, h{h}))然后手动删除或修正对应标签行。5.3 现象模型对正面手套检测准但侧面/背面手套漏检率高原因原始70张图中正面样本占90%以上增强时未针对性生成侧面视角。YOLO的旋转增强degrees是随机的无法保证覆盖关键姿态。解决不用CLI的degrees改用基于关键点的合成增强。用OpenPose或MediaPipe提取手部21个关键点对原图做-30°,30°旋转非仿射用关键点驱动再渲染手套纹理。此法需额外工具但对姿态泛化提升显著。简易替代用imgaug库的Rotate指定角度列表from imgaug import augmenters as iaa seq iaa.Sequential([iaa.Rotate(rotate[-30, 0, 30])])5.4 现象训练完成但用yolo predict推理时CPU占用100%GPU显存只用200MB原因模型保存为*.pt格式但推理时未指定devicecpuYOLOv8默认尝试用CUDA找不到GPU时卡在初始化。解决强制指定设备yolo predict modelgloves_v8n_300e/weights/best.pt sourcetest_img.jpg devicecpu或代码中model YOLO(gloves_v8n_300e/weights/best.pt) results model.predict(test_img.jpg, devicecpu) # 显式指定5.5 现象k折交叉验证时各fold的mAP差异极大0.2~0.6原因70张图中存在隐式分布偏差。例如前35张是A产线白手套金属背景后35张是B产线蓝手套木纹背景。k折随机划分会把A/B混合导致fold1全是AmAP高fold2全是BmAP低。解决按来源分组k折。先人工将70张图按产线/光照/手套型号分组每组内再随机k折。用sklearn.model_selection.StratifiedKFold时groups参数传入分组标签from sklearn.model_selection import GroupKFold gkf GroupKFold(n_splits5) for train_idx, val_idx in gkf.split(X, y, groupsgroup_labels): # train_idx, val_idx 即分组后的索引6. k折交叉验证与工业部署技巧让70张图的结果可信、可用、可解释小样本项目最怕“一次训练定终身”。70张图训出的模型其mAP到底是真强还是运气好我们不用val目录的单次评估而用5折交叉验证5-Fold CV并在此基础上做两件事一是生成可解释的检测报告二是导出轻量模型适配边缘设备。这才是工业落地的闭环。6.1 实现5折交叉验证代码级完整实现YOLOv8不原生支持k折但我们可以通过重写数据集路径实现。核心思路每次训练前动态生成gloves_fold{k}.yaml指向当前fold的train/val目录。# kfold_train.py import os import shutil import yaml from sklearn.model_selection import KFold import subprocess # 1. 获取所有图像文件名不含扩展名 img_dir gloves_yolo/images/train all_basenames [os.path.splitext(f)[0] for f in os.listdir(img_dir) if f.lower().endswith( p a hrefhttps://download.csdn.net/download/weixin_51154380/90033122 stylecolor:#ec7500;font-size:14px; 本文还有配套的精品资源点击获取 /a img altmenu-r.4af5f7ec.gif srchttps://csdnimg.cn/release/wenkucmsfe/public/img/menu-r.4af5f7ec.gif stylewidth:16px;margin-left:4px;vertical-align:text-bottom;cursor:text; /p