news 2026/10/11 17:46:43

基于YOLOv5的猪脸目标检测实战:数据采集、模型训练到TensorRT部署

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
基于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的txt

YOLOv5用的是归一化的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 python=3.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 数据集组织与训练启动:从目录结构到第一个epoch

YOLOv5要求数据集按特定目录结构存放: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 0

3.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_thres(NMS的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 640

4.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 --onnx=best.onnx --saveEngine=best.engine --fp16 --workspace=2048

fp16模式下精度损失在猪脸检测上基本可以忽略,但速度和显存都改善明显。workspace不是越大越好,2024年后的TensorRT版本对workspace参数有新语法(比如用--memPoolSize),如果直接用旧命令报错,去掉workspace参数改用默认值即可。

5. 猪脸检测避坑指南:五个常见问题与排查方法

5.1 训练loss不降或震荡过大

现象:训练了50个epoch,box_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_out=512): 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帧重新标注加入训练集,才真正把误检压下去。数据永远比模型结构更值得投入,这个道理在猪脸检测上体现得淋漓尽致。希望帮到你。

本文还有配套的精品资源,点击获取

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/11 17:44:38

容器挂载点全攻略:从数据丢失事故到Kubernetes存储实践

凌晨两点,告警电话把我从睡梦中拽了起来。某服务的数据全丢了,原因说出来有点丢人——部署时把数据写在了容器可写层,没有挂载任何持久化目录,容器一重建,一切归零。那次事故之后,我把"容器挂载点&quo…

作者头像 李华
网站建设 2026/10/11 17:41:28

Happier API参考深度指南:HTTP端点与认证流程完全解析

【免费下载链接】happier Web, Desktop & Mobile client and orchestrator for Codex, Claude Code, OpenCode, Pi, Cursor, Grok, Antigravity, Kimi, Augment Code, Qwen, fully end-to-end encrypted 项目地址: https://gitcode.com/gh_mirrors/hap/happier …

作者头像 李华
网站建设 2026/10/11 17:40:50

Java AI测试桩:可调试、可断点、可故障注入的AI接口模拟器

简介:本资源是一个基于Java实现的轻量级AI实验项目,面向编程初学者与AI入门学习者,聚焦终端交互式游戏场景中的决策逻辑实践。项目模拟参与名为“Houses”的命令行游戏,通过预设策略或状态机完成游戏响应,帮助读者理解…

作者头像 李华
网站建设 2026/10/11 17:38:51

AI科技热点日报 | 2026年10月10日

文章目录 AI科技热点日报 | 2026年10月10日 📌 今日摘要 一、OpenAI 上线 GPT-6.1 Sol Ultrafast 极速模式,推理速度最高 8 倍 事件概要 来源 / Sources 二、谷歌云发布通用智能体 Gemini Agent,企业级 Agent 平台再升级 事件概要 来源 / Sources 三、Figure AI 发布第三代…

作者头像 李华
网站建设 2026/10/11 17:35:34

Claude Code项目级配置详解:用settings.json与CLAUDE.md管好AI助手

如果你已经把 Claude Code 跑起来了,大概率会遇到一个尴尬:每次开新会话都要重新叮嘱它“我们项目用 pnpm,别用 npm”“有个生成脚本要先跑一下”“改代码之前先看架构文档”。说得多了,AI 还是偶尔犯浑,明明上一轮说好…

作者头像 李华
网站建设 2026/10/11 17:34:45

识别恶意网络流量,SOC 流量分析实战练习

识别恶意网络流量,SOC 流量分析实战练习 免责声明:本文所描述的流量分析方法、恶意流量识别思路、工具操作仅用于企业 SOC 安全运营、授权范围内安全演练、网络安全学习。禁止利用本文技术实施未授权网络抓包、流量窃听、网络攻击行为。任何未经授权对网…

作者头像 李华