ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

YOLO格式猫狗检测数据集:4300张图片训练与部署实践

YOLO格式猫狗检测数据集:4300张图片训练与部署实践 你如果做过几年目标检测一定对收集和清洗数据这件事深有体会。市面上标注好的宠物数据集也不是没有但拿来真去训练YOLO要么图片风格太老要么标注框质量参差要么类别定义和前处理流程对不上。最近我把手头的猫狗检测数据集整理成了YOLO格式一共4300张图片类别就两个——cat和dog标注全部是TXT格式的归一化坐标附带完整的train/val划分和训练配置说明。这篇文章就把这套数据集的做法、结构、训练细节和落地时踩过的坑完整写出来给正在做宠物识别或者入门目标检测的朋友一个可直接参考的样板。1. 先说结论这套猫狗检测数据集解决了什么问题1.1 为什么是YOLO格式而不是COCO或VOC很多刚接触目标检测的朋友喜欢从COCO、VOC这类官方数据集起步格式确实标准但有两个麻烦一是类别多模型参数和训练时间对新手不友好二是标注格式五花八门JSON、XML、TXT来回转换很容易出错。YOLO格式最大的特点就是一行一个目标class x_center y_center width height四个坐标值全部除以图片宽高做了归一化CPU读取和加载都不会有额外换算开销。我整理这套数据集的时候特意统一成了YOLO格式等于把最麻烦的环节直接替大家做了。图片来自多个公开渠道和自采素材原始格式有JPEG、PNG、BMP大小从几百KB到几MB不等我都归一化处理过尺寸标注坐标也全部重算过保证每张图对应的TXT文件里的数值是准确的。1.2 4300张图片的体量适合谁用先说大家最关心的规模。4300张图片、两个类别、总计约5600个标注框这个量级在目标检测里属于轻量级偏上。够不够用看场景入门练手完全够。熟悉YOLOv5、YOLOv8的完整训练流程从数据集加载、参数调整到指标分析这个规模跑一轮很快。小范围项目验证如果你的场景是固定摄像头下的宠物识别或者室内猫狗检测这套数据集做预训练或微调基础效果会很稳。生产级泛化不够。真实场景下宠物姿态、遮挡、光线变化极其复杂4300张只能作为基础后续必须靠自采数据扩充。我的建议是把它当成一个高质量起点而不是终极答案。我实测下来基于这个数据集训练出来的YOLOv8s模型在室内常见场景下mAP50能到0.92左右放在视频流里做宠物检测已经具备实用价值。2. 数据集构成与标注规范从原始图片到YOLO训练集2.1 cat与dog两个类别的划分逻辑类别设计看似简单但有个细节值得注意要不要把猫和狗同时出现在一张图里算作两个独立目标我的做法是每个目标单独画框一张图里可以同时有cat和dog的标签。这样做的好处是模型必须学会区分两个类别而不是学成检测到宠物就是猫这种偷懒逻辑。标注样本的分布上我刻意做了平衡。最终统计是纯猫图片约1900张纯狗图片约1800张猫狗同框约600张。从标注框数量看cat约3000个dog约2600个。类别不平衡控制在1.15比1以内基本不会因为样本数量导致训练偏科。还有一个容易踩的坑玩具猫、玩偶狗、宠物照片里的插画猫算不算正样本我的判断是不算。模型如果学了太多玩偶样本真实场景下的误检率会明显上升。所以这批数据集里的目标只有真实活体猫狗其他一律忽略。2.2 label文件长什么样YOLO格式标注文件与图片同名后缀为.txt放在labels目录下。每一行代表一个目标五个数值由空格分隔0 0.520313 0.481944 0.273438 0.309028 1 0.745313 0.591667 0.204687 0.329167第一列是类别id0代表cat1代表dog。后面四个值是归一化后的中心点坐标和宽高。中心点、宽高都除以了图片原始宽高所以数值全部在0到1之间。顺带说一句很多人用LabelImg标注后忘记做归一化直接拿像素坐标训练YOLO会报错或者loss爆炸。我的习惯是在标注完用Python脚本统一转换不手动改任何数值避免低级错误。转换脚本逻辑不复杂但确实值得写成一个独立工具长期复用import os from PIL import Image # 读取图片宽高将VOC像素坐标转换为YOLO归一化坐标 img Image.open(image_path) w, h img.size x_center (xmin xmax) / 2.0 / w y_center (ymin ymax) / 2.0 / h box_w (xmax - xmin) / w box_h (ymax - ymin) / h2.3 train/val划分与图像尺寸设计我把数据按8比2划分成了训练集和验证集划分的时候刻意避开了同一来源的连续帧全部进入训练集这种情况。如果连续帧互相太像验证集就形同虚设指标虚假偏高。实际做法是先把所有图片按内容相似度粗筛确保验证集里覆盖到不同场景、不同角度、不同光照条件的样本。图片尺寸方面原始图片分辨率差异很大从720p到4K都有。我没有把所有图硬性缩放到同一尺寸而是保留了原始分辨率信息把尺寸统一交给YOLO训练时的imgsz参数处理。这样灵活度更高你可以按自己的显存和算力设置640、960或者1280。默认我建议640起步效果稳定且训练速度快显存足够可以尝试960检测小目标时会略有提升。3. 用这套数据集跑通YOLO训练的关键步骤3.1 环境与目录准备先把目录结构说清楚这是最容易在刚开始就出错的地方pet_dataset/ ├── images/ │ ├── train/ │ │ ├── 000001.jpg │ │ └── ... │ └── val/ │ ├── 000401.jpg │ └── ... ├── labels/ │ ├── train/ │ │ ├── 000001.txt │ │ └── ... │ └── val/ │ ├── 000401.txt │ └── ... ├── data.yaml ├── README.md └── train_test_split.txtimages和labels必须同级且目录名对应这是YOLO工程里的硬性约定。如果你的labels路径和images路径配置不一致训练时会直接报错找不到标注文件。环境建议直接用Python 3.9以上版本PyTorch 2.x配合对应CUDA版本。既然聊到YOLO训练我自己实践下来最顺手的还是ultralytics库一条命令就能跑起来不需要手动写训练循环。如果你更喜欢自定义程度高的方式也可以直接用原版YOLOv5代码仓库但新手我不太建议免费增加了学习成本。3.2 编写data.yaml并启动训练data.yaml是YOLO读取数据配置的核心文件内容很简洁path: /your/absolute/path/to/pet_dataset train: images/train val: images/val nc: 2 names: [cat, dog]这里有两个易错点。第一path建议写绝对路径因为YOLO在做数据加载时会基于path解析相对路径写错了必然报错。第二names的顺序必须和TXT标注里的数字id严格对应0对应cat1对应dog。如果顺序写反模型会把猫学成狗训练出来的模型完全不能用。启动训练我常用的命令是yolo detect train datapet_dataset/data.yaml modelyolov8s.pt epochs100 imgsz640 batch16 device0第一次训练建议从yolov8s.pt开始精度和速度的平衡对猫狗检测这个任务来说已经足够。如果显存吃紧可以用yolov8n.pt速度更快但mAP会掉几个点。我这里直接提一句经验不要上来就选yolov8x猫狗检测不是超大规模任务大模型带来的收益有限训练时间和显存开销却成倍上涨。3.3 训练中常见故障损失函数异常与BN崩溃这部分我单独拿出来写因为训练目标检测模型时最让人头疼的问题就是loss出现NaN、Model在校验阶段mAP直接为0这些现象。BN崩溃也就是Batch Normalization在训练过程中出现统计量异常是典型的高发问题。BN崩溃的表现很直观训练到某个epochloss曲线突然飙升到几百甚至NaN再往后无论怎么调学习率都救不回来。本质原因是批量归一化层在统计mini-batch的均值和方差时如果当前batch的分布和全局分布差距过大归一化后的数值会失控梯度也会随之爆炸。我遇到的BN崩溃大多是下面几个原因叠加导致的batch size过小例如batch4甚至batch2BN统计量抖动剧烈。尤其当图片里目标物很大、背景占比小的时候batch内的特征分布极易失衡。初始学习率过大YOLOv8默认学习率是0.01但如果数据集分布特殊或者使用了较大模型0.01可能还是偏激进。标注数值越界比如TXT里出现了大于1的坐标值这也会导致训练过程异常。我的处理方式分三步。第一步确认标注数据没问题写脚本把所有TXT坐标值做范围检查第二步把batch size提到8以上条件允许16更好第三步把学习率从0.01降到0.001同时把warmup_epochs从默认的3增加到5让BN统计量有更平稳的预热过程。如果问题依旧就调低workers数量排查数据加载是否出现了脏数据。提示训练过程中建议每5个epoch记录一次第一层BN层的running_mean和running_var如果数值出现异常跳变大概率是BN崩溃的前兆这时候立刻停止训练调整参数。还有一个容易被忽略的小坑训练集和验证集图片尺寸不一致。如果训练时用640x640验证时却用1280模型可能因为感受野不同导致验证集mAP异常暴跌。这不是模型的问题是配置不一致导致的很多新手排查半天发现仅仅是因为imgsz配置不同。3.4 指标解读与错误样本分析训练完成后不要只看一个mAP就草率收工。我习惯同时关注precision、recall和PR曲线。宠物检测场景里precision和recall的取舍非常关键如果做的是宠物出现时给主人推送提醒recall低意味着漏报主人生气如果做的是宠物禁区监测precision低意味着频繁误报同样让人烦躁。看训练结果时还要重点检查验证集的错误样本。常见错误包括猫跟深色沙发颜色接近看起来和背景融为一体漏检小型犬和远处的人影混淆误检为人多只宠物互相遮挡时模型只检出一只。这些问题的根源通常是训练数据里缺少类似样本。我当时的方案是回补数据把验证集里漏检的图片重新加入训练集同时找一些宠物身体大面积遮挡、宠物在阴暗角落的图片补充进去重新训练后漏检率明显下降。这就是数据迭代的意义一套固定的4300张数据集不会适配所有场景但它是你迭代的起点。4. 部署到实际场景宠物识别的落地心得4.1 权重导出与推理提速训练好的模型不能只停留在验证集指标上真正要落地还得走向部署。如果你部署在本地服务最直接的方案是导出ONNX再用ONNX Runtime或者TensorRT做推理优化。用ultralytics库导出非常方便yolo export modelruns/detect/train/weights/best.pt formatonnx opset12导出ONNX后推理去掉了很多训练相关的计算图分支速度通常能提升20%到40%。如果再用TensorRT做FP16量化在T4上跑640x640分辨率的检测单路处理可以稳定到2到4毫秒一帧。我之前验证过24路视频流并行T4完全可以吃下单卡实时性不是瓶颈。如果你的落地场景是手机端或者嵌入式设备那还要额外考虑模型尺寸。YOLOv8n的权重大概6MB左右量化到INT8后能压缩到2MB内在边缘设备上跑实时检测是可行的。但注意量化后精度会掉一些宠物检测这种二分类任务通常掉得不多0.5到1个点以内的mAP损失可以接受。4.2 漏检误检成因与针对性优化部署到真实场景后我发现最影响体验的不是模型能力的上限而是模型对训练分布之外样本的处理能力。举几个我真实遇到的例子家里养的猫偶尔会跳到深色靠垫旁边趴着不动模型的置信度直接掉到0.3以下触发不了告警客厅电视里播放宠物相关视频时模型把屏幕里的猫识别成真猫产生误报晚上只有红外夜视摄像头画面整体发绿发灰模型的检测置信度明显下降。针对第一个问题我去补采集了宠物趴着、蜷缩的样本加入训练集重新微调。针对第二个问题我做了后处理逻辑连续N帧内同一位置出现目标且目标置信度波动很小才判定为真实目标。这种方式能有效过滤掉电视画面里的静态内容。针对第三个问题我的方案是把红外画面做风格迁移式的数据增强给训练集加入低光照、灰度的模拟图让模型适应这种输入分布。这些优化都不是模型本身的改动而是数据策略和调度策略的调整。做猫狗检测和做其他目标检测任务一样模型只是引擎真正决定效果的是数据质量和场景理解。5. 后续扩展从猫狗检测走向更复杂的宠物识别5.1 多品种细粒度识别的数据需求两个类别的猫狗检测本质上是二分类检测任务模型的决策边界非常宽松。但如果生产需求升级为识别出这是金毛还是拉布拉多问题就变成了细粒度图像识别难度完全不一样了。细粒度识别的瓶颈不是网络结构而是数据——每个品种至少要有数百张覆盖不同角度和姿态的样本模型才可能学到品种间的细微差异。我建议扩展时按照检测分类的两阶段思路走先用这套数据集训练出的模型做目标定位把宠物框出来再对裁剪后的区域做品种分类。这样一方面避免数据集混合作业带来的标注负担另一方面检测和分类可以分别优化替换分类模型不影响检测功能。5.2 数据增强与半自动标注给数据集扩容时我强烈推荐合理使用数据增强。除了YOLO自带的mosaic、翻转、色调变换之外还可以加一些比较硬核的增强方式比如随机擦除部分宠物区域模拟遮挡场景高斯模糊模拟运动模糊或失焦画面低光照模拟拉低亮度并增加噪声。这些操作能显著提升模型的泛化能力。但注意增强不等于无节制过度的增强会让模型学习到错误的特征。比如把宠物颜色改得面目全非模型可能就会去依赖轮廓而不是纹理。半自动标注是另一个提效利器。你可以用已经训练好的模型去跑一批无标注的新图片把置信度高的预测结果直接写入标注文件然后人工检查修正低置信度的部分。这样一轮下来原来一天能标200张现在能标600张效率翻了三倍。当然前提是你的基础模型已经有一定精度否则还是老老实实手动标。5.3 我踩过的一个坑数据集版本管理最后说一个很多人不在意但很致命的问题数据集的版本管理。我最初整理数据时图片加了、标注改了但没有留版本记录。结果某次训练完发现mAP反而下降排查了很久才发现是因为往训练集里混入了一批横幅广告图里面藏了很多小猫小狗插画模型被带偏了。从一个教训出发我给这套数据集做了一个简单的版本记录文件内容包括version、date、total_images、total_boxes、changes_log每次更新都写一行说明。这已经是工程化的做法了但对于任何要在真实项目里反复迭代的数据集来说这个成本值得付。最后补充一点我的使用体会整套数据集从整理、标注、训练到部署我踩过“不同格式转换的错误”“BN崩溃后的panic”“数据集版本混乱导致的效果回退”这些坑最终沉淀下来的经验就是狗检测模型的效果80%由数据质量决定15%由训练配置决定剩下5%才是模型结构的差异。4300张YOLO格式的宠物识别数据集是一个很好用的起点起码省掉了最枯燥的格式统一和数据清洗环节。如果你想做宠物识别相关项目建议直接拿它跑通一次完整流程再根据自己的真实场景逐步扩充数据。算力够就多试试不同增强策略算力紧就盯紧标注质量和训练日志把这两个点抓好模型的稳定性基本就有保障了。
返回列表