ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

YOLOv5测试数据集:用COCO预训练权重验收人猫狗检测效果

YOLOv5测试数据集:用COCO预训练权重验收人猫狗检测效果 简介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文件核对坐标值是否都在01之间如果某个框的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是类别数量固定为3names的顺序必须跟标注文件里的类别id对应标注里id0就是personid1就是catid2就是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.70.95 算正常Recall所有真实目标中被找出来的比例0.60.9 视难度而定mAP0.5IoU阈值0.5下的平均精度0.7以上可用mAP0.5:0.95多IoU阈值下的平均精度COCO标准0.5以上已不错还有一个容易忽略的细节表格里会按类别分别列出AP也就是person、cat、dog各自的数值。如果person的AP是0.82cat是0.6dog是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_thres0.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趋势、类别间差异比翻训练曲线直观得多。从那以后我每次新训完一个模型都强制走一遍这个流程固定测试集、固定参数、固定脚本跑完记日志再对比。这套操作说不上高深但确实帮我避开了很多“感觉模型变好了”的错觉。测试集的使命就是当一面诚实的镜子希望你也能用好这份资源让每次实验结论都站得住脚。本文还有配套的精品资源点击获取
返回列表