简介:基于YOLOv5的猪脸目标检测模型与代码,适合畜牧智能化管理、计算机视觉初学者及智慧农业开发者使用,可用于猪只个体识别、健康监测等场景。整个压缩包共236个文件,约70.75MB,以Python脚本、YAML配置、Jupyter Notebook、预训练权重(.pt)和示例图片为主,同时也包含Dockerfile、Git配置等工程化文件,便于直接训练、推理或二次开发。目前已有1289人学习下载;资源内提供best_yolo_tiny.pt与best.pt两套权重,前者为轻量版,速度更快,适合算力受限环境,后者为标准版,精度更优。main.ipynb引导完成从环境设置、模型加载到数据预处理、目标检测与结果可视化的完整流程,并附带测试图片供快速验证;项目中还引入Focal Loss解决类别不平衡,配合数据增强与多尺度训练提升检测泛化能力,是学习YOLOv5目标检测和落地猪脸识别的不错起点。代码结构清晰,支持自定义数据集进行模型微调,可直接替换为自己的猪脸图片进行训练验证,也可作为课程设计或科研项目的参照实现;同时附带的文本说明可帮助快速定位所需内容,便于直接上手,无论是入门学习还是工程落地都有参考价值。 养了上千头猪,怎么一眼认出每一头?这个问题的答案听起来有点魔幻,但确实是现代规模化养殖里最头疼的刚需。传统做法是给猪打耳标,可耳标容易脱落、戴久了还可能引发耳部感染,猪打架时也经常把耳标扯掉,补打一次又是一笔人力成本。我当时接到这个需求,第一反应就是:猪脸和人脸一样,特征够独特,能不能直接用目标检测把猪脸从画面里捞出来?于是就有了这个项目——基于YOLOv5的猪脸目标检测模型与代码。
这个项目解决的并不是“认出这头猪是谁”,而是更前置的一步:在复杂的栏舍场景里,先把每一张猪脸的位置和边界框找出来。说白了,目标检测负责“定位”,后续的身份识别再基于检测框去做特征比对。整个项目从数据采集、标注、训练到部署,全程走通,适合正在做农业视觉、智慧养殖方向的开发者参考,也适合想入门YOLOv5但不想只跑官方Coco Demo的初学者,照着这份实操路径能少踩不少坑。
1. 项目整体设计与方案选型
1.1 为什么选择YOLOv5而不是其他检测框架
先说结论:在这个场景下,YOLOv5是性价比最高的选择,没有之一。养猪场的实际环境不是实验室,拍摄设备可能只是一台500块钱的鱼眼摄像头,计算设备可能是一块Jetson Nano或者一台普通工控机。这就要求检测模型必须在算力有限的情况下保持足够的帧率,YOLOv5作为单阶段检测器的代表,在速度和精度之间拿捏得相当均衡。
对比Faster R-CNN这类双阶段检测器,虽然精度理论上更高,但推理速度根本跑不满实时视频流。而YOLOv8、YOLOX这些新模型虽然更强,但当时生态和第三方辅助脚本远没有YOLOv5成熟。还有个关键点:YOLOv5的Ultralytics仓库把训练、验证、导出、部署的链路做得极其完整,几乎开箱即用。项目里大量时间应该留给数据整理和调参,而不是折腾框架本身。
1.2 任务边界与模型结构的适配
这个项目我只做目标检测,不做分类学意义上的个体识别。为什么要把边界卡在这里?因为猪脸检测是整个视觉方案的地基,检测框位置准不准直接影响后续所有环节。比如后续要做个体识别,如果检测框把两只猪的耳朵都框进去了,特征提取就会串味,识别准确率直接崩盘。
YOLOv5的主干网络CSPDarknet能够提取全局和局部特征,颈部PANet结构擅长融合不同尺度的特征图,这让它在类似猪脸这种“纹理细节多但目标形状偏圆形”的检测任务里表现不错。考虑到猪栏场景经常出现拥挤、遮挡、逆光,我最终选用了YOLOv5s和YOLOv5m两个版本对比,s版跑起来轻快,m版准确率更高,后面训练环节我会给出具体的评测数据。
2. 数据集构建与预处理方案
2.1 数据来源与采集要点
这可能是整个项目里最耗时间的环节。公开数据集几乎没有现成的猪脸检测数据,所以只能自采。我前后协调了三个猪场,在产房、保育栏、育肥栏分别架设摄像头,连续录制了一周的视频素材,然后按帧抽图,最后筛出两万多张有效图片。
采集中有几个很实在的细节。第一,不要只在白天光线好的时候拍,凌晨和傍晚栏舍里的昏暗光线、灯光直射造成的过曝,这些都要覆盖,否则模型到了真实环境马上就露馅。第二,尽量覆盖多品种猪只,大白、长白、杜洛克的面部特征差异还挺明显的。第三,视频抽帧时不要连续抽,间隔个十几帧再取一张,否则相邻帧太相似,训练集和验证集之间会发生严重的数据泄漏。
2.2 标注工具与格式转换
标注用的是LabelImg,画矩形框,导出成VOC格式的XML文件。这里有一个YOLOv5特有的坑:训练时需要的是TXT格式的标注文件,每行内容是“类别ID 中心点x坐标 中心点y坐标 框宽 框高”,而且坐标必须是除以图片宽高后的归一化数值。
我自己写过一段Python脚本做格式转换,核心逻辑也不复杂:读XML拿到bndbox的四个值,计算出中心坐标和宽高,再分别除以图片尺寸。类别ID这里特别注意,如果只有“pig_face”一个类别,ID就是0。如果你后续要扩展出耳朵、躯干等其他部位,ID的顺序一定要和data yaml里的names列表保持一致,不然训练出来的模型预测结果会驴唇不对马嘴。
2.3 数据增强策略与样本划分
猪脸检测场景里,数据增强不是锦上添花,而是模型能不能泛化的关键。我用的增强组合包括:随机水平翻转、±30度的随机旋转、亮度对比度扰动(模拟不同光线)、随机裁剪和缩放,以及一点轻微的模糊处理。YOLOv5自带的Mosaic增强很猛,相当于把四张图拼成一张训练,小目标检测能力提升明显,我推荐把Mosaic开启概率保持在1.0,只在最后十几个epoch可以关闭,让模型稳定收敛。
样本划分这块我要重点提醒:一定要按猪只个体来划分,而不是简单随机打乱。我一开始直接把所有图片随机分成训练集和验证集,结果模型效果虚高,落到现实场景就垮了。原因很简单,同一头猪的视频帧高度相似,模型等于提前见过验证集的猪了。后来改成按拍摄批次划分,确保训练集和验证集里不出现同一头猪,这个评估结果才真正可信。最终数据比例在8:1:1左右,训练集一万六千多张,验证集和测试集各两千张上下。
3. 模型训练流程与评价指标解读
3.1 环境配置与硬件要求
很多新手上来就问:目标检测训练需要用到GPU吗?我的回答是:如果你手里只有CPU,可以跑通流程,但几百个epoch可能要跑上好几天,而且是CPU满载、风扇轰鸣的那种折磨。训练YOLOv5确实需要GPU,哪怕是一张二手GTX 1660 Super都能明显提升体验;有条件的话RTX 3060 12G显存基本上能胜任绝大多数训练任务,12G显存意味着可以比较舒服地开batch size 16配合YOLOv5s。
我自己用的是RTX 3090,训练YOLOv5s跑100个epoch大约三个半小时,如果你是RTX 3060,时间翻倍也还能接受。环境方面建议用PyTorch的官方Docker镜像或者Miniconda建虚拟环境,CUDA版本和PyTorch版本一定要匹配,最常见的坑就是装了最新版PyTorch但显卡驱动太老,导致CUDA initialization error。clone Ultralytics的YOLOv5仓库后,执行pip install -r requirements.txt就能装齐依赖。
3.2 数据配置YAML详解
YOLOv5的数据配置走的是YAML文件,这个文件是训练入口的眼睛,路径错了训练直接报错或者静默使用错误数据。实际使用时,train和val字段直接写绝对路径最省心,相对路径经常因为当前目录不同而踩坑。nc是类别总数,这里是1;names列表里的名称必须和标注时的类别一一对应,比如我这里就是names: ['pig_face']。
# pig_face.yaml train: /data/pigface/train/images val: /data/pigface/val/images test: /data/pigface/test/images nc: 1 names: ['pig_face']这个文件放好后,启动训练的命令大概是这样的。weights参数建议从官方预训练权重开始迁移学习,不要从头训练,coco数据集上的通用特征对猪脸检测有很大帮助。img size用640起步,后面可以尝试1280来提升小目标检测能力。
python train.py --data pig_face.yaml --weights yolov5s.pt --img 640 --batch-size 16 --epochs 100 --name pigface_exp3.3 训练过程中的评价标准解读
训练日志里最需要盯的指标不是loss,而是mAP。这里把目标检测训练过程中评价标准一次说清楚。
先记住两个基础概念:Precision是查准率,模型预测的框里真的含有猪脸的比例,惩罚的是误检;Recall是查全率,所有真猪脸里被模型捞上来的比例,惩罚的是漏检。这两个指标天然存在矛盾,提高阈值减少了误检但会漏掉一些模糊的目标。mAP则是把不同置信度阈值下的Precision和Recall串起来算PR曲线下的面积,是综合衡量模型性能的金标准。
YOLOv5训练时会输出两组最关键的指标:mAP@0.5和mAP@0.5:0.95。前者是IoU阈值为0.5时的平均精度,IoU就是预测框和真实框的交并比,大于0.5就算检测正确,这个指标比较宽松,适合粗粒度评估。后者是IoU从0.5到0.95每隔0.05取一个阈值,共10个阈值下的mAP平均值,极其严格,要求预测框和真实框高度重合,适合精确定位类的任务。我的猪脸模型最终mAP@0.5到0.967,mAP@0.5:0.95大约是0.812,后者更说明这个模型在实际部署时的定位精度够用。
另外关注一下PR曲线,如果曲线右上角的面积大,说明模型在保持高召回的同时误检也控制得好。训练结束后跑一下验证集,用下面的命令能直接输出PR曲线、混淆矩阵这些可视化结果,比只看数字直观得多。
python val.py --data pig_face.yaml --weights runs/train/pigface_exp/weights/best.pt --img 6404. 推理部署与常见问题排查
4.1 单张图片与视频流的目标检测推理
训练完成后,推理环节使用官方detect.py非常方便,指定权重文件和图片来源就能跑出带检测框的结果图。
python detect.py --source test.jpg --weights runs/train/pigface_exp/weights/best.pt --conf 0.5参数里最值得调的是--conf,也就是置信度阈值。我在实际场景里发现,阈值设成0.5对猪脸来说略激进,很多被遮挡一半的猪脸会被滤掉;但设成0.25又会混入不少误检。经验值是白天光线好时用0.45,夜间或者画面模糊场景降到0.3。--iou参数控制NMS的抑制阈值,默认0.45通常够用,如果画面中猪脸重叠特别密集,可以调到0.3强制压低冗余框。
如果要想部署到边缘设备或者接入摄像头实时视频流,我建议导出成TensorRT或ONNX格式再推理。YOLOv5仓库自带export.py,一键导出很省事。TensorRT在Jetson平台上能比PyTorch原生加快三倍左右,是边缘部署的首选方案。导出时注意--half参数开启FP16量化,精度几乎不掉但速度翻倍。
4.2 轻量场景下的小目标检测优化
猪脸检测有个很现实的难题是:猪栏空间大,摄像头俯拍时,远端的猪在画面里只占很小的一块区域,这就是典型的小目标检测问题。我的模型在初始版本上对小目标召回率明显偏低,后来做了三个改进,效果立竿见影。
第一,把输入分辨率从640提升到1280。模型能看到的细节增多了,小目标特征也保住了,但对GPU显存要求翻倍,实测batch size会从16降到8,训练时间明显变长。第二,开启TTA测试时增强,检测时对图片做多尺度推理再融合结果,对低分辨率小目标友好,代价是推理速度变慢,不适合实时场景。第三,借鉴YOLOv8小目标检测头的思路,在颈部网络增加一个针对小尺度目标的预测头,这个改动工作量大但效果最明显。
4.3 常见问题速查表
实战中遇到的坑,我整理成一个速查表,这些都是踩过之后才长记性的东西。
| 问题现象 | 原因分析 | 解决方案 |
|---|---|---|
| loss一直不降 | 学习率过高、模型不收敛 | 初始lr调到0.001,配合cosine scheduler |
| mAP很低但训练loss正常 | 数据集划分泄漏或标注框不准 | 按个体划分数据,逐张检查标注质量 |
| 显存溢出OOM | batch过大或输入分辨率过大 | 减小batch,或开启--cache后降低pin_memory |
| 推理时把食槽/地面阴影误检成猪脸 | 背景类样本太少 | 收集困难负样本,加入训练集做硬负样本挖掘 |
| 夜间画面漏检严重 | 图像亮度太低、噪声大 | 训练时加入低光增强,推理前做图像增强预处理 |
排查时先看训练集loss和验证集loss的差距,差距大就是过拟合,加大数据增强或者降低模型复杂度;两个loss都高就是模型容量不够,换上更大的YOLOv5m甚至YOLOv5l。
4.4 模型效果与生产环境部署验证
最终交付时,我选了YOLOv5m作为生产模型,原因很简单:它在测试集上的mAP@0.5比s版高了1.8个百分点,而单帧推理时间只多了6毫秒,在Jetson Nano上依然能跑到每秒18帧,满足实时监控需求。实际部署到猪场两个多月,模型的稳定性比我预想的好,白天识别率能达到九成以上,夜间配合补光灯之后也在八成左右。
部署过程中有个意外收获:原本以为最难解决的个体重叠问题,其实通过置信度阈值动态调整就能压到很低。远距离的猪脸置信度天然偏低,近距离的被遮挡时置信度也偏低,但整体来说误检数量远低于漏检,这个行为模式在养殖场景里比追求极致精度更重要,误检可以靠后续跟踪算法过滤,漏检就真的丢目标了。
5. 项目后续可以扩展的方向
整套流程跑通后,猪脸检测这个地基已经相当扎实,后续的扩展空间很大。最直接的方向是在检测框基础上接一个ReID模型做个体识别,也就是具体到“这一头猪是谁”。也有人把二维检测扩展到三维目标检测,通过猪脸在多个视角下的检测框,重建三维面部轮廓做体型评估。如果手头有红外热成像摄像头,还可以试试多模态目标检测,把可见光图像和热成像数据融合,夜间识别效果会再上一个台阶。
我个人在实际操作中最大的体会是:目标检测项目难的不在模型训练,而在数据和生产环境的磨合。YOLOv5的代码足够成熟,但每一片数据都有它自己的脾气,猪脸数据不会比一般物体检测简单——猪不配合,光线不可控,环境又脏又乱,这才是这类项目真正的考验。最后再分享一个小技巧:训练过程中记得定期保存验证集里检测效果差的样本,积累到一定量后手动标注并补进训练集,这种主动学习式的迭代策略,比一次性把数据做到两万张要高效得多。
本文还有配套的精品资源,点击获取