简介:YOLOv5测试数据集,专门用于检测图像中的人、猫和狗,面向目标检测初学者、算法调参人员以及需要快速验证模型效果的开发者。资源共501个文件,压缩包大小约53.53MB,包含200张JPG测试图片、201个TXT标注文件以及100个XML标注文件;其中TXT标注文件对应YOLO格式的边界框与类别信息,XML标注文件可用于VOC格式的训练或评估,数据完整保留原始信息,便于对照不同框架下的检测结果。借助这套数据,读者可以测试自己训练的模型,观察其对行人、猫和狗三类目标的识别表现,也可配合训练集开展图像分类与定位实验,熟悉标注格式转换、置信度阈值调整和mAP评估等常见流程。目前已有770人学习下载,适合个人实验、课程作业或模型性能验证等场景,省去自行搜集整理图片的时间,快速检验模型效果。
1. 用YOLOv5测试数据集先做模型验收:比训练指标更可信的一步
模型训练完,损失曲线好看、mAP刷得漂亮,但拿一张没见过的图丢进去,检测框偏偏把人身后那只猫漏了。这种“训练还行、一测原形毕露”的情况,几乎每个做过目标检测的人都遇到过。YOLOv5测试数据集就是拿来干这件事的:它专门用于检测图像中的人、猫和狗三类目标,图片已经保留了原始信息,直接丢给模型或检测脚本就能出结果,不用二次标注、不用清洗。适合三类人:刚把YOLOv5跑通、想验证模型真实水平的新手;训练完自己的数据集、需要一个独立测试集交叉验证的从业者;以及做对比实验时缺一份固定评测数据的开发者。下面我按实际使用顺序,把这个测试集从冒烟测试到回归基线讲透。
2. 拿到测试集先做冒烟测试:detect.py推理与参数解读
2.1 从零跑通第一轮检测:命令与目录准备
不管你是下载了YOLOv5源码,还是用了带weights的完整项目,第一件事都是把测试图片放到一个固定目录,然后调用detect.py推理。常见做法是建一个test_images文件夹,把jpg文件都丢进去,然后执行:
python detect.py --source ./test_images --weights yolov5s.pt --conf-thres 0.5 --iou-thres 0.45 --project ./runs/detect --name test1 --save-txt --save-conf这条命令的逻辑拆开看:--source指定输入来源,可以是单张图片、图片目录、视频或摄像头,目录是最稳的;--weights选用官方COCO预训练的yolov5s.pt,因为人、猫、狗都属于COCO的80类里面,直接就能识别;--conf-thres和--iou-thres控制检测框的置信度门槛和NMS的IoU门槛,第一次跑先用默认值,后面要调再动;--project和--name决定了输出结果保存位置,放进runs/detect/test1,方便跟后续实验对比;--save-txt把检测信息单独存成文本,--save-conf把每个框的置信度一起写进去。
第一次跑完,打开runs/detect/test1目录,里面会有一张张标注好框的jpg,以及同名的txt文件。txt每行是一组数据,格式是“类别id x_center y_center width height 置信度”,比如“0 0.45 0.62 0.18 0.30 0.87”,代表以图片宽高为基准归一化后的中心点、框宽高和置信度。这一步能过,说明环境没问题、权重没损坏、测试图片能被正常读取。
2.2 参数改了到底影响什么:conf_thres、iou_thres和imgsz的取舍
很多新手卡在同一个地方:同样的图,为什么别人跑出来框很多,自己跑出来干干净净几个框?大概率是conf_thres设太高。比如你设0.8,模型对那只被遮挡了一半的猫置信度只有0.6,它就直接不画框。我一般建议第一轮用0.25,把所有可能的目标都放出来看一遍,心里有个底,再逐步往上提到0.5或0.7。
imgsz这个参数很多人忽略,但它对结果影响不小。YOLOv5默认推理尺寸是640,但原图如果本身就是1280的大图,直接把小目标缩没了,猫和狗这类边缘清晰的目标还好,人在远处可能只剩二三十个像素,检测框会飘。所以如果测试图普遍偏大,建议:
python detect.py --source ./test_images --weights yolov5s.pt --imgsz 1280 --conf-thres 0.4 --iou-thres 0.5注意,--imgsz增大到1280意味着推理时间明显变长,CPU上可能从几十毫秒变成几百毫秒。但作为测试集验收,准确率优先,时间慢一点没关系。iou_thres控制两个重叠框合并的阈值:0.5表示重叠50%以上的框会被合并成一个,值越小越容易合并,越不容易出现一个目标被框两次的情况,但也可能把挨得很近的人猫合并成一个框。一般不动它,只有遇到重复框才下调到0.3。
2.3 输出文件的保存位置与可视化确认
detect.py跑完,很多人直接在终端里看个大概就走了,这不行。我一般会做两步确认:第一步,打开输出图片,肉眼检查每个框和类别的对应关系,重点看有没有“人框里套着猫框”“把狗标成人”这类错乱;第二步,打开txt文件,核对坐标值是否都在0~1之间,如果某个框的width超过1,说明标注导出有问题,但测试集是原图直出,一般不会出现,一旦出现就要怀疑图片本身有没有EXIF旋转信息导致宽高读错。
如果检测结果明显不对,比如整张图一个框都没有,先看置信度阈值,再检查图片路径是否读到了空目录。常见做法是把输出目录同时打开两张图对比,一张是原图,一张是标注后的,迅速定位问题出在模型推断还是参数筛选。
3. 用测试集替代验证集:评估人与宠物的检测效果
3.1 数据集目录组织:images与labels的对应关系
光看不练不行。如果你想拿这套测试集做量化评估,而不是只看几张图的感性结果,就得把它组织成YOLOv5 val.py能直接读取的结构。YOLOv5的验证流程依赖严格的目录对应关系:images目录放图片,labels目录放同名txt标注文件,且两个目录在各自层级下必须完全平行。常见组织方式如下:
dataset/ ├── images/ │ ├── test5.jpg │ ├── test12.jpg │ ├── test93.jpg │ └── ... └── labels/ ├── test5.txt ├── test12.txt ├── test93.txt └── ...注意,labels里的txt文件名必须跟images里的jpg完全同名,后缀可以不同,但前缀必须一字不差。图片是test5.jpg,标注就必须是test5.txt,多一个空格都不行。这是YOLO系列的老规矩,val.py和train.py都会按这个规则去找标注。
有人可能会问:我的测试集只有图片,哪来的labels?这个要看你的资源版本。如果下载的包里有labels目录,直接用;如果只有图片,那就需要先用自己的模型或标注工具生成预测结果来当“伪标注”做评估对比,或者干脆先跑一轮detect.py拿到txt输出,再组织成labels目录结构。
3.2 写一个data.yaml并跑通val.py
组织好目录后,还需要一个data.yaml把路径和类别告诉YOLOv5。注意,YOLOv5要求类别必须从0开始连续编号,不能跳号:
# data.yaml train: ./dataset/images val: ./dataset/images nc: 3 names: ['person', 'cat', 'dog']train和val这里可以填同一个路径,因为这套数据集本来就是给你做测试的,不参与训练。nc是类别数量,固定为3;names的顺序必须跟标注文件里的类别id对应:标注里id=0就是person,id=1就是cat,id=2就是dog。跑验证命令:
python val.py --data data.yaml --weights yolov5s.pt --img 640 --conf-thres 0.001 --iou-thres 0.6这里conf-thres设成0.001是有意为之的:val.py的mAP计算会在所有置信度档位上做积分,如果一开始就把置信度砍到0.5,低置信度的正确检测会被误判为漏检,mAP偏低。iou-thres设0.6是评估时框匹配的严格度,0.5更宽松,0.7更严格,0.6是个中间值,很多库默认用它。
3.3 看懂metrics输出:mAP、precision、recall的判定标准
val.py跑完,终端会打印一张metrics表格,里面最值得关注的是三类指标:
| 指标 | 含义 | 参考区间 |
|---|---|---|
| Precision | 所有预测框中真正正确的比例 | 0.7~0.95 算正常 |
| Recall | 所有真实目标中被找出来的比例 | 0.6~0.9 视难度而定 |
| mAP@0.5 | IoU阈值0.5下的平均精度 | 0.7以上可用 |
| mAP@0.5:0.95 | 多IoU阈值下的平均精度 | COCO标准,0.5以上已不错 |
还有一个容易忽略的细节:表格里会按类别分别列出AP,也就是person、cat、dog各自的数值。如果person的AP是0.82,cat是0.6,dog是0.9,说明模型对猫的检测明显偏弱。这时候你回头翻测试图片,会发现猫多为小目标且颜色与背景接近,这是数据层面的问题,不是模型参数问题。拿这套测试集的价值就在这里:它不是告诉你“模型好不好”,而是告诉你“模型在哪个类别上翻车了”。
4. 把它并进自己的训练管线:从pretrained权重到迁移学习
4.1 为什么拿COCO权重直接测就有结果
前面提到yolov5s.pt是COCO预训练权重,而COCO数据集本身就包含person、cat、dog这三个类,所以拿这个测试集直接推理几乎必出结果。这个特性也意味着:你不需要重新训练就能验收这套测试集。这一点很多人没想明白,以为拿到测试集就必须先写上半天训练代码——其实完全不需要。
如果你的需求是先确认“这套测试集本身有没有问题”,最稳的做法是先把YOLOv5官方权重和这张图跑一遍。检测结果如果干净利落,框位置合理、类别正确,就说明图片没有损坏、没有异常旋转、没有极端物体比例。用COCO权重当“基准模型”,等于给测试集本身做了一次质检。反过来,如果COCO权重在这个测试集上漏检严重,那问题大概率在测试图片的复杂度上,后续用什么模型都难出效果。
4.2 训练自己的数据集时如何复用这套测试集
自己训练的时候,常见的做法是把test5.jpg、test12.jpg这组图片单独留作验证集,永远不参与训练。原因很简单:验证集的唯一使命是测泛化能力,一旦参与训练,评估指标就没有参考价值。很多人训练自己的数据集时喜欢把全部图片扔进去,train和val用同一份,最后mAP漂亮得惊人,但一上真实场景就废。这就是典型的过拟合骗局。
复用的方式有两种:第一种,把你的训练集和这套测试集放在同一个项目下,data.yaml里train指向你的数据,val指向测试集,每次训练完自动评估一遍;第二种,训练完成后单独跑val.py,只验证测试集上的mAP。两种方式建议都做,一个看收敛趋势,一个看最终效果。
还有一种更细的用法:如果你的自建数据里也包含人、猫、狗,这套测试集可以作为类别均衡性的校准样本。比如你的训练集里狗只有200张,猫有2000张,训练完模型的dog AP大概率偏低。这时候拿测试集复测,能帮你快速判断是否需要给狗类数据做增强。
4.3 超参数与图片尺寸在前测阶段的常见调法
迁移学习阶段,超参数调整要克制。很多人一上来就动learning rate、momentum,我建议前测阶段只改三个东西:imgsz、epochs和batch size。imgsz决定了输入分辨率,直接关系到小目标能不能被保住;epochs决定模型能不能收敛,一般从100起调;batch size如果显存够就尽量往大设,因为目标检测的BN层对batch size敏感,太小会导致统计量震荡。
python train.py --data data.yaml --weights yolov5s.pt --img 640 --epochs 100 --batch-size 16 --project ./runs/train --name self_train这几个参数不需要来回试,因为测试集的作用是验收不是调参。真正需要精细调的是conf_thres这类推理参数,训练参数按默认就好。调参这事玄学成分大,但如果你的测试集是固定的,每次调完都拿它测一遍,至少能保证前后对比是在同一个裁判面前进行的。
5. 避坑记录:测试集使用中的五个经典翻车现场
5.1 现象:detect.py能跑,但输出图片上一片空白,一个框都没有
原因通常是conf_thres设得太高,或者模型权重与自己数据集类别不匹配。比如你拿一个只训练了行人的权重来测猫和狗,模型压根没有这两个类别的输出头,自然什么都画不出来。
解决:先把conf_thres降到0.25重新跑,确认有没有框;如果还没有,检查weights路径是否是COCO预训练权重,或者用样本图片跑一次官方yolov5s.pt做对照实验。这一步能快速定位是阈值问题还是权重类别覆盖问题。
5.2 现象:val.py报错“no labels found”
原因是最常见的目录或文件不匹配:images里有test5.jpg,但labels目录下没有test5.txt,或者文件名大小写不一致,再或者yaml里val路径指错了。
解决:进入labels目录执行ls | grep test5,确认标注文件存在且前缀完全一致。另外注意,YOLOv5对中文路径支持不好,路径里带中文名也会导致找不到文件。把整个项目移到纯英文路径下,重新执行val.py。
5.3 现象:图片命名带空格或中文,终端显示读取成功但实际没读进来
原因是detect.py内部用的是glob匹配加路径拼接,空格会被当成路径分隔符,中文字符在部分编码环境下会乱码。
解决:所有测试图片统一重命名为纯英文短名,比如img01.jpg、img02.jpg,再执行推理。这个坑看起来基础,但几乎每个下载到带空格文件名数据集的人都踩过,重命名动作必须放在第一步,不要等跑挂了再改。
5.4 现象:把测试集的图片混进训练集,训练指标虚高,测试集验收形同虚设
原因是很多人没理解“测试集”和“训练集”的分工。测试集一旦参与训练,模型相当于见过考试答案,之后的mAP完全是自欺欺人。
解决:严格隔离,测试集目录只出现在val字段里,永远不出现在train字段中。同时建议给测试集目录设置一个只读权限,常见做法是在Linux下执行chmod -R a-w dataset/test,从物理上防止误拷贝。
5.5 现象:改了一轮参数后,对比不出前后两次实验的差异
原因是你没有固定评估口径。比如第一次跑detect.py用了conf_thres=0.5,第二次调成0.3,框多了很多,你以为是模型变好了,其实只是阈值放宽了。
解决:评估统一用val.py的mAP指标,不拿detect.py的单张截图说话。跑之前记录完整参数组合:权重路径、img尺寸、conf阈值、iou阈值,每次实验一个变量只改一处。我给每个实验统一编号,参数写进实验记录表里,对比时先看参数再看结果,能避免九成误判。
6. 把测试集变成回归基线:一次手动记录改变的工作习惯
这套测试集最好用的地方,是把它固定下来当回归基线。比如你现在有两个候选权重,一个是官方yolov5s.pt,一个是你自己微调过的,怎么快速判断要不要换?跑同一套测试集,记录各自的人、猫、狗AP,做一张对比表,五分钟出结论。关键是,这个基线要保持固定,不能今天换一张图、明天删一张图,否则所有对比都不成立。
我现在的做法是:建一个test_bench目录,把测试集原图和对应的验证yaml全部放进去,然后写一个极简脚本,把每次实验的指标自动追加到同一张CSV里,命令如下:
python val.py --data data.yaml --weights ./weights/yolov5s.pt --img 640 --conf-thres 0.001 --iou-thres 0.6 --project ./runs/bench --name yolo5s_v1 | tee -a ./bench_results.logtee -a把输出同时打印到屏幕和日志文件,日志文件里沉淀的就是一次次实验的原始数据。等积累了七八条记录,再用Excel或pandas拉一张透视表,看每个权重的mAP趋势、类别间差异,比翻训练曲线直观得多。从那以后,我每次新训完一个模型,都强制走一遍这个流程:固定测试集、固定参数、固定脚本,跑完记日志,再对比。这套操作说不上高深,但确实帮我避开了很多“感觉模型变好了”的错觉。测试集的使命就是当一面诚实的镜子,希望你也能用好这份资源,让每次实验结论都站得住脚。
本文还有配套的精品资源,点击获取