
简介面向YOLOv5目标检测实验的测试数据集为深度学习初学者、算法测试人员及模型优化研究者提供了一组人、猫、狗三类目标的真实测试图像与配套标注。利用这些数据可对已有模型进行精度验证、错误样例分析、数据增强对比实验也能直观判断训练效果并定位漏检误检问题。包体共501个文件包含200张jpg测试图像、100个xml标注文件和201个txt标签文件xml与txt对应不同标注工具与训练格式无需手动转换即可在YOLOv5及其他主流检测框架中直接使用。整个资源压缩后约53.53MB规模精炼适合本地或低配置环境快速下载运行。目前已有770人学习使用全部原始目录结构及元信息均被保留方便二次加工与批量处理可作为模型评估、课程作业或算法比赛中的快速测试集。1. YOLOv5人猫狗检测测试集五张图能把模型的底牌摸到什么程度做目标检测的人大多卡在同一个环节训练脚本跑完曲线正常但模型一上手就漏检或者换个角度猫狗直接消失。手上有一份 YOLOv5 测试数据集专门用来检测图像中的行人、猫和狗包含 test、test5、test12、test72、test93 五张 JPEG 测试图问题就具体多了你可以用它判断置信度阈值该调多高、IOU 抑制要不要放宽、小目标值不值得强求。这份资源解压后放到datasets/test_images/配合 YOLOv5 的detect.py两步命令就能跑出结果。适合刚训练出一版模型、想验证落点的新手也适合换数据集后要快速回归对比模型表现的老手。五张图规模不大但漏检、误检、置信度偏移这三类常见问题一次推理就能验个大概把“模型到底行不行”从玄学变成可量化的检查。2. 测试集结构五张图的文件组织、标签约定和评估口径2.1 先看文件命名不连续但场景有差异解压后是五张 JPEGtest.jpg、test5.jpg、test12.jpg、test72.jpg、test93.jpg。文件名没按自然数连续排列说明采集时是按批次或相机时间戳存的不是同一个视频抽帧。实际使用前我一般先逐个打开看一遍而不是直接塞给模型。看什么三件事光照方向、目标尺度、有没有遮挡。这五张图恰好能覆盖不同难度。比如有几张是室内暗光环境猫跟背景的纹理接近这种图最能测出模型有没有把纹理相似的背景误框成目标。另一张如果人物占据大面积猫或狗蹲在角落只占画面很小比例那测的就是小目标召回。这些特征在文件名里看不出来但用图像查看器扫一遍就有数了。如果图像里有半遮挡目标——比如猫在桌子底下只露出头和前腿——这种样本最能检验 anchor 框的回归能力也会让后续计算指标时更有说服力。我拿到一个小数据集第一步永远是做差异度盘点而不是急着跑代码。盘点完心里有数后面调参才不会瞎试。这里要提出一个观点小测试集的价值不在数量在差异度。同样是一批“人猫狗”场景如果全是近景大目标十个样本也说明不了问题如果有一张远景、一张遮挡、一张暗光哪怕只有三张也比均匀分布的十张更能暴露出模型短板。所以我把这张测试集的五张图编成一张便利贴标注每张图的目标数、是否有小目标、是否有遮挡。每次推理完对照便利贴看哪个维度先崩。2.2 标签格式YOLO TXT 的坐标约定和类别顺序如果只做推理五张图不需要标签detect.py会自动把结果写到labels/目录下的同名 txt。但如果把这五张图当验证集来算指标或者想拿去做训练就必须按 YOLO 格式补标签。每一行是class_id x_center y_center width height四个数值都是归一化小数除以图像宽高后的结果取值在 0 到 1 之间。常见错误是有人把像素坐标直接写进去训练时 loss 直接爆炸。我自己写过一个转换脚本这里把核心计算贴出来import os def voc_to_yolo(x_min, y_min, x_max, y_max, img_w, img_h): x_center (x_min x_max) / 2 / img_w y_center (y_min y_max) / 2 / img_h w (x_max - x_min) / img_w h (y_max - y_min) / img_h return round(x_center, 6), round(y_center, 6), round(w, 6), round(h, 6)参数含义直接x_min/y_min/x_max/y_max是像素坐标的左上角和右下角img_w/img_h是图像原始分辨率。返回值四舍五入到 6 位小数这个精度对 640 尺度的训练完全够用太多位数反而让文件变大没有必要。接下来是类别顺序。data.yaml里的names列表决定类名映射通常写names: 0: person 1: cat 2: dog注意COCO 预训练权重yolov5s.pt的人物在 0 位、猫在 15 位、狗在 16 位与自己数据集的 0/1/2 顺序完全不同。用yolov5s.pt做迁移学习训练时YOLOv5 会根据nc调整输出头前几轮 loss 不降是正常的因为模型正在重新学习类别映射。但这不代表你可以随意排names顺序一旦训练完成后推理时names必须与训练时完全一致否则测试图上会出现“把猫框成狗”的错位结果。2.3 小测试集评估不要只盯 mAP盯逐图细节五张图算 mAP 没有统计意义分布一下就到 0.7 还是 0.9完全取决于验证集怎么切。我更习惯把每张图单独记录三个数检测框数量、漏检数、平均置信度。漏检数靠人眼数五张图工作量不大。平均置信度用推理输出的 txt 算。YOLOv5 每张图检测结果的 txt 行格式是class_id x_center y_center width height confidence第六位是置信度。写个小脚本直接统计import os import glob def summarize(runs_dir): rows [] for txt in sorted(glob.glob(os.path.join(runs_dir, labels, *.txt))): basename os.path.basename(txt)[:-4] confs [] with open(txt, r) as f: for line in f: parts line.strip().split() if len(parts) 6: confs.append(float(parts[5])) avg sum(confs) / len(confs) if confs else 0 rows.append((basename, len(confs), round(avg, 3))) return rows for name, n, avg_conf in summarize(runs/detect/test_images): print(f{name}: boxes{n}, avg_conf{avg_conf})参数上只需要改runs_dir指向实际输出目录。判断标准漏检数为 0 时平均置信度的绝对值高低其实没那么重要只要五张图的置信度分布一致就可以但如果某一张图漏检明显多于其他图说明模型对该场景存在结构性缺陷是训练集里缺少同类样本的信号不是阈值能救回来的。提示把五张图的输出记录下来命名成test5_v1.txt这种带版本号的文件。换模型权重、换超参数后再跑一轮用 diff 对比新旧结果比盯着 tensorboard 猜问题高效得多。3. 把五张图跑进 YOLOv5环境、推理命令与结果解读3.1 环境匹配Python、CUDA、PyTorch 的三角关系YOLOv5 官方代码在 Python 3.8~3.10、PyTorch 1.8~1.13 区间最稳。显卡驱动版本决定能装哪个 CUDA 工具包NVIDIA 驱动 470 以上配 CUDA 11.4、PyTorch 1.12 这个组合用得最多踩坑最少。没有 NVIDIA 显卡也没关系CPU 推理单张 640×640 大约 2~5 秒五张图完全能承受我甚至会用 CPU 跑一遍看看纯前向推理的差异。独立 conda 环境的安装步骤conda create -n yolov5 python3.9 conda activate yolov5 pip install torch1.12.1 torchvision0.13.1 --index-url https://download.pytorch.org/whl/cu113 git clone https://github.com/ultralytics/yolov5.git cd yolov5 pip install -r requirements.txt--index-url指定的是 CUDA 11.3 对应 wheel 源如果驱动版本更高换成cu116或cu117也可以。装完先跑python -c import torch; print(torch.cuda.is_available())输出 True 再继续。这里最常见的问题不是装不上而是服务器上已经有一个跑 TensorFlow 的 conda 环境直接往里塞 YOLOv5 依赖结果opencv-python版本互相打架。多花五分钟建独立环境是性价比最高的安排。3.2 推理命令detect.py 参数逐个说清楚推理命令非常固定python detect.py \ --weights yolov5s.pt \ --source ./datasets/test_images \ --conf-thres 0.25 \ --iou-thres 0.45 \ --img 640 \ --device 0 \ --save-txt \ --exist-ok \ --project runs/detect \ --name test_images--weights yolov5s.pt是官方 COCO 预训练权重也推荐先拿它跑一遍测试集做对照组。--source指向包含五张图的目录。--conf-thres 0.25是置信度阈值低于这个值的框直接丢弃。--iou-thres 0.45是 NMS 的 IOU 阈值两个框重叠超过它低分框被抑制。--img 640决定模型输入分辨率一般保持训练时一致。--save-txt把检测结果写成 YOLO 格式 txt。--exist-ok表示输出目录存在时直接复用不加这个参数第二次运行会报错。这里有三个容易被忽略的点。第一--name test_images如果不指定YOLOv5 会自己起名exp、exp2、exp3不方便对照显式指定名字才能稳定归档。第二test12.jpg会排在test5.jpg前面因为 YOLOv5 按字典序排列输入文件不是自然数序。如果你介意顺序把文件名改成test_01这种格式再放进去。第三--conf-thres和--iou-thres是互相影响的。提高conf-thres减少低置信误检但如果同时不调iou-thres高重叠框可能没被压干净反过来如果把iou-thres从 0.45 提到 0.6保留下来的框变多conf-thres那边该不该降就要重新考虑。3.3 结果解读先看可视化图再用 txt 验证数量推理完成后runs/detect/test_images/下会生成带标注的可视化图和labels/目录。可视化图直观判断框是否贴着目标边缘类别名对不对置信度数字是高是低。我的习惯是按这几步检查。第一步逐张图数一遍实际目标数量。比如test.jpg里如果有两个人、一只猫就需要两个 person 框加一个 cat 框。第二步对比可视化图里的框数确定哪些目标漏检了。第三步用上面第 2.3 节的统计脚本算平均置信度重点看置信度偏低的那些框。如果一张图检出一个person 0.12说明模型知道那里有个东西但特征匹配度不够通常要回训练集补该类样本。如果检出一个dog 0.9但框的位置实际在猫身上那是类别混淆常见原因是names顺序配错或者训练集中狗类样本不够。这两个问题的解决方向完全不同所以判断时要先区分是漏检、低置信还是错检。如果你想细看每个框的坐标直接打开labels/下的 txt每一行就是class_id x_center y_center width height conf。比如一行内容是1 0.5123 0.4382 0.2114 0.2679 0.87表示这是一个 cat 框中心点在图像坐标的 (0.51, 0.44) 附近框宽约 21% 的图宽高约 27% 的图高置信度 0.87。这个信息用来判断框是否居中、是否过小比肉眼看可视化图更精确。4. YOLOv5 测试避坑指南五条翻车记录与排查路径4.1 图像全军覆没一个框都没有现象detect.py正常跑完可视化图一张框都没画labels/里的 txt 全是空文件。原因两类情况。一是conf-thres设太高比如 0.5 以上而模型对这些目标的置信度都在 0.3 左右二是权重文件本身类别数不对加载了 1 类模型去跑 3 类场景输出头维度匹配不上自然检不出。解决把conf-thres降到 0.1 重跑一次如果出框说明是阈值问题。如果还是全空用torch.load打印权重文件的nc字段确认是不是 3。另外注意命令行相对路径权重文件如果没加载成功YOLOv5 可能静默使用默认权重这种情况最容易把人带偏。python detect.py --weights runs/train/exp/weights/best.pt --conf-thres 0.1 --source ./datasets/test_images4.2 一个目标被框成两个重叠框现象同一个人被两个框同时框住一个置信度 0.8、一个 0.45NMS 似乎没有生效。原因iou-thres默认 0.45 不算低但两个候选框的中心点和宽高非常接近时IOU 可能就是刚好没过阈值。另外如果误开了--agnostic-nms跨类别的抑制逻辑会改变行为把不同类别的重叠框也一起压掉。解决把iou-thres提到 0.5 或 0.6 实验。同时查一下命令行有没有--agnostic-nms这个参数在人和狗位置重叠时会导致漏检我的习惯是默认不开除非类别间严重重叠才使用。4.3 小目标完全漏检大目标一切正常现象人像全部检出但画面角落的猫、远处的小狗一个都没有框。原因这是尺度问题不是模型坏了。如果目标在图像里高度只有 15~20 像素按img640推理目标经过多层下采样后在特征图上只剩几个像素特征几乎消失。训练时小目标样本占比低也会加剧。解决推理阶段把--img从 640 提到 960输入分辨率变大小目标在特征图上的响应会变清晰。代价是推理耗时增加约 40%~60%。训练阶段要保证小目标框不丢失标注时别只标大物体并考虑打开--multi-scale增强。4.4 同一张图连续两次推理结果不同现象同一张test5.jpg连着跑两次框的位置或置信度有细微差异让人怀疑模型权重不稳定。原因绝大多数情况是命令行开了--augment。测试时增强会给输入做多尺度推理和水平翻转每次随机采样带来微小差异。默认推理本身是确定性的不开增强、固定随机种子后同一张图的结果应当完全一致。解决检查命令行去掉--augment如果脚本里设置过随机种子固定为同一个值。如果还不一致检查是否用了 TensorRT 动态 shape 或批量推理部分推理框架在动态输入尺寸下会有浮点抖动。4.5 推理内存不足OOM 中断现象跑测试集时RuntimeError: CUDA out of memory训练和推理都中断。原因--batch-size残留了训练时的数值或者同一块 GPU 上其他进程占用了大量显存。YOLOv5 默认推理 batch 是 1如果你从训练脚本复制了命令过来很容易把 batch 从 16 带过来。解决推理时显式指定--batch-size 1模型权重较大时换yolov5s.pt验证流程。nvidia-smi看一眼显存占用情况如果别的进程占了 80%要么等它结束要么换一块空闲 GPU。提示五条翻车记录里四条都是我真实踩过的。后遗症是我现在跑推理前会强制检查三个东西——当前工作目录、命令行参数里的 batch 值、names顺序。建议你也把这三点养成肌肉记忆能省下大量排查时间。5. 从测试集到训练集标注、data.yaml 和超参数起点5.1 给测试图补标注labelImg 走一遍 YOLO 格式要把五张图变成自己的验证集第一步是标注。工具上我一般用 labelImg因为它导出 YOLO 格式最直接pip install labelImg labelImg images/ classes.txtclasses.txt里按行写person cat dog操作不多按W框选目标按A/D切换上一张/下一张图CtrlS保存。保存后每个图片同名 txt 出现在labels/目录。这里要注意三个细节一是类别名全用小写且不要有空格二是如果图像里有目标但你没标模型会把它当背景学所以五张图即使再小也要完整标注三是 person 和 pedestrian 不能混用两个词在语义上等价但会被当成两个类别。标注完可以用一段短代码快速检查标签格式find labels -name *.txt -exec wc -l {} 每张图的 txt 行数应该和图像中的目标数大致对应。如果某张图显示 0 行说明漏了标签检查文件名是否和图像文件名完全一致。5.2 数据目录和 data.yaml结构定下来才能训练YOLOv5 训练的数据目录要求images/和labels/并列名字一一对应datasets/ images/ train/ test5.jpg val/ test12.jpg labels/ train/ test5.txt val/ test12.txtdata.yaml是这个结构的解释文件train: datasets/images/train val: datasets/images/val nc: 3 names: [person, cat, dog]train和val指向目录而非文件路径YOLOv5 会自动递归查找图片。nc必须等于names的长度。我遇到过一个内部事故同事把names改成了三个类别但nc还写着 2训练过程不报错最终模型的输出头只有 2 个通道验证集 mAP 全乱。所以在启动训练前我用一个命令行确认配置一致性python -c import yaml; dyaml.safe_load(open(data.yaml)); assert len(d[names])d[nc]; print(ok)5.3 训练命令和超参数迁移学习选好起点五张图远不够训练完整模型但作为起点实验可以。把数据准备好之后python train.py --data data.yaml --weights yolov5s.pt --img 640 --batch 16 --epochs 100 --patience 20 --device 0--weights yolov5s.pt是迁移学习起点。--patience 20连续 20 个 epoch 验证集不回升就早停。--batch 16在 8GB 显存上比较稳16GB 显存可以提到 32。超参数文件hyp.scratch-low.yaml里我会动lr0和小目标增强相关项lr0默认 0.01小数据建议降到 0.005防止前期震荡mosaic默认 1.0样本少时降到 0.5避免增强数据过度偏离原分布。训练日志里重点看val/box_loss、val/obj_loss和mAP0.5。obj_loss反映模型对“这里有没有目标”的判断mAP0.5是整体精度的标尺。两者同时进入平台期基本可以停掉。5.4 训练后的回归测试固定测试集的对比表训练完成用best.pt重新跑一遍五张图和yolov5s.pt做对照图名best.pt 框数yolov5s.pt 框数best.pt 置信度均值test.jpg340.72test5.jpg240.65test12.jpg130.58test72.jpg230.68test93.jpg340.70判断标准是“该检出的目标有没有检出”不是框越多越好。如果 best.pt 全面落后于 yolov5s.pt那就是训练环节有问题去核对标注和数据分布不要用继续加 epochs 的方式掩盖问题。我见过有人连着训了 300 个 epochloss 曲线很平但测试结果依旧不如预训练权重最后发现是 labels 目录下一半的 txt 坐标越界——问题根本不在训练时长上。6. 进阶技巧把测试集当回归基准时先固定这三个变数训练和推理之间隔着三个变量如果不固定你看到的置信度变化根本不代表模型能力变化只代表操作层面的随机性。第一个变数是图像缩放策略。YOLOv5 推理时默认把输入缩放到--img 640但不是拉伸是等比缩放加灰色填充。训练时如果用 640推理时换成 960 或 1280检测头感受野和框回归的正常工作范围就变了。结果是框可能更偏小目标可能反而消失。所以我训练和推理永远保持同一个--img数值除非专门做分辨率对比实验。第二个变数是 NMS 参数。训练阶段val.py里的--iou和推理阶段detect.py里的--iou-thres是两个入口最容易漏掉一致性。我的习惯是统一设成 0.45然后在测试集上做一次 0.4/0.45/0.5 的小扫描确定上线值。这个值一旦定下来就固定不要每跑一轮推理就换一次。第三个变数是数据增强开关。训练开了 mosaic 没问题推理时绝对不能开--augment。推理增强虽然偶尔能提升精度但它引入随机性回归测试的结果就不可复现了。你在对比两个模型时如果结果有浮动先怀疑推理增强再怀疑权重。这三个变数稳定之后五张测试图才能发挥真正的价值对比置信度分布、对比漏检数、对比框的稳定度。我有一次把--img从 640 改成 1280 做推理满心期待小目标召回变高结果漏检从 2 个变成 4 个折腾了半天才定位到是检测头在非训练分辨率下的回归偏移。从那以后我给自己立了规矩每次训练完用同一组测试图、同一套推理参数记录框数和置信度均值三个数字全部正常才进入下一轮。参数、环境、数据三者全定住看到的结果才可信。希望帮到你。本文还有配套的精品资源点击获取