尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
基于YOLOv5的猪脸目标检测实战:数据采集、模型训练到TensorRT部署
简介基于YOLOv5的猪脸目标检测项目以PyTorch为框架面向畜牧智能化管理场景可服务于猪只健康监测、个体识别与行为分析适配有一定深度学习基础并希望落地目标检测应用的开发者。压缩包共236个文件大小约70.75MB内含Python训练与推理脚本、YAML模型配置、Jupyter Notebook演示、预训练权重及测试图片等目录结构清晰便于按需检索与二次开发。包内提供best.pt标准模型与best_yolo_tiny.pt轻量模型两套权重可灵活适配高精度与低算力环境main.ipynb完整覆盖环境设置、模型加载、数据处理、目标检测与结果可视化流程借助附带示例图像可快速验证实际效果。模型引入Focal Loss、数据增强与多尺度训练等策略在小目标检测和类别不平衡问题上表现稳定既适合入门学习也便于后续针对养殖场景做调优目前已有1292人学习下载。1. 当目标检测遇上猪脸为什么YOLOv5仍是落地首选在做养殖场智能化方案时猪脸识别一直是个“看起来简单、做起来头大”的活儿。猪不像人不会配合你正脸对着镜头耳标遮挡、泥浆糊脸、栏位铁丝网挡视线都是家常便饭。用传统图像分类做换一头猪换个角度就废了用重型检测网络做边缘设备跑不动。而基于yolo-v5的猪脸目标检测模型与代码刚好卡在这个平衡点上——精度够用推理速度能上实时视频流模型体积也压得下来。这篇文章不是论文复述是我在实际项目里把YOLOv5用在猪脸检测上的完整记录。从数据集怎么整、模型怎么改参数到训练翻车怎么排查、部署到Jetson这类设备上要注意什么都会给到可直接抄的代码和配置。适合刚接触目标检测的开发者也适合已经在用YOLO但被猪脸这种特殊目标折磨过的工程师。有人问猪脸检测到底图什么最常见的是个体识别的前置步骤——先框出猪脸再做特征提取匹配身份用在精准饲喂、健康监测和行为分析上。也有直接拿检测结果做统计的比如清点栏内猪只数量。不管哪种用法YOLOv5这个起点都绕不开。2. 数据是猪脸检测的命门采集、标注与增强策略2.1 猪脸数据集的采集规范角度、光照与遮挡的取舍猪脸检测和通用物体检测最大的区别在于猪脸的类内差异小但姿态和遮挡变化极大。一个栏里的猪可能长得差不多但有的抬头、有的低头、有的侧脸对着镜头。如果数据集里全是正脸清晰图模型一上线就会被侧脸和半遮挡打懵。采集时我一般遵循几个硬性标准。角度方面至少要覆盖正脸、左右侧脸、俯视和轻微仰视四类光照方面养殖场大多是顶灯或自然光混合要分别采白天强光、傍晚暗光、夜间红外补光三种场景遮挡方面栏位栏杆、耳标、饲料槽边缘、另一头猪的耳朵压过来这些都要刻意采集。简单说宁可要1000张“脏图”不要500张“摆拍图”。一个容易忽略的点是视频抽帧。很多人直接用手机在栏外拍几张照片了事但猪是动的单帧照片捕捉不到运动模糊和姿态连续变化。我的做法是架好相机录5到10分钟视频然后按每秒2到3帧抽帧这样同一个体在不同姿态下的样本自然就有了。注意抽帧间隔别太短否则相邻帧几乎一样等于有效样本没增加。2.2 标注格式转换与清洗从LabelImg到YOLOv5的txtYOLOv5用的是归一化的txt标注格式每行是“类别id x_center y_center width height”坐标都是相对于图片宽高的比例值。而大多数人标注时习惯用LabelImg的VOC XML格式或者用CVAT导出COCO JSON。无论哪种来源都要转成YOLO格式。# 将VOC XML批量转为YOLO txt的脚本片段Python import xml.etree.ElementTree as ET import os def convert_voc_to_yolo(xml_path, out_dir, class_list): tree ET.parse(xml_path) root tree.getroot() img_w int(root.find(size).find(width).text) img_h int(root.find(size).find(height).text) out_lines [] for obj in root.iter(object): cls_name obj.find(name).text if cls_name not in class_list: continue cls_id class_list.index(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) # 归一化并转成YOLO格式 x_center (x1 x2) / 2.0 / img_w y_center (y1 y2) / 2.0 / img_h w (x2 - x1) / img_w h (y2 - y1) / img_h out_lines.append(f{cls_id} {x_center:.6f} {y_center:.6f} {w:.6f} {h:.6f}) if out_lines: with open(os.path.join(out_dir, os.path.basename(xml_path).replace(.xml, .txt)), w) as f: f.write(\n.join(out_lines))这段脚本的核心逻辑是把XML里的绝对像素坐标转成相对比例坐标。注意类别列表要和训练配置里的classes保持一致否则id错位会导致训练时标签全乱。转换完成后我习惯把所有txt文件打开抽查一遍重点看有没有坐标值大于1或者小于0的行——这是标注框出界或图片尺寸读取错误导致的。数据清洗是另一个容易被跳过的环节。猪脸检测里最常见的标注错误是框太大把脖子和耳朵根都包进去了或者框太小只框了鼻吻部。我的经验是猪脸判定框应该以眼睛到鼻吻部的区域为主体耳朵可以部分包含但不要包含整个头部和肩膀。这个标准要和标注团队对齐否则模型学到的特征就是“整头猪”而不是“猪脸”。2.3 数据增强的养殖场视角马赛克、HSV扰动与遮挡模拟YOLOv5自带的数据增强里mosaic和mixup是提升猪脸检测效果的两大功臣。mosaic把四张图拼在一起训练好处是让小目标比如远处栏位里的猪脸在训练中出现了更多次而且自然引入了上下文信息——模型能看到猪脸和周围栏舍的关系。# hyp.scratch-low.yaml 中与猪脸相关的增强参数参考 hsv_h: 0.015 hsv_s: 0.7 hsv_v: 0.4 degrees: 15.0 translate: 0.1 scale: 0.5 shear: 2.0 perspective: 0.0 flipud: 0.0 fliplr: 0.5 mosaic: 1.0 mixup: 0.2这里几个参数对猪脸场景特别关键。flipud我直接设0因为养殖场摄像头都是俯视或平视猪脸倒过来的情况几乎不存在开了反而产生无意义的负样本。degrees设15度而不是默认的更大角度因为猪脸姿态变化主要在水平方向垂直方向的旋转过大容易把猪脸扭曲成不真实的样子。hsv_v设0.4用来模拟早晚光照差异和泥浆覆盖导致的亮度变化。关于mosaic的补充说明我在训练后期会把mosaic关掉或降到0.3左右。原因是mosaic生成的合成图里猪脸可能出现一半属于A猪一半属于B猪的拼接情况在训练初期能增强鲁棒性但后期会让模型对真实场景的边界变模糊。这个“先开再关”的做法比全程开mosaic的mAP能高1到2个百分点。3. 模型训练全流程环境搭建、配置修改与效果验证3.1 YOLOv5环境搭建与预训练权重选择环境搭建的坑主要出在版本匹配上。YOLOv5的代码库更新频繁不同版本的requirements.txt对torch版本的要求不一样。我目前常用的组合是Python 3.9、PyTorch 2.0.1、CUDA 11.8。如果显卡是20系或30系这个组合兼容性最好如果是40系建议直接用官方最新的requirements。# 建议在conda虚拟环境里安装避免污染系统环境 conda create -n yolo5 python3.9 conda activate yolo5 git clone https://github.com/ultralytics/yolov5 # 拉取官方代码库 cd yolov5 pip install -r requirements.txt预训练权重的选择直接关系到猪脸模型的收敛速度。用COCO预训练权重做迁移学习是标准做法因为它已经学到了通用的边缘、纹理、形状特征。首次训练时在train.py里加--weights yolov5s.pt即可模型会自动从官方仓库下载权重文件。至于选s还是m还是l取决于你的硬件和推理要求。边缘设备上用s起步如果只是服务端做离线分析m或l的精度上限更高。3.2 数据集组织与训练启动从目录结构到第一个epochYOLOv5要求数据集按特定目录结构存放images和labels两个大目录各自再分train和val子目录。注意YOLOv5在训练时会实时读取图片做增强所以图片文件最好是原始高清图不要提前压缩JPEG质量保持在90以上即可。# 数据集目录结构示例 datasets/ pigface/ images/ train/ img_001.jpg img_002.jpg val/ img_101.jpg labels/ train/ img_001.txt img_002.txt val/ img_101.txt准备好数据集后需要写一个data yaml文件告诉训练脚本类别信息。我有一次踩了坑yaml文件里的train和val路径写的是绝对路径换机器训练时全乱了。后来统一改成相对路径从yolov5目录下运行train.py问题就再没出现过。# pigface.yaml train: datasets/pigface/images/train val: datasets/pigface/images/val nc: 1 names: [pig_face]启动训练的指令里有几个参数对猪脸场景要重点调。--imgsz我推荐640虽然输入更大精度会更高但显存占用和推理延迟会明显增加。--batch-size根据显存来定一般16G显存跑yolov5s可以到32。--epochs不要少于100猪脸这种类内差异小的目标模型需要足够多的epoch才能把细微纹理特征学进去。python train.py --data pigface.yaml --weights yolov5s.pt --img 640 --batch-size 32 --epochs 120 --device 03.3 训练中如何判断模型真的在学“猪脸”训练过程中在终端看loss曲线是最直接的反馈。YOLOv5的loss包含三部分box_loss框回归误差、obj_loss目标置信度误差、cls_loss分类误差。猪脸检测是单类别所以cls_loss前期降到很低是正常的重点盯box_loss和obj_loss。我习惯在训练到30到50个epoch后用--save-period 10设置每10轮保存一次权重文件然后手动用这些中间权重去测试几张“困难样本”比如泥浆遮挡的、侧脸的。有些模型final.pt的整体指标好看但边界案例上翻车反而是某个中间epoch的权重更对路。这也算是跑猪脸项目的一条血泪经验——别迷信最终的mAP数值要看实际检测框的稳定性和贴合度。4. 猪脸检测模型落地的三个必调参数与推理加速4.1 置信度阈值和NMS参数的现场调优训练完模型放到现场跑视频流时第一个要调的不是网络结构而是置信度阈值和NMS阈值。YOLOv5的detect.py里默认conf_thres是0.25这在猪脸场景下往往不够用。养殖场画面里远处栏位的猪脸只有20到30像素大小模型会给出大量0.3到0.5置信度的模糊检测框而近处猪脸能到0.9以上。把阈值设0.25结果就是满屏误检框。我一般把conf_thres调到0.45到0.55之间同时把iou_thresNMS的IoU阈值从默认的0.45降到0.3。原因在于猪脸之间不会像人群那样密集重叠两个框如果IoU超过0.3基本就是同一个目标的重复框NMS保守一点反而更干净。这两个参数配合调整误检率能下降一半以上。# 推理命令中直接指定阈值 python detect.py --weights runs/train/exp/weights/best.pt --source test_video.mp4 --conf-thres 0.5 --iou-thres 0.3 --img 6404.2 输入尺寸与批量推理的取舍现场部署时输入尺寸是精度和速度的博弈点。用640训练但用480推理速度能提升30%左右精度损失在猪脸这种中尺寸目标上并不明显。原因是猪脸在监控画面里通常占据几十到上百像素不是极端小目标降到480仍然足够。如果摄像头是俯拍远景猪脸只有几十像素那就老老实实保持640甚至768。批量推理常被忽略。如果用服务端GPU做多路视频流分析把多帧拼成batch一次推理吞吐量可以翻倍。detect.py默认batch是1我在服务化部署时改成batch等于4或8用TensorRT做优化后单卡同时跑4路1080p视频流没有问题。要注意的是batch增大后显存占用也增大别把显卡搞到OOM。4.3 TensorRT导出从PyTorch权重到engine文件把YOLOv5模型部署到Jetson或工业相机上ONNX只是中间态最终要导出成TensorRT的engine文件才能榨干硬件性能。导出过程有几个坑必须说清楚。# 从PyTorch导出ONNX注意opset版本 python export.py --weights runs/train/exp/weights/best.pt --include onnx --opset 12 --simplify # 用trtexec把ONNX转成TensorRT engine trtexec --onnxbest.onnx --saveEnginebest.engine --fp16 --workspace2048fp16模式下精度损失在猪脸检测上基本可以忽略但速度和显存都改善明显。workspace不是越大越好2024年后的TensorRT版本对workspace参数有新语法比如用--memPoolSize如果直接用旧命令报错去掉workspace参数改用默认值即可。5. 猪脸检测避坑指南五个常见问题与排查方法5.1 训练loss不降或震荡过大现象训练了50个epochbox_loss还在0.1以上波动完全不收敛。原因最常见的是学习率设置不合理和数据标注存在大量不一致。YOLOv5默认的lr0是0.01但如果你用小batch比如8或16实际学习率会偏低。还有就是标注框的size分布差异太大有的框是10像素的远距离猪脸有的是200像素的近景正面模型无所适从。解决先检查标注数据的框宽高分布把极端值过滤掉然后把batch加大到32或64同时把--cos-lr打开让学习率余弦衰减后期微调更平滑。如果还不收敛把预训练权重换成yolov5m容量更大拟合能力更强。5.2 把耳朵当成猪脸检测出来了现象推理结果里出现大量只包含耳朵的检测框置信度还不低。原因标注阶段把部分只露耳朵的猪头图片也标成了正样本。猪脸检测的本质是“找脸”耳朵单独出现时应该有明确判别力但标注员看到“猪头”就顺手标了。解决把这类样本从训练集中剔除或者在标注规范里明确“必须同时看到眼睛或鼻吻部才算猪脸”。如果已经训练完了可以通过降低conf_thres来缓解但根治还是在数据端。5.3 夜间红外模式下检测率骤降现象白天mAP到0.85晚上红外画面下直接掉到0.4。原因训练集里红外图像占比太少或者红外图没有单独标注。YOLOv5的预处理包含灰度归一化但红外图的纹理特征和白天的RGB图差异很大模型没见过就是不会。解决单独采集一批红外视频帧按至少20%的比例混入训练集。另外把hsv_h的数据增强在红外图上关闭——红外图几乎没有色彩信息hsv扰动会引入错误的颜色噪声。5.4 视频流检测出现严重卡顿和跳帧现象GPU利用率不高但视频流就是跑不满25帧。原因多数时候不是模型慢而是前后处理拖后腿。OpenCV的imread是同步阻塞的解码一帧等一帧还有人在detect循环里做imwrite保存结果图磁盘写入卡住了整个流程。解决用多线程把解码、推理、编码拆开。我这里给一个简化方案解码放子线程主线程只做推理结果放进队列另起线程做显示或上传。最关键的是不要在原图上画框后再传给下一步而是传递坐标数据。5.5 同栏猪只粘连导致漏检现象多头猪挤在一起时中间几只没有被框出来。原因NMS在检测框密集重叠时会把低置信度框抑制掉。猪靠在一起时中间的猪脸被两侧的猪头遮住一部分置信度天然低于两侧。解决把iou_thres调低到0.2到0.25同时训练时增加“多头猪挤在一起”的样本比例让模型学会在遮挡情况下仍然给出完整猪脸的框。最后后处理里加一个针对猪栏区域的网格计数逻辑用空间先验补齐漏检效果也很明显。6. 换头技巧用关键点回归把“检测猪脸”变成“认猪身份”检测框本身拿来做“数猪”是够的但很多找我的人真正想要的是个体识别——认出来镜头前这头猪是谁。我的建议是别直接用YOLOv5的分类分支做这件事因为同栏猪长得太像分类分支扛不住。更稳的做法是两步走先用YOLOv5把猪脸框出来再把框内图像送给一个小型关键点网络回归出眼睛和鼻吻部的坐标然后用这些关键点做几何归一化最后才做特征匹配。关键点回归的好处是它能规避猪脸角度变化对身份特征提取的干扰。猪脸侧面时像素分布是完全不同的但眼睛到鼻吻部的距离比例是稳定的。我有一次测试里只用关键点归一化这一个改进就比直接对检测框图片做特征提取的Top-1识别率高了接近10个百分点。网络不用大一个轻量级的卷积网络就够了输出4个值左眼x、y和右眼x、y或者换成眼睛鼻尖三点。# 关键点回归的一个简单训练头示例 import torch.nn as nn class KeypointHead(nn.Module): def __init__(self, backbone_out512): super().__init__() self.fc nn.Sequential( nn.Linear(backbone_out, 256), nn.ReLU(), nn.Linear(256, 4) # 输出左眼(x,y)和右眼(x,y) ) def forward(self, features): return self.fc(features)训练时注意关键点坐标要归一化到0到1之间和检测框的尺寸保持一致。损失函数用Smooth L1比MSE更稳因为猪脸边界框可能包含少量非脸部区域Smooth L1对离群点不那么敏感。关键点网络训练好后推理流程是YOLOv5出框 → 截取猪脸区域 → 关键点网络出左眼和右眼坐标 → 旋转变换成正脸 → 送进特征提取网络做身份匹配。这个“检测关键点特征匹配”的pipeline是我目前最推荐的落地方案也是我自己在多个模拟项目里反复验证过的路径。如果只是做检测统计猪数前面第4章的调优已经够用如果要进一步做精准饲喂和健康档案那这个换头方案几乎是必须的。靠着关键点带来的姿态归一化后续的识别模型才能稳定工作不会因为猪转头就被认错。最后分享一个教训模型在实验室测试集上mAP再好看都不如去猪栏边蹲一小时看得清楚。我在一个模拟项目里训练集全是干净的正脸图测试集mAP 0.9结果现场一开视频流风吹动料槽的影子都在框框。后来把现场那段视频抽了500帧重新标注加入训练集才真正把误检压下去。数据永远比模型结构更值得投入这个道理在猪脸检测上体现得淋漓尽致。希望帮到你。本文还有配套的精品资源点击获取
RELATED

相关推荐

Python利用支持向量机SVM进行时间序列预测:数据+源码实战

Python利用支持向量机SVM进行时间序列预测:数据+源码实战

简介:这份资源面向希望用Python实现时间序列预测的开发者与数据分析学习者,聚焦支持向量机(SVM)在回归预测场景中的落地应用。包内共2个文件,包含1个py源码与1个xlsx数据文件,压缩包约34KB,源码…

📅 2026/10/11 17:46:52
AI Toolbox Skills 技能管理完整教程:从 Git 安装到按工具同步,一键搞定

AI Toolbox Skills 技能管理完整教程:从 Git 安装到按工具同步,一键搞定

【免费下载链接】ai-toolbox Personal AI Toolbox 项目地址: https://gitcode.com/gh_mirrors/aitoolbo/ai-toolbox 点击查看 免费下载 AI Toolbox 是一款跨平台个人 AI 工具箱,其中的 Skills 技能管理模块可以帮你把 AI 编程技能从 Git 仓库或本地目录…

📅 2026/10/11 17:46:52
Postgres主从流复制+pgpool高可用方案:从WAL原理到Failover实操

Postgres主从流复制+pgpool高可用方案:从WAL原理到Failover实操

简介:一份针对 PostgreSQL 高可用架构的完整方案文档,面向数据库运维与架构设计工程师,重点解决基于 WAL 流复制搭建主从库、实时数据同步,以及结合 pgpool-II 实现连接池管理、读写分离与故障自动切换的问题。文档详细介绍了同步…

📅 2026/10/11 17:41:52
MORE NEWS

更多资讯

📰

PyTorch人脸表情识别实战:从CNN训练到OpenCV实时部署

简介:基于 PyTorch 的卷积神经网络人脸面部表情识别项目,面向深度学习和计算机视觉初学者及实战开发者,覆盖人脸检测、表情分类到模型训练评估完整流程。利用 PyTorch 动态图优势,结合数据增强与可视化工具,便于灵活调…

📰

农作物病虫害识别毕设避坑指南:从数据清洗到模型训练全解析

简介:面向高校毕业设计及课程项目的深度学习应用资料包,围绕常见农作物病虫害识别任务,提供从图像数据收集、视觉显著性处理、卷积神经网络构建到系统部署的完整方案,尤其适合计算机视觉、智慧农业方向的学生用于课题研究、代码复…

📰

PyTorch实战:STGCN时空图卷积网络实现与调优

简介:基于PyTorch的STGCN时空图卷积网络实现代码,源自IJCAI 2018论文官方实现,面向从事人体行为分析、骨骼动作识别等方向的研究者与开发者,可用于视频监控、人机交互、医疗康复等场景的时空特征建模。压缩包共12个文件&#xff0…

📰

Wind取数到Fama-French因子复现:Python与statsmodels实战

简介:这份压缩包聚焦法玛-弗伦奇三因子与五因子模型的 Python 实现,面向金融量化研究入门者、金融工程学生以及需要实证资产定价的从业者。内容围绕 Wind 金融终端数据接口,覆盖因子数据获取、pandas 数据清洗、statsmodels 多元回归建模及结…

📰

PyTorch CIFAR-10图像识别实战:从环境搭建到95%+准确率调优

简介:这份资源面向深度学习入门者与计算机视觉方向的初学者,围绕PyTorch框架与CIFAR-10数据集,提供一套可直接运行的图像识别实践材料,帮助读者理解卷积神经网络从数据加载到模型训练、再到权重复用的完整链路。压缩包共5个文件&a…

📰

深入理解Linux进程退出、等待与替换机制

如果你学过几天 Linux 系统编程,一定写过或看过这样的代码:fork 出一个子进程,然后在子进程里调用 exec 家族函数去跑另一个程序,父进程再用 wait 等着收尸。但很多人写是写出来了,心里其实没有完全搞清楚这三步各自在…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬