
简介本资源为面向YOLOv5目标检测入门与测试场景的专用数据集适合需要验证模型效果、开展图像分类实验的开发者与研究者使用。压缩包共501个文件包含200张JPG测试图片、100个XML标注文件及201个TXT说明文件整体约53.53MB便于快速下载并接入现有检测流程。图片覆盖人物、猫、狗三类目标XML保留原始标注信息TXT可用于记录类别与路径等辅助配置能够直接用于评估模型在常见物体检测任务上的表现。资源完整保留了原始信息方便读者在训练前后进行对比测试也可用于自定义实验或检验已训练模型的泛化能力。目前已有770人学习浏览适合刚接触YOLOv5的初学者快速获得一套干净的测试数据也适合进阶用户用作消融实验或结果验证的对照样本。1. 为什么“测试数据集”比训练集更容易让 YOLOv5 翻车很多人在 yolov5 里跑完训练看到验证集 mAP 不错就急着拿一张网图做 demo结果人和狗都框出来了唯独猫没框出来或者把椅子当成人。于是开始怀疑模型、怀疑权重、怀疑人生。其实问题多半出在“测试数据集”上你用训练集的分布去测模型本质上是开卷考试。真正合格的测试集要专门挑那些光线奇怪、目标很小、遮挡严重、类别易混的图才能在部署前暴露模型的真实水平。这篇笔记就围绕“yolov5 测试数据集”讲透一件事如何准备一份能反映真实场景的测试图片跑通人、猫、狗三类目标的检测流程并在翻车后知道该调什么参数。无论你是想验证别人训练好的权重还是给自己的数据集做验收都可以按这套路径直接落地。2. 测试前的环境准备conda、源码与“不像训练集”的测试图2.1 conda 环境配置与依赖安装我一般建议测试机和训练机分离。测试机不用装 CUDA 也能跑 CPU 推理但如果想测 FPS、想对比部署耗时还是要一个干净的 GPU 环境。第一步是建独立的 conda 环境避免和已有项目的 opencv、numpy 打架。conda create -n yolov5 python3.8 -y conda activate yolov5 cd yolov5 pip install -r requirements.txt这里有个实操细节python 版本不必追新3.8 在 yolov5 全流程里最稳。换 3.10 以上版本时torch 和 torchvision 的版本组合容易出兼容性问题报错往往发生在 import 阶段浪费不少时间。-n yolov5是环境名自己机器上随意但建议固定为 yolov5后续换机器跑脚本时环境名一致能少踩一个坑。requirements.txt会一次性装上 torch、opencv-python、pandas、pyyaml 等依赖。如果你在纯 CPU 机器上跑装完默认的 torch 会自动匹配 CPU 版不需要额外处理。装完之后先验证 GPU 是否可用python -c import torch; print(torch.cuda.is_available())。输出True就能继续False也不影响推理只是速度慢。2.2 下载预训练权重为什么先跑通再训自己的标题里的“测试数据集”还有一个隐含需求很多人手头没有训练好的自定义权重只是想让 YOLOv5 先能检测出人、猫和狗。这时候直接用官方预训练权重最合适。常见的做法是下载 yolov5s.pt文件体积小、推理快在一张 640x640 的图上 CPU 跑也就一两百毫秒量级。# 官方仓库的权重会被脚本按需下载 python detect.py --weights yolov5s.pt --source data/images第一次运行会自动拉取权重到 weights 目录不需要手动 wget。yolov5s 是轻量级版本适合先验证流程如果你的测试图里小目标特别多再换 yolov5m 或 yolov5l精度更高但耗时翻倍。yolov5s.pt只负责“能跑”不要指望它在刁钻测试图上满分。权重下载失败时先看网络代理和环境变量常见的是公司内网要求走代理pip 能通但 torch.hub 下载不通。2.3 测试图的挑选原则越“刁钻”越有价值这一步最容易被跳过但恰恰决定你后面会不会被测试结果骗。测试图不要从训练集里挑更不要直接用网上的经典测试图。原因是那些图基本都出现在预训练模型的训练阶段测出来 mAP 虚高部署到真实场景立刻现原形。我自己的习惯是拿手机去现场拍或者从监控片段里抽帧凑够 50 张以上再开工。挑选时注意四个维度光照至少包含背光、夜间、强曝光三种情况黑夜里的猫和白天完全是两种特征。尺度要有占画面 1/3 的大目标也要有只占 3% 的小目标小目标测试图最能拉开模型差距。遮挡人半身被桌子挡、猫藏在沙发后面这类图专门考验模型的召回能力。混淆狗和猫同框、人和穿毛绒外套的人同框这是分类器最容易被骗的场景。如果这些图上没有标注信息detect.py仍能跑出可视化结果但无法量化评估。因此建议每张测试图配套一个同名 txt 标注文件格式为类别id x_center y_center width height坐标全部归一化到 01。这个格式和训练集、验证集完全一致后面用val.py算 mAP 时才不会卡壳。3. 用 YOLOv5 跑通第一轮测试从命令到输出目录3.1 最小推理命令与必调参数测试数据集准备好之后第一次推理直接用官方detect.py命令如下python detect.py \ --weights yolov5s.pt \ --source data/test_images \ --conf-thres 0.25 \ --iou-thres 0.45 \ --img 640--source指定测试图片目录或单张图路径目录会自动遍历所有图片。--img 640是输入分辨率YOLOv5 默认把原图等比缩放到这个尺寸再推理。如果你的测试图普遍是 4K 截图建议直接调成 1280小目标召回率会有肉眼可见的提升代价是推理耗时翻 4 倍。--conf-thres是置信度阈值默认 0.25。第一次跑建议保持默认先看全量检出再决定要不要调高。--iou-thres是 NMS 的 IoU 阈值默认 0.45重叠框合并的松紧程度由它决定。这里的核心逻辑不是“跑通就行”而是理解--img对测试结果的直接影响。图像缩放时小目标会被压缩成几个像素甚至消失所以小目标多的测试集要把--img拉高这是第一轮测试就最值得盯的参数。3.2 输出目录里到底生成了什么跑完一次推理后结果默认落在runs/detect/exp下再来一次会生成exp2、exp3我经常在批量对比参数时故意不清理直接用后缀区分。runs/detect/exp/ ├── 001.jpg # 画了框的可视化图 ├── 001.txt # 每行: class_id x_center y_center w h └── crops/ # 每个检测框裁出来的小图初学者往往会忽略 labels 的 txt 文件只看画了框的图。但 txt 才是真正能程序化分析的东西比如统计总共检出多少目标、每个类别的平均置信度。我一般会写一个三行 Python 脚本扫一遍所有 txt看看哪张图检出目标数远低于预期那通常就是漏检最严重的地方。crops/目录在调试误检时特别管用。比如一张图里猫被框成了狗光看原图不一定看得出问题把 crop 图单独拉出来就能发现模型到底是把猫脸误判成狗脸还是把猫尾巴当成狗尾巴。这个细节在后面的避坑章节还会继续用到。3.3 第一轮测试的验收标准跑完第一轮不要只看“有没有框出来”要记录三个数字总检出目标数、每类目标数、平均置信度。连续跑十次左右你会对模型在测试集上的能力边界有直觉。如果一张图里人、猫、狗都在但只框出 2 个目标先不要急着调参数打开原图看看目标尺寸。距离镜头 10 米外的猫在 640x640 下可能只有 20x20 像素检测不出来是正常现象用--img 1280复测才能判断是模型问题还是分辨率问题。4. 只检测人、猫和狗类别过滤与后处理参数调优4.1 COCO 类别映射人0猫15狗16YOLOv5 预训练权重基于 COCO 数据集共 80 类。我们关心的三类对应的 id 是人person0猫cat15狗dog16。这个映射关系可以在源码的data/coco.yaml里查到也可以通过detect.py跑一张图后看输出 txt 的第一列数字确认。很多教程会告诉你直接改conf-thres来减少误检但更正确且推荐的做法是用--classes参数从源头过滤类别。这样模型仍然会对所有 80 类做前向推理但只有指定类别的检测框会进入后处理输出。效果是输出干净很多而且不会出现“把车当成狗”这种离谱误检。python detect.py \ --weights yolov5s.pt \ --source data/test_images \ --classes 0 15 16 \ --conf-thres 0.3 \ --iou-thres 0.5--classes 0 15 16的顺序无所谓YOLOv5 会按类别 id 排序。--conf-thres 0.3比默认 0.25 稍高适合人猫狗这类外形差异较大的目标能滤掉一部分杂物误检。--iou-thres 0.5比默认高一点两个高度重叠的同类框会更快合并成一个。4.2 调阈值时看什么指标调整conf-thres时我会同时盯两件事每张图的误报数和漏报数。阈值调高到 0.5漏报会明显增多特别是小尺寸的猫狗调低到 0.1漏报减少但误报爆炸画面上会出现十几个“人”框。一个实用做法是分类别调阈值。YOLOv5 的--classes只是过滤类别不支持每类单独设阈值因此我会在生成结果后用脚本按类别筛选。比如期望输出只有人猫狗但实际发现“人”的误检多、“猫”的漏检多就用 Python 读 txt 文件把置信度低于 0.4 的 person 框删掉保留所有 cat 框。这样比全局调阈值更精细。4.3 yolov5 后处理为什么 NMS 参数影响这么大YOLOv5 的后处理包含两个阶段置信度过滤和 NMS 非极大值抑制。--conf-thres负责第一阶段--iou-thres负责第二阶段。简单说模型会为每个物体生成多个候选框NMS 按 IoU 判断哪些框描述的是同一个物体保留得分最高的那个其余丢弃。猫狗这种轮廓接近的目标同一个物体会产生大量重叠框iou-thres0.45可能把它们合并成一个大框框住猫的同时也框住半条狗。我自己的经验是人猫狗场景下iou-thres调到 0.5 比较稳。如果发现一张图里两个目标被框成一个框就把iou-thres往下调让 NMS 更“苛刻”不轻易合并。4.4 批量跑测试集写一个可复用的 shell 脚本单张图调试没意义测试集的价值在于批量。我会写这样一个小脚本把整目录的测试图依次跑完同时用--project和--name控制输出位置方便对比多组参数。#!/bin/bash img_dirdata/test_images out_dirruns/detect/test_person_cat_dog for img in $img_dir/*.jpg; do echo Processing: $img python detect.py \ --weights yolov5s.pt \ --source $img \ --classes 0 15 16 \ --conf-thres 0.3 \ --iou-thres 0.5 \ --project $out_dir \ --name $(basename $img .jpg) done--project指定结果根目录--name指定当前图片的子目录这样每张图的输出互不覆盖。循环里加echo是为了跑长测试集时能定位到哪一张卡住、哪一张特别慢。shell 脚本跑完后用find $out_dir -name *.txt汇总所有标签文件再做统计分析比一张张翻图高效得多。5. 人猫狗检测的常见问题排查五条血泪经验5.1 猫和狗长得像模型框出双结果现象一张同时有猫和狗的图模型在猫身上框出了 cat 和 dog 两个高置信度框置信度都在 0.7 以上且 cat 框和 dog 框几乎完全重叠。原因预训练模型的分类特征在猫科和犬科之间不够分明的区域会“骑墙”。特别是猫的侧面轮廓和狗的侧面轮廓相似度很高后端的分类头同时输出了两个类别的概率。解决先看crops/里被框出来的小图确认是整体像还是局部像。如果只是局部像把iou-thres调低到 0.4让 NMS 更严格地合并重叠框如果整体像需要换更强的权重比如从 yolov5s 切换到 yolov5l或者在自定义数据集上微调用你自己的猫狗样本重新训分类头。5.2 置信度阈值调低后墙上的人影被当成“人”现象把--conf-thres从 0.25 调到 0.1 之后树影、墙上的污渍、路牌都被框成了 person误报率暴涨但漏检率确实下来了。原因YOLOv5 在低置信度下的输出本来就包含很多“弱特征”框这些框在高阈值下会被过滤掉。调低阈值本质是把召回率和精确率的博弈往召回方向倾斜。解决这类测试图的正确做法不是全局调低阈值而是保持 0.25 的全局阈值然后单独分析漏检的是哪些目标。如果漏检的是小尺寸人像优先调--img 1280而不是--conf-thres。如果确实需要低阈值建议在后续脚本里按类别过滤只保留确实可信的 person 框。5.3 小尺寸猫狗目标完全漏检现象画面里远处有一只猫人眼看得清楚但模型就是没框出来。把图片放大到 1280 分辨率后猫框出现了。原因YOLOv5 的输入分辨率固定为--img指定的值原图缩小后小目标在特征图上只剩几个像素经过多层下采样后特征基本丢失。这和遥感图像目标检测里的小目标问题是同一个逻辑模型对像素占比低于一定阈值的目标不敏感。解决把--img从 640 调到 1280这是最直接有效的手段。代价是显存占用和推理时间都变长一般显卡跑起来没问题CPU 单张会慢到两三秒。这样处理后如果猫还是漏检再看它是不是被树枝遮了一半如果遮挡太严重只能靠后续在自定义数据集里加入局部遮挡样本训练来解决。5.4 测试图里有多个同类目标时被合并成一个框现象一张图里两只狗离得很近模型只框出一个大框把两只狗都包进去了txt 里只有一行 dog。原因NMS 阶段两个框的 IoU 超过--iou-thres被判定为“同一个目标”然后合并。两只紧贴的狗形成的检测框 IoU 极高模型认为它们是一个嫌疑目标。解决把--iou-thres从 0.45 调到 0.3。这个值越低NMS 合并条件越苛刻紧贴的同类目标被分开的概率越大。要注意的是调太低会导致同一个目标被重复框出多个框所以 0.3 是一个折中点具体值根据测试集的拥挤程度微调。评测 mAP 时对多目标密集场景尤其要关注这个参数。5.5 用训练集图片当测试集评估结果虚高现象从训练集里抽了几十张图当测试数据集mAP 高达 0.95可到了现场拍的真实照片里人猫狗全乱套。原因模型“记住”了训练集中的背景、光线、角度和物体姿态评测时相当于开卷考试。预训练权重对这些图的得分天然偏高不能反映真实泛化能力。解决测试集的图片必须来自全新采集的数据最好是不同时间、不同设备、不同场景拍摄的。每张图先确认没有出现在训练集和验证集里。数据量可以不用很大50 张精心挑选的场景图比 500 张单一环境图更能说明问题。整理测试集时我习惯按场景建子目录比如street/、home/、night/每个子目录单独跑一轮看模型在哪种场景下先拉胯。6. 用测试集跑 mAP 评估从可视化到量化验收第一轮可视化确认模型能框出目标后就要用val.py量化测试数据集的效果。mAP 比肉眼可靠特别是你要在多个权重之间做对比时差 0.05 的精度只有在 mAP 数字上才能看出来。先给测试集建一个数据集配置文件# data/test_coco.yaml path: data/test_images train: images val: images nc: 3 names: [person, cat, dog]path指向测试集根目录train和val都写成images因为测试集只用于评估不参与训练。nc必须和names列表长度一致这里只评估三类。每个子目录下的图片必须有同名 txt 标注文件否则val.py会把没有标注的图片全部当作“漏检”。然后执行评估python val.py \ --weights yolov5s.pt \ --data data/test_coco.yaml \ --img 1280 \ --conf-thres 0.001 \ --iou-thres 0.6--conf-thres 0.001是评估时的常用技巧让所有可能的目标都参与计算 PR 曲线最后得到的 mAP 曲线更完整。--iou-thres 0.6是计算 mAP 时判断“预测框是否命中真实框”的 IoU 标准。0.6 偏严格适合人猫狗这类目标如果测试集里小目标特别多先看 0.5 下的 mAP 找上限。val.py运行结束后会生成PR_curve.png和confusion_matrix.png。PR 曲线的横轴是召回率纵轴是精确率。如果曲线右上角明显凹陷说明存在某个类别召回率低或误检高点开曲线能精确看到是哪一类拉低了整体 mAP。这个环节我习惯跑两次一次原图分辨率 640一次 1280对比 mAP 差多少幅能直接量化“分辨率提升带来的收益”。如果你打算把测试模型部署到树莓派 5 这类边缘设备上量化验收就更有必要。先在 PC 上用export.py把权重导出成 TorchScript 格式再到树莓派上用 Python 调用输入同样一组测试图片对比两边的 mAP 和单帧耗时。边缘设备上的推理结果往往会比 PC 上低几个百分点这是模型量化后的正常损失。我一般会在测试数据集上同时记录 GPU 和 CPU 两套 mAP交给后续部署时参考。我自己的习惯是把每次测试的命令、参数、mAP 结果写进一个 md 文件附上翻车最严重的三张图。下次调参或者换权重时先翻这份记录再动手能省掉大量重复试错。数据准备和参数调节本身没有银弹但用一套可复现的测试集持续迭代总能让模型在一个固定标准下越变越好希望帮到你。本文还有配套的精品资源点击获取