资讯动态

yolov5目标检测实战:人物动物识别从数据集到部署全流程解析

发布时间:2026/10/2 2:40:35 来源:尧图企业网站定制
简介面向计算机视觉学习者与开发者的YOLOv5目标检测实战包专攻人物与动物识别内置可直接运行的代码、数据集及预训练权重。整个压缩包含64个文件类型覆盖Python脚本模型构建、训练、预测、XML标注、txt配置、Markdown说明与pth权重文件整体约20.2MB目录按数据、模型、工具等模块划分代码结构清晰便于二次开发与迁移学习。资料围绕目标检测基础、YOLOv5网络架构、数据集处理、模型训练与评估指标等核心知识点展开作者额外提供自写的预测脚本、VOC07训练讲解和常见问题汇总能帮助使用者避开依赖安装、路径配置等常见陷阱快速跑通检测流程并理解训练到部署的完整链路。已有2872人在CSDN学习下载对想快速入门目标检测、复现项目或开展课程设计的同学很有参考价值。1. 拿到“yolo5目标检测人物动物识别”项目先别急着点运行先说个反直觉的结论这类号称“有代码、有数据、可以直接运行”的yolo5目标检测项目真正第一次跑就能顺利出结果的人十个人里不超过三个。剩下的七个人要么卡在环境依赖要么卡在数据集路径要么卡在权重文件不匹配。yolo5其实是yolov5的常见笔误项目核心是目标检测任务中的人物与动物识别用的是一套基于PyTorch的检测框架配好数据后可以训练出识别行人和常见动物的专用权重。这类项目的典型使用者有三类做安防监控场景的开发人员想快速验证检测效果的算法工程师以及课程设计或毕业设计需要完整案例的学生。它能解决的问题很直接给你一套从数据集到训练命令到推理脚本的闭环让你不必从零搭模型而是聚焦在数据整理和参数调优上。不过“可以直接运行”这句话要打问号。数据格式是否匹配YOLO规范、标签类别是否与配置文件一致、依赖版本是否兼容这三件事只要有一件没对上程序就会在某个角落悄悄崩掉。上一篇我被一个“能直接运行”的项目坑了整整一个下午最后发现只是数据集里有一张损坏的图片。这类玄学问题值得在动手前先建立一套自己的排查顺序。2. 从yolov5的结构看懂选型为什么人物与动物检测值得自己训一套权重2.1 模型主体与检测头的分工CSPDarknet与PANet在做什么对象检测本质上是在回答两个问题图里有什么以及它在哪。yolov5用Backbone提取图像特征用Neck融合不同尺度的特征图再用Head输出类别概率和边界框坐标。Backbone通常用的是CSPDarknet它把基础卷积块拆成两部分一部分走梯度流一部分走残差连接在减少计算量的同时保留足够丰富的语义信息。Neck部分采用PANet结构通过自顶向下和自底向上的路径把浅层位置信息与深层语义信息融合起来这样小目标比如远处的行人也能被检测头捕获到。Head部分负责输出三个尺度的预测结果。以输入尺寸640为例模型会分别在80x80、40x40、20x20的特征图上做预测分别对应小、中、大目标。每个网格单元预先铺设不同长宽比的锚框网络学习的是锚框相对真实框的偏移量。理解这一点后面调参数时就不会乱动anchors因为yolov5在训练时会根据你的数据集自动重新聚类锚框手动硬改反而容易让训练不稳定。2.2 通用预训练权重与自训权重的取舍很多拿到这个项目的人会问直接用官方COCO预训练权重不行吗COCO的80个类别里确实有person也有cat、dog、horse等动物类但它没覆盖的场景太多。比如你想识别羊、牛、鹿这类常见畜牧或野生动物预训练权重里没有对应类别。另一个更关键的问题是部署环境往往只需要人物和动物两类或少数几类标签用80类模型推理不仅慢还会出现大量你不关心的目标框给后处理带来麻烦。所以常见的做法是用自己的数据微调或干脆从头训练一个两分类模型。微调的意思是加载COCO预训练权重替换掉Head部分的分类层冻结Backbone前几层用你的数据集继续训练。这种做法适合数据量几千张的中等规模场景训练收敛快小样本下不容易过拟合。从头训练则适合数据分布与COCO差异极大的场景比如全是无人机俯拍视角的动物图像这时预训练权重反而会成为负担。从实操角度讲我一般建议先微调因为yolov5默认从COCO预训练权重启动改动小代码路径最短。等跑通整个流程后如果验证集mAP不理想再考虑解锁更多层甚至从零训练。2.3 “人物动物”标签集怎么定二分类还是带场景的多标签这个项目标题里写的是“人物动物识别”但在落地时标签集往往比字面上的两类更复杂。最直接的做法是定义两类person和animal。这种做法简单粗暴但会把猫、狗、牛、羊全塞进animal这一个类里。优点是训练简单、类别混淆少缺点是animal类内部的形态差异巨大一只猫和一头牛的尺寸、纹理、宽高比都完全不同模型需要在一个类别里学出多模态分布收敛难度反而上升。另一个选择是把动物细分比如dog、cat、cattle、sheep、bird这种常见类别person单独一类。这样做会让类别数量增加但每个类内的特征一致性更好检测的精确率通常更高。当然类别多也意味着每个类需要更多样本否则个别类会欠拟合。我的建议是如果只是验证项目能不能跑用person和animal两类最快。如果要做成可交付的产品细分到具体动物类别并且把“人骑在马上”这类人兽同框的样本单独挑出来检查因为这种样本会让两个类的特征互相污染。数据里label的质量比数量更重要这一点值得反复强调。3. 把数据准备成yolov5能吃的样子目录结构、标注转换与数据集配置3.1 数据集目录结构与标签文件的排布yolov5对数据集的目录结构有固定预期虽然代码里可以通过参数指定不同路径但最稳妥的做法是直接按官方推荐的排布来组织。你需要准备images和labels两个顶层目录各自按train、val还有可选的test划分。这里要注意images和labels子目录名称必须严格一致比如images/train对应labels/train因为训练脚本是按路径拼接去找标签文件的。图片和对应的txt标签文件必须同名同前缀只是后缀不同例如图片是000001.jpg标签就是000001.txt。如果一张图没有目标对象标签txt可以留空但文件要存在否则训练时会出现FileNotFoundError。下面是一个最小可运行的目录结构示意dataset/ ├── images/ │ ├── train/ │ │ ├── 000001.jpg │ │ └── 000002.jpg │ └── val/ │ ├── 000101.jpg │ └── 000102.jpg ├── labels/ │ ├── train/ │ │ ├── 000001.txt │ │ └── 000002.txt │ └── val/ │ ├── 000101.txt │ └── 000102.txt └── data.yaml这段目录结构说明了两件事一是图片和标签严格分家二是train和val必须同时出现在images与labels下。很多人翻车是因为只建了images/train和labels/train没建val目录训练脚本在评估阶段找不到验证集路径直接报错或跳过验证阶段。3.2 用LabelImg或LabelMe转出YOLO格式txt数据标注工具常见的有LabelImg和LabelMe。LabelImg输出的是Pascal VOC格式的XML文件LabelMe输出的是JSON文件。YOLO格式需要的是归一化后的txt文本每行一条目标记录格式为class_id x_center y_center width height其中x_center、y_center、width、height全部除以图片宽高归一化到0到1之间。这里最容易出错的是中心点坐标很多人标注完习惯用左上角坐标转换时忘了加一半宽高导致所有标注框整体偏移。下面是一段将VOC格式XML转换为YOLO格式txt的常见脚本写法import xml.etree.ElementTree as ET import os def convert_voc_to_yolo(xml_path, out_path, class_map): tree ET.parse(xml_path) root tree.getroot() size root.find(size) img_w int(size.find(width).text) img_h int(size.find(height).text) lines [] for obj in root.iter(object): cls_name obj.find(name).text if cls_name not in class_map: continue cls_id class_map[cls_name] box obj.find(bndbox) x1 float(box.find(xmin).text) y1 float(box.find(ymin).text) x2 float(box.find(xmax).text) y2 float(box.find(ymax).text) dw 1.0 / img_w dh 1.0 / img_h w x2 - x1 h y2 - y1 cx x1 w / 2.0 cy y1 h / 2.0 lines.append(f{cls_id} {cx * dw:.6f} {cy * dh:.6f} {w * dw:.6f} {h * dh:.6f}) with open(out_path, w, encodingutf-8) as f: f.write(\n.join(lines)) class_map {person: 0, animal: 1} convert_voc_to_yolo(000001.xml, 000001.txt, class_map)这段代码把标注框的左上角和右下角坐标转成中心点加宽高的归一化格式。注意class_map需要与后续data.yaml中的类别顺序完全一致否则模型训练出的类别编号会错位推理时出现“识别的动物框打上了person标签”这类离谱现象。边界框坐标如果出现超出0到1范围的值通常是标注时框出了图片边缘可以在转换时做clamp。3.3 数据集配置文件data.yaml的写法data.yaml是训练脚本读取数据的入口包含路径、类别数和类别名三项关键信息。这里有一个高频踩坑点路径写法。train和val字段建议写绝对路径或者相对于yolov5项目根目录的相对路径因为命令行调用时工作目录不同相对路径容易失效。下面是一个标准的data.yaml内容train: /home/user/dataset/images/train val: /home/user/dataset/images/val nc: 2 names: [person, animal]train和val指向的是images子目录而非images父目录这一点要反复核对。nc必须与names列表长度一致否则训练脚本会在读取标签时直接报错。如果你用的是Windows系统路径建议用正斜杠或者双反斜杠raw字符串处理不好就会遇到转义问题。names里的类别顺序必须与标注时class_map的编号一致这是整个项目里最隐蔽的黑匣子之一一旦错位指标看起来正常但结果全错。4. 在本地把训练跑起来命令、参数与一次完整推理4.1 环境依赖与权重文件准备环境依赖是“可以直接运行”这句话最大的水分所在。yolov5对Python版本和PyTorch版本有兼容范围通常建议Python 3.8到3.10PyTorch 1.8到2.x之间。clone下项目后第一步是用requirements.txt安装依赖但这里有个细节不要直接pip install -r requirements.txt完事先确认CUDA版本与本机显卡驱动匹配。权重文件如果项目里已经附带了.pt文件直接放到项目根目录weights文件夹。如果没有需要从yolov5官方仓库的release页面下载对应版本常见的是yolov5s.pt。注意s、m、l、x后缀代表模型规模递增显存不够时用s版本起步最稳妥。缺少权重时训练会报错说找不到初始权重。4.2 训练命令与关键参数逐项说明跑训练的命令看似一行但参数组合决定了训练效果。下面这条命令是我最常用的起步配置python train.py \ --data dataset/data.yaml \ --weights yolov5s.pt \ --img 640 \ --batch-size 16 \ --epochs 100 \ --device 0--data指向配置文件--weights指定预训练权重--img控制输入分辨率普通场景640够用如果检测目标普遍很小可以调到768但会显著增加显存占用。--batch-size受显卡显存限制6GB显存跑yolov5s建议8到16之间。--epochs不要一上来就100先用50跑通流程。--device指定GPU编号只有CPU的机器写cpu但训练速度会慢到让你怀疑人生。训练过程中需要盯三个指标loss曲线、mAP曲线、验证集精度。如果loss在下降而mAP长期不动大概率是数据标注有问题比如标签框偏移或类别错标。如果loss直接NAN先把学习率调低一个数量级再试。训练完成后会在runs/train/exp目录下生成best.pt和last.ptbest.pt是验证集上表现最好的权重后续推理都用它。4.3 用训练好的权重做检测detect.py与最小推理脚本官方detect.py命令可以直接跑python detect.py \ --weights runs/train/exp/weights/best.pt \ --source dataset/images/val/000101.jpg \ --conf-thres 0.4--source可以指向单张图片、一个目录、一段视频或摄像头ID。--conf-thres是置信度阈值默认0.25偏低实际使用建议提到0.4到0.5之间否则会输出大量低置信度误检框。推理结果会保存到runs/detect/exp目录。如果想把检测集成到自己的Python脚本里YOLOv5提供了半抽象接口下面是最小可用的推理代码import torch from models.experimental import attempt_load from utils.general import non_max_suppression from utils.augmentations import letterbox import cv2 model attempt_load(runs/train/exp/weights/best.pt, devicecpu) img0 cv2.imread(test.jpg) img letterbox(img0, 640, stride32)[0] img img[:, :, ::-1].transpose(2, 0, 1) img torch.from_numpy(img).float() / 255.0 img img.unsqueeze(0).numpy() # 转为torch tensor并推理 with torch.no_grad(): pred model(torch.from_numpy(img).cpu()) result non_max_suppression(pred, conf_thres0.4, iou_thres0.45)这段代码里letterbox会保持宽高比将图片缩放并补边stride32必须与模型下采样倍数一致。non_max_suppression负责抑制重复检测框conf_thres与iou_thres的配合很关键conf太低会多框iou太高会让重叠目标被合并。CPU推理单张图大约在0.3到1秒之间如果觉得慢后续章节有导出与加速方法。5. 常见问题与避坑跑不起来、训不动、检不准的三类翻车现场5.1 pip装完依赖还是报ImportError先查环境隔离现象按requirements.txt装完所有依赖运行train.py时仍然提示ModuleNotFoundError。原因最常见的是你用了conda基础环境而pip把包装到了另一个Python解释器路径上。其次是PyTorch与CUDA版本不匹配安装的是CPU版torch但代码里调用GPU相关操作。解决用conda创建独立环境例如conda create -n yolo python3.9然后激活环境再逐项安装。安装torch前先确认CUDA版本用nvidia-smi查看驱动支持的CUDA再选择对应的torch安装命令。装完后用python -c import torch; print(torch.version, torch.cuda.is_available())验证。5.2 loss不降或NAN先查数据与超参现象训练到第20个epochtrain_loss一直维持在初始值附近波动或者直接变成nan。原因loss不降大概率是数据标签错乱或背景占比过高模型学不到有效梯度。出现nan多半是学习率太大、batch内存在异常标注框比如宽或高为0。解决先用官方COCO预训练权重跑一次训练确认代码链路没问题。然后抽查100张训练图片的txt标注写一段脚本把归一化坐标转回像素坐标画框可视化。学习率方面yolov5默认lr00.01如果数据量小于1000张建议降到0.001。宽高为0的标注框一出现立即检查标注工具是否在保存时生成了退化框直接删除该条记录。5.3 漏检误检反复出现置信度阈值与验证集是排查入口现象推理时同一张图上猫被框住了但狗没框住换个场景又反过来。原因大概率是验证集与训练集分布不一致或者推理时的conf_thres和训练时不一样。还有一种情况是图片分辨率与训练时差异过大模型没见过这种尺度。解决养成跑验证集的习惯不要只看两张样例图。用官方test.py脚本在val目录上跑评估得到每个类别的精确率和召回率。如果只有animal类召回率低说明animal类样本不够或特征多样性不足。推理时把conf_thres降到0.2看看有哪些候选框被过滤掉了如果确实存在正确但置信度低的框说明需要补充该场景的训练数据而不是硬调阈值。5.4 人物和动物互相误报类别定义与数据平衡是关键现象人骑马的图片被识别成一个人加一匹马的框没错但单独的马有时会打出person标签。原因标注样本里person与animal的框大小分布差异过大。比如animal大多是近距离大框person大多是远距离小框模型就会把“小尺寸动物”学成“远距离人类”。解决检查类别样本量比例差值超过3倍就要做数据平衡。给少量类别做数据增强比如翻转、旋转、随机裁剪以及复制粘贴同一类别的较小目标到其他图片中。每条数据增强操作建议在训练配置中用hsv_h、hsv_s、flipud等参数控制不要手工改动图片后再训练yolov5内置增强已经覆盖了大部分需求。另一个处理办法是把容易混淆的类别合并成animal一类牺牲细粒度换准确率。5.5 复现“可以直接运行”的最低环境清单把上面所有问题汇总成一句话与其相信“可以直接运行”不如自己建立一个可复现的基线环境。我的习惯是准备一份笔记记录以下内容Python版本、PyTorch版本、CUDA版本、显卡型号、显存大小、依赖安装时间与来源。换机器时按这份清单重建环境比一次次当场排查快得多。卸载重装是常用手段但不建议反复卸载系统级依赖用conda环境隔离才是真正的后悔药。此外建议把验证集固定下来不要每次随机切分否则每次评估结果波动会分不清是模型变好了还是数据集变了。6. 把模型调到能用的最后一公里验证、导出与部署技巧训练完不等于项目能交付还需要做三件事系统验证、格式导出、阈值校准。先做验证。不要只看best.pt在验证集上的mAP要单独统计每个类别的精确率和召回率并生成confusion矩阵。如果person被预测成animal的比例偏高检查两个类别的样本框宽高比分布必要时添加Specifically标注的难例样本。验证集至少要留出总数据的10%且保证每个类别都有覆盖。再做导出。yolov5权重默认是PyTorch格式的.pt文件部署到服务端需要转成TorchScript或ONNX。导出命令为python export.py --weights best.pt --include onnx --img 640ONNX格式可以用ONNX Runtime推理不需要依赖完整PyTorch框架部署体积会小很多。注意导出时--img必须与训练尺寸一致否则输入尺寸不匹配会导致推理性能骤降。如果部署环境是嵌入式设备还可以转成TensorRT引擎但这一步强依赖显卡型号换机器就得重新导出。最后校准阈值。用验证集跑一组不同conf_thres下的精确率和召回率画出PR曲线选一个两者相对平衡的阈值作为部署默认值。我个人习惯是把conf_thres设为0.45iou_thres保持0.45这个组合对人物动物场景相对稳妥但具体数值还是要以自己的验证集为准。最后一个习惯训练结束后把数据集切分种子、训练命令、超参数、验证结果记录下来下次想复现或调整时不会从头查起。项目源码和数据集都在本地跑通只是起点真正有价值的是你针对自己场景调优的那部分工作。希望帮到你。本文还有配套的精品资源点击获取

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑