YOLOv5测试数据集:人猫狗目标检测模型验证与调参实战
简介面向YOLOv5目标检测任务的数据集可用于识别图像中的人、猫和狗三类目标也适合目标检测入门练习、算法效果对比以及模型调优验证。资源整理为501个文件包括200张jpg原图、100个xml标注文件和201个txt说明文本压缩包大小约53.53MB。图像保留了原始信息适合刚入门目标检测的学习者用来熟悉yolov5的数据格式与检测流程也可以直接作为测试集验证自己训练模型的泛化能力帮助检查漏检或误检情况。通过训练对应数据集有助于理解图像分类原理并提升检测准确性。目前已有770人浏览学习文件结构清晰jpg原图与xml标注一一对应txt文件可用于标注信息查询或格式转换使用过程中可自行划分训练集与验证集整体上是一份实用且易于上手的目标检测测试数据。1. yolov5 测试数据集拿人、猫、狗三类目标验证模型最省事做目标检测最烦的不是训练是训完了不知道模型到底行不行。我自己早期就吃过这个亏模型在训练集上 loss 降得漂亮一换到真实照片上框全飘。后来养成一个习惯训练前先固定一批测试图训练后第一时间跑一遍用固定的输入验证模型的泛化能力。这份 yolov5 测试数据集就是给这个场景准备的专门用来检测图像中的人、猫和狗。它的价值不在于数据量有多大而在于目标类别覆盖了「人 宠物」最常见也最容易翻车的组合而且保留了原始信息拿过来可以直接喂给 yolov5 的 detect.py 脚本不用改格式也不用自己写加载逻辑。适合正在训练你自己的数据集、需要快速验证模型效果的从业者也适合刚接触 yolov5 环境配置、想用现成图片跑通全流程的新手。2. 测试数据集的构成与适用边界三类目标的直接价值2.1 测试集和训练集的分工为什么检测任务需要专门留一手数据集本身不参与训练但它在整个模型迭代里起到的作用不亚于训练集。很多人默认「数据集 拿来训练的」忽略了测试集承担的两个独立任务第一验证模型在未见过的图片上的表现防止过拟合第二给超参数调整提供统一的评价基准。yolov5 训练过程中虽然会从训练集里划出一部分做验证集val但这个划分是随机的且每次训练可能不一样。真正要对比两个不同权重文件谁更好必须用同一批固定图片跑同一个评测脚本结果才有可比性。这份测试数据集的图片内容集中在人、猫、狗三类目标上背后有一个很现实的选型逻辑这三个类别的形态差异大人的姿态复杂、猫狗有各种品种和体型能同时测出模型的特征提取能力和边界框回归精度。如果模型在这三类上表现稳定换到其他目标上翻车的概率会低很多。另外多主体检测是目标检测里最容易出问题的场景——一张图里同时出现人和狗框怎么分配、重叠时怎么处理这直接对应实际落地时最常见的画面构成。2.2 数据集的适用场景从模型测试到超参数调优我拆过不少目标检测项目真正能直接拿来做测试的公开图片比想象中少。要么是 COCO 的图分辨率参差不齐要么是别人的截图带了水印跑出来的指标没法说服自己。这份数据集的适用场景很明确场景是否适用原因验证已训练模型的检测效果适用图片保留原始信息直接跑 detect.py 即可对比两个权重文件的性能差异适用固定输入控制变量结果可信调整 conf-thres 和 iou-thres 参数适用多主体场景能放大参数设置不当的问题作为迁移学习的测试基准适用人、猫、狗是常见类别通用特征好提取大规模训练模型不适用测试集数量有限应扩展后再用于训练实际使用中第 4 个场景值得多说一句。迁移学习时很多人直接拿测试集当验证集用这不是不行但要意识到测试集一旦被反复用来调参就等于被「污染」了最终评价指标会虚高。我一般会把这份数据集的图片复制一份一份留作最终测试一份专门在调试轮次用来快速检查模型有没有明显退化。3. 用测试集验证模型detect.py 完整跑一遍3.1 环境准备与权重文件选择使用这份测试数据集的前提是 yolov5 环境能跑通。常见做法是克隆官方仓库、安装依赖再准备一个训练好的权重文件。如果只是想验证流程可以先用官方提供的预训练权重 yolov5s.ptCOCO 上训出来的模型本身覆盖 person、cat、dog 三个类别正好匹配数据集的检测目标。先看环境准备的一组命令git clone https://github.com/ultralytics/yolov5 cd yolov5 pip install -r requirements.txt第一行克隆的是 yolov5 官方仓库里面包含了 detect.py、train.py、val.py 等核心脚本。第二行进入仓库目录。第三行安装依赖requirements.txt 里锁定了 torch、opencv-python、matplotlib 等包的最低版本。装依赖时如果遇到网络慢可以让 pip 换国内镜像源实测速度能快不少。权重文件建议放在仓库根目录下的 weights 文件夹里。没有现成模型的话检测脚本会自动从官方地址下载对应版本不方便自动下载的话也可以手动下载后放到相同位置这样避免反复触发下载逻辑。3.2 单张到批量推理命令参数逐项拆解环境就绪后用测试集跑推理的核心命令是调用 detect.py。先把单张图片的测试跑通再扩展到整个数据集。常用命令如下python detect.py --weights weights/best.pt --source ../yolov5-test-dataset/test.jpg --conf-thres 0.4 --iou-thres 0.45 --save-txt --project runs/detect --name test01这条命令的参数可以拆成几组来理解。--weights指定权重文件路径训练完的自定义模型一般取名 best.pt也可以用官方预训练的 yolov5s.pt。--source指定输入来源这里指向测试集中的一张图片也可以是整个文件夹、视频文件甚至摄像头设备号。--conf-thres是置信度阈值默认 0.25设到 0.4 意味着过滤掉置信度低于 40% 的检测框适合想让输出更干净的场景。--iou-thres是 NMS 的 IoU 阈值控制两个重叠框会合并到什么程度默认 0.45 是一般场景下比较均衡的值。--save-txt额外把检测结果写成 YOLO 格式的文本文件方便后续脚本分析。--project和--name组合决定了输出目录是runs/detect/test01这样多次试验可以分开存放互不覆盖。单张跑通后把--source改成整个数据集目录python detect.py --weights weights/best.pt --source ../yolov5-test-dataset --conf-thres 0.25 --iou-thres 0.45 --save-txt --project runs/detect --name dataset_all注意--conf-thres这次改成了 0.25也就是默认值。单张测试时可以调高阈值减少干扰项但批量测试时建议用默认值因为不同图片的目标远近、遮挡程度不一样阈值定太高会漏掉大量真实目标最终统计出来的结果不能反映模型的真实水平。3.3 从检测框到可视化结果看懂输出文件跑完批量化推理后输出目录runs/detect/dataset_all里有两类结果一类是画了检测框的图片另一类是--save-txt生成的同名 txt 文件。这些 txt 文件才是可量化的结果格式是标准的 YOLO 标签格式class_id x_center y_center width height每一行代表一个检测到的目标。class_id是类别编号在 COCO 类别里 person 是 0、cat 是 15、dog 是 16。后四个值是归一化后的边界框参数范围在 0 到 1 之间对应边界框中心点的坐标和宽高相对于图片尺寸的比例。这个格式与训练集的标注格式一致因此测试集的推理结果可以直接拿来和分析脚本对接也可以喂给评测工具计算 mAP。4. 避坑测试集跑不通的五个常见原因4.1 现象 1图片里明明有人却一个框都没出这个现象几乎每个用测试集的人都会遇到。原因往往不在模型而在--conf-thres设置过高。我用 0.5 以上阈值跑过一张包含小尺寸行人的图片模型实际是检测到了目标但置信度只有 0.3 左右全部被阈值过滤掉了。解决方法是把阈值降到 0.2 到 0.25 重新跑如果此时能出框就说明不是模型问题是阈值设置和图片目标尺寸之间不匹配。4.2 现象 2猫狗框重叠严重一个目标被框两次检测结果里常出现一只猫身上叠了好几个框或者狗的头部和身体各出一个框。这个现象的原因在于 NMS 的--iou-thres参数没调好。阈值偏高时两个高度重叠的候选框会被判定为不同目标从而同时保留。把--iou-thres从默认的 0.45 往下调到 0.3 试一下通常能合并掉多余的框。如果调低之后目标框还是不稳定那么问题可能出在模型本身没收敛好可以检查训练阶段的回归 loss 是否降到位。4.3 现象 3置信度调低后框开始乱飘在 conf-thres 调到 0.1 甚至更低的情况下输出会出现大量毫无意义的框把背景区域也框了出来。原因在于模型的置信度分布不够尖锐真正的目标置信度在 0.5 以上背景噪声落在 0.2 到 0.3 的区间一旦阈值下沉到这个区间噪声就全部暴露了。这种时候不要急着加阈值先看一张图的目标数量和分布如果目标特别密集且相互遮挡适当调整 NMS 阈值的效果比调整置信度阈值更好。4.4 现象 4测试集上效果不错换到真实图片上效果明显变差用这份测试集验证通过了部署到实际场景却不理想问题几乎都出在数据分布差异上。测试集图片和真实场景图片在分辨率、光照、拍摄角度等方面不完全一致模型会对训练时见过的图片模式产生过拟合测试集和训练集如果来源接近就会虚高。解决方法是把这份测试集当作「冒烟测试」真正验证部署效果时挑选一些与目标场景光线、角度接近的实拍图单独建一个测试文件夹定期更新里面的图片。4.5 现象 5检测脚本报错找不到依赖包换一台机器或换一个 conda 环境跑 detect.py 时经常报No module named torchvision之类的错误。原因是在新环境里没有重新安装 yolov5 的依赖。解决方法是重新执行一遍依赖安装命令注意先激活正确的环境再执行不然会装到默认环境里去。另外pip 安装的包版本太新也可能报 API 不兼容的错误这时参考 requirements.txt 里的版本约束。5. 进阶把测试集跑成一份可对比的评测报告5.1 批量统计每张图片的目标类别分布如果你手上的测试集图片不止三两张手动翻结果图看检测效果就太慢了。更高效的做法是用 Python 解析 detect.py 输出的 txt 文件按图片维度统计检测结果直接定位哪张图漏检、哪张图多框。下面是我常用的统计脚本import os from collections import Counter, defaultdict label_map {0: person, 15: cat, 16: dog} result_dir runs/detect/dataset_all/labels per_image {} class_counter Counter() for name in os.listdir(result_dir): if not name.endswith(.txt): continue img_name name.replace(.txt, .jpg) with open(os.path.join(result_dir, name), r) as f: lines f.readlines() classes [] for line in lines: parts line.strip().split() if len(parts) 5: cls_id int(parts[0]) if cls_id in label_map: classes.append(label_map[cls_id]) class_counter[label_map[cls_id]] 1 per_image[img_name] classes for img, cls_list in per_image.items(): print(img, Counter(cls_list)) print(Total:, dict(class_counter))这段代码把每个 txt 文件读出来提取每一行的类别编号再映射成 person、cat、dog 的可读名称。class_counter统计所有图片里每个类别出现的总次数per_image记录单张图片的类别构成。多数检测框正常时可以直接观察结果判断标准是单张图片里的目标数和统计结果大致匹配如果差异过大说明模型漏检了需要回查原图。5.2 按类别输出置信度分布除了数目标个数置信度分布是判断模型状态的关键指标。一个收敛良好的模型置信度分布应该呈现「正常目标高置信度、背景噪声低置信度」的分离状态。写一个脚本提取每个检测框的置信度值再按类别做直方图分析import numpy as np from collections import defaultdict label_map {0: person, 15: cat, 16: dog} result_dir runs/detect/dataset_all/labels conf_by_class defaultdict(list) for name in os.listdir(result_dir): if not name.endswith(.txt): continue with open(os.path.join(result_dir, name), r) as f: for line in f: parts line.strip().split() if len(parts) 6: cls_id int(parts[0]) conf float(parts[5]) if cls_id in label_map and conf 0.3: conf_by_class[label_map[cls_id]].append(conf) for cls, confs in conf_by_class.items(): arr np.array(confs) print(f{cls}: mean{arr.mean():.3f}, min{arr.min():.3f}, max{arr.max():.3f}, count{len(arr)})注意这里读取的是第 6 个字段也就是置信度值。detect.py 在--save-txt模式下输出的每行包含六个字段前五个是类别和框坐标最后一个是置信度。过滤掉低于 0.3 的检测框是为了排除背景噪声对统计的干扰。如果某个类别的平均置信度明显低于其他类别说明模型对该类别的特征提取还不充分这时候回头检查训练集的类别样本比例大概率是这个类别的图片数量偏少。测试集的价值不在跑通而在于反复用。那之后我每次训练完都会先跑一遍这份数据集的批量推理把输出目录存档再和上一个版本的权重做对比。哪怕只是微调了超参数也要留一份结果很多模型表现「变好」的感觉其实是阈值没对齐造成的错觉。同一份输出标准化之后谁强谁弱一目了然。希望这份数据集和上面的流程能帮你少走我走过的弯路。本文还有配套的精品资源点击获取