ARTICLE DETAIL

资讯详情

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

YOLOv5测试数据集实战:用COCO预训练权重检测人、猫、狗

YOLOv5测试数据集实战:用COCO预训练权重检测人、猫、狗 简介这是一份用于YOLOv5模型评估的测试数据集图像中主要包含人、猫、狗三类目标适合目标检测初学者验证训练效果也可用于测试自训练权重或做迁移学习实验。资源包共501个文件包括200张jpg原图、100个xml标注文件以及201个txt文件其中xml对应目标位置标注txt可用于存放类别清单或检测结果结构清晰且轻量易用。压缩包总大小53.53MB下载后即可快速解压运行。截至目前已有770人学习使用不少用户将其用于图像分类准确率验证和检测参数调试。资源保留了全部原始标注与目录信息既支持直接推理也便于二次标注和扩展是了解YOLOv5数据组织方式、评估模型泛化能力的实用测试集。1. 用测试数据集跑通 yolov5 检测人、猫、狗先别急着训练很多第一次接触 yolov5 的人会卡在一个看似简单的问题上代码拉下来了环境也装好了但拿什么数据去验证模型能不能用如果自己标注训练集没几天功夫下不来而且训练还要看显卡脸色。于是“yolov5 测试数据集-检测图像中的人、猫和狗”这个需求就冒出来了——它本质上不是让你从零训练而是让你用现成的测试图片和权重在 yolov5 框架里把推理流程完整跑一遍验证环境、验证模型、验证输出格式。这个需求最实在的价值在于人、猫、狗是 COCO 数据集里的常见类别yolov5 官方预训练权重本身就认识它们。也就是说你不需要自己标一张图只要下载官方权重和对应的测试图片就能看模型在照片里把人、猫、狗分别框出来。门槛低、见效快适合刚装好环境想确认“我这套能不能用”的人也适合做消融实验前先跑通 baseline 的熟手。整条链路就四步准备标签文件、下载测试图片、跑 detect.py 推理、用 val.py 算指标。下面每一章都会给出具体命令和参数照着敲就能出结果。2. 用 VOC 与 COCO 组织测试数据集目录结构与标签格式是第一步2.1 人、猫、狗三类标签在 COCO 中的类号要检测人、猫和狗先要搞清楚 yolov5 使用的 COCO 数据集里这三类目标的类号。COCO 数据集一共 80 个类别人的类号是 0猫是 15狗是 16。这个编号不是随便定的它来自 COCO 官方 labels.md 文件yolov5 的 data/coco128.yaml 里也写死了这 80 个类名。由于模型权重是在完整 COCO 上训练的推理时不管你想检测多少类模型都会输出全部 80 类的置信度。你要做的只是从结果中筛选出 0、15、16 这三个类号或者在 detect.py 的参数里通过 --classes 指定只显示这三类。这里有一个新手常踩的坑以为自己只检测三类就要写一个只有三类的 yaml 文件去加载权重——不是这样的预训练权重已经固定了输出维度改 yaml 只会影响训练阶段推理时真正起作用的是权重里记录的类名不是配置文件里的类名。2.2 测试图片的最小目录树images 与 labels 缺一不可如果你打算用 val.py 来算 mAP而不是只用 detect.py 跑几张图片看看效果那测试数据的目录结构就要按 yolov5 的约定来组织。yolov5 的数据集目录通常长这样test_dataset/ ├── images/ │ ├── test/ │ │ ├── person_01.jpg │ │ ├── cat_01.jpg │ │ └── dog_01.jpg └── labels/ └── test/ ├── person_01.txt ├── cat_01.txt └── dog_01.txt其中 images/test 存放图片labels/test 存放同名的 txt 标注文件。每个 txt 文件里的每一行代表一个目标格式是“class x_center y_center width height”五个值都是相对图片宽高的归一化坐标。比如一张 640x480 的图里有一只猫位于画面中心偏右猫框宽 200、高 150那标注行就是“15 0.59375 0.5625 0.3125 0.3125”——x_center 是 (320100)/640 0.65625不是 0.59375这里只是演示格式实际数值要按真实坐标算。yolov5 在验证时会自动读取同名 txt如果 labels 缺失对应图片会被视为无目标图片mAP 计算会失真。2.3 测试图片从哪里来COCO 验证集与自定义图片的取舍最常见的测试图片来源是 COCO val2017 验证集因为 yolov5 的官方权重就是在这个数据集上评估的拿它做测试能直接对比官方报告的指标。但 COCO 验证集有 5000 张图全部下载大概 780MB网络不好的时候会等得让人心慌。另一个做法是自己拍几张或从网上下载少量包含人、猫、狗的图片来试。我一般会用手机拍家里的猫和小区楼下的狗再叫同事站到镜头前拍两张这种方法最贴近真实使用场景。但要注意版权问题网上随便找的图最好不要用于发布或商业用途自用测试没问题。无论哪种来源把图片整理到 images/test 目录后都要检查一下图片后缀yolov5 默认支持 jpg、jpeg、png、bmp 等格式webp 不保证能读。import os from PIL import Image test_dir test_dataset/images/test valid_ext {.jpg, .jpeg, .png, .bmp} for f in os.listdir(test_dir): ext os.path.splitext(f)[1].lower() if ext not in valid_ext: print(f不支持的格式: {f}) continue img Image.open(os.path.join(test_dir, f)) print(f{f}: {img.size} {img.mode})这段脚本的作用是列出测试目录下所有图片的尺寸和色彩模式RGB 模式是 yolov5 的默认输入要求。如果你发现某张图是 RGBA 或 P 模式detect.py 在读取时一般会自动转换但 val.py 的某些版本可能会报错。参数上唯一要注意的就是 test_dir 路径改成你自己的目录即可。有了图片素材下一步就是准备对应的标签。如果是 COCO 官方图片可以直接下载 yolov5 仓库里提供的 coco128 标签作为最小样例确认格式正确后再扩展到自己的测试集——这一步做好后面跑 val.py 才能得到可信的指标数字。3. 获取官方预训练权重并拆解 label 映射运行推理前必须先搞懂这三件事3.1 下载 yolov5s.pt 与官方权重在推理时的角色推理阶段权重是唯一的“知识来源”。yolov5 官方提供 s、m、l、x 四个规模的预训练权重命名对应模型深度和宽度系数。对于只在测试集上验证人、猫、狗三类目标yolov5s.pt 是最稳妥的起点——文件约 14MB下载快推理速度快精度在 COCO 上能到 37.2% mAP0.5:0.95官方数据s 型号。如果追求更高精度可以换 yolov5m.pt但推理时间会翻倍左右。下载方式最简单的是直接用 detect.py 第一次运行时自动下载但更可控的做法是手动下载到 weights 目录mkdir -p weights wget -P weights/ https://github.com/ultralytics/yolov5/releases/download/v6.1/yolov5s.pt下载完成后可以用以下命令确认文件完整性ls -lh weights/yolov5s.pt python -c import torch; ckpt torch.load(weights/yolov5s.pt, map_locationcpu); print(ckpt[model].yaml)第一行查看文件大小正常应该在 14MB 左右第二行加载权重并打印模型结构配置。如果打印出来的是包含 nc: 80 的 yaml 结构说明权重的输出层是 80 类这就是为什么我们要在主配置里保留 80 类的上下文。打印模型结构有个额外好处如果文件损坏或下载不完整torch.load 会直接报错你可以立刻发现并重新下载避免推理出来一堆莫名其妙的结果。3.2 修改数据配置 yaml这一步决定你跑的是“测试”而不是“训练”如果要跑 val.py 评估你需要一个数据配置文件告诉 yolov5 测试图片在哪里、标签在哪里、类名是什么。以 test_dataset 目录为例在 data/ 下新建一个 my_test.yamlpath: ../test_dataset # 数据集根目录 train: images/test # 训练集路径验证时不起作用但必须存在 val: images/test # 验证集路径 test: images/test # 测试集路径 nc: 3 # 这行只影响自己训练时的输出类别数 names: 0: person 1: cat 2: dog参数说明path 是数据集根目录yolov5 会用这个基路径拼接 train/val 的相对路径train 字段即使你不训练也必须写上因为 val.py 的 dataloader 初始化会读取它names 列表的索引要和标签文件里的 class 编号一一对应。需要强调的是如果使用官方预训练权重模型实际输出的目标是 COCO 的 80 类这个 yaml 里的 nc: 3 只在重新训练时改变模型输出层推理阶段模型不会主动过滤出你指定的三类所以不要在验证时只凭这个 yaml 判断检测结果还要在命令行用 --classes 参数过滤。3.3 生成迷你标签集从 coco128 抽取三类样本的脚本当你要验证模型效果、手头又没有现成标注时最快的方式是从 coco128 数据集中抽取只包含人、猫、狗的图片和对应标签。coco128 是 yolov5 官方提供的最小验证集128 张图覆盖 COCO 全部 80 类。下面脚本会把包含人、猫、狗的图片筛选出来并过滤掉标签中不属于这三类的目标import os import shutil import glob src_img_dir coco128/images/train2017 src_lbl_dir coco128/labels/train2017 dst_img_dir test_dataset/images/test dst_lbl_dir test_dataset/labels/test os.makedirs(dst_img_dir, exist_okTrue) os.makedirs(dst_lbl_dir, exist_okTrue) target_classes {0, 15, 16} for label_path in glob.glob(os.path.join(src_lbl_dir, *.txt)): with open(label_path, r) as f: lines f.readlines() kept_lines [] for line in lines: cls_id int(line.strip().split()[0]) if cls_id in target_classes: kept_lines.append(f{list(target_classes).index(cls_id)} line.strip()[1:] \n) if kept_lines: img_name os.path.basename(label_path).replace(.txt, .jpg) src_img os.path.join(src_img_dir, img_name) if os.path.exists(src_img): shutil.copy(src_img, os.path.join(dst_img_dir, img_name)) with open(os.path.join(dst_lbl_dir, os.path.basename(label_path)), w) as f: f.writelines(kept_lines)逻辑说明脚本先读取 coco128 的标注目录逐行解析每个 txt 文件判断 class id 是否为 0人、15猫、16狗如果是就把原始行保留并转换成 0、1、2 的新编号同时把对应图片复制到测试目录。因为我们要用自己定义的 my_test.yaml 来验证标签编号必须重新映射到 0、1、2否则检测出来的人会被标成“0”没错但猫和狗会变成 1 和 2 而不是 15 和 16验证指标计算时会出现类别错位。4. 在测试集上跑通 detect.py 和 val.py最小推理命令与三大必调参数4.1 用 detct.py 输出可视化检测结果的最小命令拿到权重和图片后推理命令相当简洁。在 yolov5 项目根目录下运行python detect.py --weights weights/yolov5s.pt \ --source test_dataset/images/test \ --data data/my_test.yaml \ --classes 0 15 16 \ --conf-thres 0.25 \ --iou-thres 0.45 \ --save-txt \ --project runs/detect \ --name test_output参数说明--weights 指定权重文件路径--source 指向测试图片目录yolov5 会自动遍历目录下所有图像文件。--data 参数在这个场景下主要用于读取 names 列表来给类别名字--classes 0 15 16 表示只保留类号 0、15、16 的检测结果--conf-thres 是置信度阈值低于 0.25 的框会被丢弃--iou-thres 是 NMS 的 IoU 阈值用于抑制重叠框。--save-txt 会在输出目录中额外生成 YOLO 格式的 txt 结果文件方便后续做二次处理。运行结束后结果会保存在 runs/detect/test_output 下其中图片标注了检测框、类别名和置信度labels 子目录里是每张图对应的检测结果 txt。如果你看到猫咪被识别成 dog先别急着怀疑模型——大概率是 --classes 参数没有生效或者标签映射出了问题。4.2 用 val.py 计算测试集上的 Precision、Recall、mAP如果要量化评估测试集上的表现用 val.py 跑验证是最标准的做法。验证会输出 P精确率、R召回率、mAP0.5 和 mAP0.5:0.95 四项核心指标。命令长这样python val.py --weights weights/yolov5s.pt \ --data data/my_test.yaml \ --img 640 \ --conf-thres 0.001 \ --iou-thres 0.6 \ --task test \ --augmented参数说明--img 是输入尺寸yolov5 会将图片按比例缩放并填充到 640x640--conf-thres 在验证时通常设得很低0.001以便评估模型在全置信度区间上的表现--iou-thres 是 NMS 的 IoU 阈值0.6 是官方默认推荐值。--task test 告诉程序读取数据配置中的 test 字段--augmented 开启测试时增强TTA可以提升小目标检测效果但会增加推理时间。跑完之后终端会打印类似这样的结果Precision: 0.876, Recall: 0.812, mAP0.5: 0.843, mAP0.5:0.95: 0.821。这四个数字分别代表什么意义要搞清楚Precision 是所有预测框中被正确命中的比例Recall 是所有真实目标中被找到的比例mAP0.5 是 IoU 阈值为 0.5 时的平均精度适合快速评估mAP0.5:0.95 则跨多个 IoU 阈值取平均对定位精度更敏感。如果你的测试集是从 coco128 抽出来的mAP0.5 在 0.85 左右是正常水平低于 0.7 就说明有某个环节出了问题。4.3 三个必调参数conf-thres、iou-thres、img-size 的影响边界这三个参数直接影响输出质量和评估结果的数值表现。conf-thres 对 Precision/Recall 的影响是此消彼长的阈值调高留下来的框更少但更可靠Precision 上升Recall 下降阈值调低则相反。在 detect.py 里 0.25 是常用起点如果画面里目标密集且相互遮挡可以降到 0.15代价是出现更多误检如果结果里到处是错框就往 0.4 以上调。iou-thres 控制 NMS 合并框的激进程度。0.45 是默认推荐值适合人、猫、狗这类外形差异大的目标但如果同一只猫被框了两个重叠框多半是 iou-thres 设高了降到 0.3 能解决。img-size 决定了模型输入分辨率640 是速度和精度的平衡点。测试集里如果有很多小目标比如远距离的人把 --img 改成 1280 会显著提升召回率但内存和显存占用也会翻倍显卡不够时容易直接 OOM。5. 应用迁移与模型替换换用 YOLOv5s 之外的结构时如何保持测试集可用5.1 从测试集结果反推训练数据分布类别不平衡的三个信号当你用上文脚本从 coco128 抽取图片时大概率会得到“人很多、猫狗偏少”的结果。如果 val.py 跑出来 mAP0.5 不错但 mAP0.5:0.95 明显偏低先看测试集里各类别的数量比例。人、猫、狗在所有目标中占比不同模型对常见类别的置信度天然更高如果你的测试集只有几张猫图那 mAP 的波动会很大。要量化类别分布可以统计 labels 目录下每个类别的标注数量。最直接的做法是用脚本快速扫一遍awk {count[$1]} END {for (c in count) print c, count[c]} test_dataset/labels/test/*.txt | sort -n这行命令会统计出每个类别在测试集中的标注总数。如果发现猫和狗的总数不到人的十分之一训练出的模型在这两类上不显眼就需要补充测试图片或者按类别计算单独指标——用 per-class 的统计结果观察是否有个别类别拉低了整体成绩。常见做法是用 val.py 的--classwise标志在验证输出中单独显示每个类别的 AP。5.2 换用更大权重时标签映射和数据配置不用改的原因升级到 yolov5m.pt 或 yolov5l.pt 时你不需要修改 my_test.yaml也不需要重新映射标签。因为这几个规模的权重都在 COCO 上预训练类别顺序完全一致只是模型的宽度和深度不同。但建议在跑 val.py 前先确认输出层类别数避免权重下载错误变成其他数据集的模型。确认方法很简单python -c import torch; ckpt torch.load(weights/yolov5l.pt, map_locationcpu); print(ckpt[model].yaml) | grep nc如果输出 nc: 80说明这是 COCO 预训练权重可以直接用。换权重后唯一要留意的是推理速度变化yolov5m 比 s 大约慢 1.5 倍l 是 s 的 2 到 3 倍在 CPU 上跑 l 权重处理单张 640x640 图片可能需要 1 到 2 秒这在实时场景下是重大的决策因素。5.3 测试集上 mAP 高但实际效果差三个可能的偏差来源有一种常见场景val.py 指标很漂亮但拿真实照片一测漏检一堆。这不是模型玄学而是测试集与真实场景不一致。第一个来源是图像分辨率测试集图片多为几百 KB 到几 MB 的清晰照片而手机随手拍或监控截图的清晰度、光照条件差异很大模型没见过类似分布自然效果差。第二个来源是目标姿态coco128 里的猫狗大多是站立或趴着的常见姿态宠物在跑动、跳跃时外形变化极大尤其是猫拱背时模型容易漏检。第三个来源是遮挡和目标密度测试集大多为单目标或双目标场景真实环境中人挤人、猫躲在桌下只露半张脸这都需要重新调整训练策略而不是指望测试集评估。6. 避坑与排查测试集推理的 6 个经典异常症状与修复手法6.1 症状一推理结果全部为空终端没有任何框原因--conf-thres 设置过高或者模型没有从权重中正确加载类别信息。如果你直接把阈值调到 0.7 以上小型目标如远处的人往往只有 0.3~0.5 的置信度全被过滤掉了。另一种可能是 --classes 参数写错了类号比如写成--classes 0 1 2人还能检测出来但猫和狗会被过滤掉。解决先不带 --classes 跑一次看默认输出里是否有猫狗。有猫狗说明模型正常问题在参数没有则检查权重文件和图片路径。置信度阈值降到 0.1 再试一次。6.2 症状二输出图中标签名是“15”“16”而非“cat”“dog”原因--data 参数没有传或者 yaml 文件里 names 列表缺失。detect.py 在没有数据配置时会退回到 COCO 默认类别名而 COCO names 里 15 本来就是 cat16 是 dog理论上不会出现纯数字。解决如果你看到的是数字标签多半是用了--name自定义输出目录但没有匹配的 yaml。检查命令中有没有--data data/my_test.yaml如果文件在别的位置可以单独创建一个简化的 yaml 文件只保留 names 和 nc。6.3 症状三自己组织的测试集 mAP 比官方值低很多原因测试集类别分布不均衡是最主要原因。从 coco128 抽取的人、猫、狗比例约为 10:1:1模型对猫狗的 AP 通常会低于整体指标平均下来就拖了后腿。此外val.py 的 img-size 默认是 640如果原始图片是 4K 分辨率且目标偏小缩放后小目标信息大量丢失也会影响结果。解决增加测试集中猫狗的样本量或者用 --img 1280 重新验证。如果目的是和官方 COCO 指标对比直接用完整的 coco val2017 数据不要用自己的小测试集强行对比数值。6.4 症状四同一张图反复推理结果不一致原因没有设置随机种子。yolov5 的 NMS 在 GPU 上使用原子操作多批次推理时可能存在极细微的浮点差异但通常不会导致明显变化。真正导致结果差异的是开启了 --augmented 但每次随机增强参数不同或者显存不足导致分批处理时某些图被跳过。解决推理阶段关闭 TTA即不加 --augmented 参数只使用原始图像输入结果应当是确定性的。如果还是不同检查显存使用率用 nvidia-smi 观察推理时 GPU 内存是否接近满载必要时调低 batch-size。6.5 症状五检测框比实际目标大一圈或者框偏在角落原因这通常是标签标注精度问题模型在训练时见到的框就是不再精确的标注推理时自然会输出类似形状的预测框。但你在测试阶段遇到这种情况更可能是 --iou-thres 设置过低NMS 没有合并同一目标的多个重叠框导致输出一个较大的“合并框”。解决调高 iou-thres 到 0.5~0.6观察输出框是否分裂为多个小框命中目标如果还是大框检查预测结果 txt 里该目标的坐标范围用标注工具核对原始框是否准确。6.6 症状六GPU 显存充足但推理速度极慢原因大概率是 CPU 跑推理而不是 GPU。检测进程默认使用 CUDA 如果可用但权重文件路径写错或 torch 版本不匹配时代码会静默回退到 CPU。另外模型在验证模式下开启了 --augmented会让推理计算量增加好几倍。解决运行 detect.py 时观察启动日志里有没有device: cuda字样没有的话在命令中显式加--device 0。torch.cuda.is_available() 返回 False 的话先检查 torch 版本是否与 CUDA 匹配重装为 cu118 或 cu121 再试。7. 进阶验证技巧与最后一公里的调试习惯7.1 可视化中间层特征与检测框质量的自检方法当你调通基本流程后有一个技巧能帮你快速判断结果可靠性同时输出检测结果的 txt 文件和标注图然后随机抽取 1/10 的图片把检测框坐标和原图叠加起来人工核对。不要只看几张效果好的示例图抽样检查才能发现系统性的偏差。import cv2 import matplotlib.pyplot as plt img_path test_dataset/images/test/cat_01.jpg label_path runs/detect/test_output/labels/cat_01.txt img cv2.imread(img_path) img cv2.cvtColor(img, cv2.COLOR_BGR2RGB) h, w, _ img.shape with open(label_path, r) as f: lines f.readlines() for line in lines: parts line.strip().split() cls_id int(parts[0]) x_center float(parts[1]) * w y_center float(parts[2]) * h box_w float(parts[3]) * w box_h float(parts[4]) * h x1 int(x_center - box_w / 2) y1 int(y_center - box_h / 2) x2 int(x_center box_w / 2) y2 int(y_center box_h / 2) cv2.rectangle(img, (x1, y1), (x2, y2), (0, 255, 0), 2) plt.imshow(img) plt.axis(off) plt.show()这段代码读取 detect.py 输出的 YOLO 格式 txt将归一化坐标还原成像素坐标画框显示。参数无非是路径和类别 ID但注意第 7 行读取 label 文件时文件里每行是“class x_center y_center width height”这里的 x_center 和 y_center 是相对坐标必须分别乘上图片宽度和高度才能还原成像素。很多人直接把归一化结果当像素坐标画框结果框全挤在原点上。7.2 自定义测试集的五步验证清单每次换新测试集或者新权重我都会按同样顺序过一遍验证清单能提前拦截八成问题第一步确认标签文件与图片一一对应脚本检查是必要的用diff (ls images/test | sort) (ls labels/test | sort)看差异。第二步检查标签文件里是否有空文件或超出范围的坐标值一个坐标值大于 1 的标注会让损失计算变成 NaN训练和验证都会崩。第三步用上文 7.1 的代码抽样 10 张图人工核对框位置是否贴合目标。第四步跑一次 detect.py 确认输出结果与标注图一致这一步主要验证参数传递是否正确。第五步用 val.py --classwise 单独看人、猫、狗的 AP 数值这一步发现类别严重不平衡时及时调整数据集而不是盲目调参。7.3 从测试集推理结果反推训练调优方向测试集推理不只是评估最终模型它还能暴露数据分布的问题。如果你发现所有漏检的猫都是橘猫而测试集里的照片全是黄白色调的猫说明训练数据中橘猫样本太少如果你发现检测框对奔跑中的狗经常框不完整说明标注框对运动目标的扩展比例不足yolov5 的锚框设计偏向静止目标训练时可以通过调整 hyp.scratch-low.yaml 中的 anchor_t 参数来缓解。我个人的最后一个习惯是每次跑测试集推理都会顺手把 conf-thres 从 0.25 到 0.5 每隔 0.05 测一遍记录 Precision/Recall 的变化曲线。这不是多此一举而是用最短时间摸清模型的“脾气”——知道它在什么强度下开始误检什么强度下开始漏检。有了这条曲线部署到实际环境时定阈值就有了依据不用再靠感觉。这套测试流程不挑显卡、不挑数据集规模跑通了就证明你已经具备了最基本的 yolov5 使用能力剩下的事情都是在这条链路上做增量。希望帮到你。本文还有配套的精品资源点击获取
返回列表