简介:本资源为面向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 python=3.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,坐标全部归一化到 0~1。这个格式和训练集、验证集完全一致,后面用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,狗=16
YOLOv5 预训练权重基于 COCO 数据集,共 80 类。我们关心的三类对应的 id 是:人person=0,猫cat=15,狗dog=16。这个映射关系可以在源码的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-thres=0.45可能把它们合并成一个大框,框住猫的同时也框住半条狗。我自己的经验是人猫狗场景下iou-thres调到 0.5 比较稳。如果发现一张图里两个目标被框成一个框,就把iou-thres往下调,让 NMS 更“苛刻”,不轻易合并。
4.4 批量跑测试集:写一个可复用的 shell 脚本
单张图调试没意义,测试集的价值在于批量。我会写这样一个小脚本,把整目录的测试图依次跑完,同时用--project和--name控制输出位置,方便对比多组参数。
#!/bin/bash img_dir=data/test_images out_dir=runs/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 文件,附上翻车最严重的三张图。下次调参或者换权重时,先翻这份记录再动手,能省掉大量重复试错。数据准备和参数调节本身没有银弹,但用一套可复现的测试集持续迭代,总能让模型在一个固定标准下越变越好,希望帮到你。
本文还有配套的精品资源,点击获取