资讯动态

基于YOLO11与HAFB-1的羊品种识别系统改进实践

发布时间:2026/10/20 11:58:46 来源:尧图企业网站定制
羊品种识别这事看着像是养殖场里的一个小需求做起来才知道坑不少。我一直用YOLO系列做目标检测但今年想完成五个羊品种的分类发现光靠默认的YOLO11分类模型还是差口气。于是我在YOLO11的基础上加了一个轻量特征增强模块HAFB-1把分类准确率从91%左右拉到了95%以上。这篇文章把从数据整理、模型改到部署落地的完整过程都捋一遍尤其适合正在做畜牧视觉识别、或者想在YOLO11上做模块级改进的开发者参考。1. 这个识别系统到底要解决什么问题1.1 羊品种识别为什么不能简单套用目标检测很多人对羊品种识别的第一反应是“这不就是个图像分类吗随便用个ResNet不就行了”。实际操作后会发现养殖场里的羊不可能像标准数据集那样端端正正站在画面中央。羊是群居动物镜头里经常出现一堆羊挤在一起、身体相互遮挡、头部朝下吃草、背毛被泥水弄脏等情况。用普通分类网络输入的是整张图背景里的围栏、地面、水槽全都会参与特征计算最后模型很可能是靠背景颜色和环境光去区分品种而不是靠羊本身的特征。这一点在测试集上尤其致命换一个养殖场准确率能掉十个点。所以这个系统的核心定位不是“看图识羊”而是在复杂场景下对单只羊的区域做品种判断。也就是说先检测出每一只羊的位置再对每只羊的边界框区域做品种分类。这也是我最终选择在YOLO11上做改进的原因YOLO11自带回归框和分类头能同时完成定位与分类天然契合这个任务。如果只用分类网络我还要额外接一个检测器两套模型串联延迟和误检都会叠加现场体验会很差。1.2 YOLO11作为基座模型的底气YOLO11在2024年下半年发布后我第一时间在几个公开数据集上跑了跑发现它在检测精度和推理速度上比YOLOv8有可感知的提升。具体到结构层面YOLO11把Backbone里的C2f换成了C3k2这个模块通过不同尺寸的卷积核提取多尺度特征同时用残差结构避免深层梯度消失在Neck部分引入了C2PSA把自注意力机制放进特征金字塔里对全局上下文信息的捕获能力比过去更强。这些改动使得YOLO11在相同算力下小目标检测能力比YOLOv8提升不少。羊只识别里有一个现实难题远处的羊在画面中可能只占几十个像素。YOLO11的SPPF结构在降维时保留了原始特征的统计信息配合多尺度特征融合对小目标相对友好。不过我用默认YOLO11做了几组尝试后发现它虽然在检测框上表现不错但分类分支对相似品种的辨识度不足。比如蒙古羊和小尾寒羊从脸部和耳朵轮廓上能看到差别但模型给出的特征区分度不够经常把这两个品种混在一起。于是我想在不大幅增加参数量的前提下给YOLO11加点“看细节”的能力HAFB-1就是为了这个目的设计的。1.3 HAFB-1从哪来要干什么HAFB-1的全称是Hybrid Attention Feature Booster version 1直译是“混合注意力特征增强模块第一版”。叫“第一版”是因为后续大概率还要迭代。它的设计思路很简单羊品种分类比通用目标检测更依赖局部细节比如耳朵是否下垂、毛色分布、面部花纹、角型差异这些特征往往只占整只羊的一小块区域。如果网络一视同仁地处理整个特征图这些细节很容易被背景和大面积毛色淹没。HAFB-1要做的就是两件事第一告诉网络该把注意力放在哪些特征通道上第二在空间维度上突出关键区域抑制围栏、地面这类背景干扰。它不像某些注意力模块那样动辄几十层而是做成一个即插即用的轻量模块可以像搭积木一样塞进YOLO11的主干与检测头之间。这套方案的好处是不用重新训练整个大模型也能让原有模型在细节敏感任务上明显提升。我在后面的章节会详细拆解模块内部结构。2. 数据准备比模型更重要2.1 五种羊的品种特征与拍摄场景我选定的五个羊品种分别是蒙古羊、哈萨克羊、藏羊、小尾寒羊和湖羊。选择这五个品种不是因为它们长得差别很大而是因为它们在毛色、体型、耳朵形态上存在互相交叉的相似点正好能检验模型的细粒度分类能力。蒙古羊整体偏瘦头面部多为暗褐色尾巴呈肉质脂尾公羊有角哈萨克羊看着更粗壮耳朵较大且半下垂毛色杂色比例更高藏羊生活在高寒地区体格硬朗被毛厚而粗角呈螺旋状面部颜色深小尾寒羊是明显的大耳朵耳垂很显眼尾巴短小毛色多为白色湖羊则脸部狭长耳大下垂最明显的特点是四肢细长、被毛紧密成年羊几乎没有角。这些特征如果只看文字很好区分但放到真实照片里毛色受光照影响后相近轮廓也容易被遮挡视觉差异就变得模糊了。我在构建数据集时刻意收集了不同季节、不同距离、不同天气下的照片。夏天羊剪毛后和冬天厚毛时的体态差异很大如果不把这类样本加入训练集模型在换季时几乎必定翻车。每类我最终保留了约1200张有效图片总共6000张其中一部分来自养殖场现场拍摄一部分来自公开的畜牧图像数据还有少量是从视频片段里抽帧得到的。2.2 数据集组织与标注细节这个项目做的是单品种分类但实际流程需要目标检测框所以标注时我用检测框把每只羊框出来再为每个框打上品种标签。如果直接用图片级分类标签会导致一张图里五六只羊只有一种标签其他羊被当成背景噪声训练出来的模型对群羊场景几乎无解。标注工具我用的LabelImg和CVAT二者都支持YOLO格式。这里必须提一个容易踩的坑数据集中不能只看全羊照片必须加入大量“大头照”和“局部照”。因为推理时检测框往往只框住了羊的躯干加头部而很多公开数据集里的分类样本是整只羊站在草地里的完整图片。如果训练时模型看到的都是完整羊推理时输入却只有半截羊分布完全不一致。我在第一批实验里没有注意这一点验证集准确率到了94%实际一检测就掉到80%后来重新检查输入尺寸才发现问题。标注时还要注意品种特征的可辨别性。相同品种的羔羊和成年羊外形差异巨大我额外对每个品种增加了 10% 的羔羊照片防止模型把“体型小”误判成“某个品种的特征”。另外羊只被严重遮挡时我会先删掉框面积小于整图5%或者遮挡面积超过30%的样本这些样本会让模型学出错误特征。2.3 图像增强策略的取舍数据增强在这个任务里不是可有可无而是决定模型泛化能力的关键。我使用的训练增强包括Mosaic、MixUp、HSV色域增强、随机平移缩放和水平翻转。Mosaic把四张图拼接成一张能有效增加框内目标的数量和背景多样性尤其适合解决养殖场里羊只密集的问题。MixUp则让模型在样本间做线性插值抑制对单一背景的过拟合。HSV增强我单独提出来说原因是羊的毛色对光照极其敏感。同一只蒙古羊在早晨和中午的相机图像里RGB值能差出40以上。我把饱和度随机调整了0.5倍到1.5倍亮度调整了0.6倍到1.4倍这样模型不会死记颜色绝对值而是学会看颜色相对关系。水平翻转对羊品种识别完全可行因为羊没有明显的左右不对称特征翻转后标签不变样本量直接翻倍。不过增强也不是越猛越好。我试过加入随机旋转90度效果反而下降因为羊站立的姿态有很强的“正立”先验旋转后会打乱神经网络对躯干朝向的认知。还有一次我把RandomErasing的覆盖比例调到0.4导致大量关键耳朵区域被涂黑模型被迫靠背景判断品种。最终只保留小比例擦除用在训练后期防止过拟合。我的原则是任何增强操作不能破坏品种关键判别区域的可读性否则就是无效增强。3. YOLO11-HAFB-1模型结构拆解3.1 YOLO11的结构认知我用的YOLO11基座是官方预训练的分类模型输入尺寸设置为640×640。虽然目标检测模型通常在COCO上预训练但针对分类头微调时直接用ImageNet预训练的分类权重作为初始化更合适。YOLO11的整体结构可以分成三块Backbone、Neck和Head。Backbone的作用是逐层提取图像特征从浅层的边缘纹理到深层的语义信息。YOLO11在这部分用了C3k2模块相比C2f它把不同分支的卷积核尺寸做了差异化这有助于捕获大小不一的羊群目标。Neck部分负责多尺度特征融合把深层的高语义特征与浅层的空间细节拼接起来。Head部分输出最终的检测框和类别概率。HAFB-1我插在Backbone提取到顶层特征图之后、Neck进行特征融合之前。这个位置很讲究经过SPPF之后的特征图已经有了全局的语义信息但同时也丢失了部分局部细节。如果我把模块插得太浅它会处理分辨率过高的特征图参数量和计算量都会爆炸插得太深又起不到细节增强作用。放在SPPF后面能让模块同时接触到全局感受野和较紧凑的特征尺寸效率与精度比较平衡。3.2 HAFB-1模块的详细设计HAFB-1的结构我不搞花哨只用了三个子模块通道注意力、空间注意力、残差连接。整个模块的输入是一张特征图首先经过通道注意力分支压缩空间维度得到每个通道的权重再与原始特征图逐通道相乘让网络知道哪些通道对品种分类更重要。这一步实际上是在做特征筛选把毛色、角型相关的通道放大把背景纹理相关的通道压低。然后是空间注意力分支对输入特征图在通道维度上做平均池化和最大池化拼接后经过一个7×7卷积生成空间权重图。这个权重图与通道加权后的特征图相乘得到突出关键空间区域的输出。空间注意力能显著提升对耳朵、角、面部这类小区域的响应。为了避免深层网络退化我把输入特征图直接与输出相加形成残差连接这样原始YOLO11学到的能力不会因为加了模块而丢失。不少人会问为什么不直接用Transformer或者大核注意力我在这里选了传统卷积加注意力的组合原因有三个第一养殖场边缘设备的算力普遍有限部署设备大多是车载或轻量工控机模型参数每多一兆延迟就会多出不少第二羊品种数据集并不像ImageNet那样庞大复杂大模型容易过拟合小模块正好匹配数据规模第三通道空间注意力是个被反复验证的成熟范式不需要在工程上冒险。HAFB-1的总参数量只有不到0.8M对YOLO11整体约2.6M的参数来说增加约30%换来2%以上的准确率提升性价比是值得的。3.3 训练配置与超参数选择训练用的GPU是单块消费级显卡显存12GBbatch size设成了16。输入图尺寸640如果显存吃紧可以降到512但会损失小目标精度。优化器我选了AdamW初始学习率0.001权重衰减0.0005这个组合在我过去几个鲁棒视觉项目里都比较稳。训练总轮数300轮前50轮做预热采用余弦退火调度把学习率从0.001逐渐降到0.00001。损失函数这里要展开说一下。YOLO11默认的分类损失是交叉熵但对羊品种数据不同品种的样本数量虽然不是极端不平衡却存在“易分与难分”差异。比如湖羊特征明显很容易分对蒙古羊和小尾寒羊则容易混淆。直接全用交叉熵模型会过分关注易分样本难分样本学不到位。我在分类头里把Focal Loss的gamma设置为1.5让模型把更多梯度分配给分类置信度不高的样本。这个改动导致准确率提升了0.8个百分点左右非常明显。还有一个细节是冻结训练。前100轮冻结Backbone参数只更新Neck、Head和HAFB-1。这样做的原因是预训练权重已经能提取通用轮廓特征冻结可以避免早期训练噪声破坏它到100轮后再解冻Backbone用较小学习率对全部参数微调。实测下来这个策略比从头训练整个网络稳定不少最终验证集准确率为95.8%。如果一开始就全参数训练很容易在第30轮左右出现过拟合征兆。4. 实验结果与性能对比4.1 评价指标与验证集设置模型评测我重点关注Top-1准确率、每个品种的精确率、召回率、F1值以及混淆矩阵。验证集从6000张图里按8:1:1切分训练4800张验证600张测试600张。切分时我做了群体分组确保同一只羊的连续帧不被同时分到训练和测试里否则会出现数据泄漏高估模型效果。我额外保留了一个“现场挑战集”里面是黄昏、雨天、羊只密集、部分遮挡的200张图。最终测试集准确率是95.8%现场挑战集准确率是89.5%。这个差距说明模型在复杂环境下仍有提升空间但也证明了整体方案不是只在理想数据上好看。为了方便对比我把YOLO11原始模型的通道、深度保持不变只新增HAFB-1模块保证变量单一。4.2 对比实验与消融分析我做了四组对比实验原版YOLO11、YOLO11仅通道注意力、YOLO11仅空间注意力、YOLO11-HAFB-1完整版。每组都使用相同的数据划分和训练策略这样结果才有参考价值。最终数据如下表所示模型测试集准确率现场挑战集准确率参数量YOLO11 baseline93.1%84.0%2.6MYOLO11通道注意力94.0%85.8%3.0MYOLO11空间注意力93.7%85.2%3.1MYOLO11-HAFB-195.8%89.5%3.4M可以看出单独加通道注意力或空间注意力都有提升但幅度有限。完整版融合两者后不仅在测试集上提升了2.7个百分点现场挑战集的提升更是达到了5.5个百分点。这说明通道注意力和空间注意力之间存在互补关系前者解决“看什么特征”后者解决“在哪里看”只有组合起来才能在复杂场景中发挥作用。消融实验里我还尝试把HAFB-1放在不同位置分别试过插入C3k2后和直接放在Neck输出前。结果放在SPPF之后效果最好准确率高出0.9个百分点。原因是SPPF输出特征图尺寸较小模块面向的是全局语义而Neck输出前的特征图分辨率较高但语义信息已经融合过头细节增强的收益被掩盖了。4.3 错误样本与混淆案例分析从混淆矩阵看错误主要集中在蒙古羊与小尾寒羊之间这两类互相误判的比例占了总错误的45%。我翻看错误图片发现被误判的样本大多是羊背对着相机耳朵特征看不见只能靠毛色和体态判断。蒙古羊被剪毛后外观与小尾寒羊确实很接近。针对这个问题我补充了约200张这类“难样本”加入训练数据又把损失函数里的gamma提高到2误判率才有所下降。还有一类错误来自湖羊它被误判成哈萨克羊的案例也不少原因在于湖羊的耳大下垂特征与哈萨克羊部分个体重叠。这提示我单纯靠耳朵形态不足以完全区分可能需要引入羊面部更细的纹理特征。我计划在第二代HAFB-2里加入可变形卷积让网络能自适应采样关键部位。5. 部署落地与常见问题排查5.1 模型的导出与加速训练完成后我把PyTorch模型导出为ONNX再转成TensorRT的engine文件。导出前需要把模型里的某些动态算子处理成静态尺寸比如HAFB-1中的空间注意力使用了尺寸不固定的池化层。在PyTorch里推理没问题但ONNX导出时如果输入尺寸固定为640池化输出尺寸也是固定的后续优化就顺利得多。下面是导出命令的简化示例实际使用中要替换成你自己的路径和引擎版本yolo export modelbest.pt formatonnx imgsz640 opset12 trtexec --onnxbest.onnx --saveEnginebest.trt --fp16TensorRT的FP16引擎在消费级显卡上实测推理延迟从8.2毫秒降到了4.7毫秒而准确率几乎不变。不过有个坑TensorRT对注意力模块里的某些运算有精度敏感第一次转出来的引擎在验证集上掉了0.4%准确率。我通过把注意力分支的某些层强制保留FP32精度解决了这个问题代价是延迟只增加了0.3毫秒完全可以接受。5.2 现场环境中的抗干扰处理真正到了养殖场算法在试验室里的那套流程不一定管用。首先光照不规律逆光时羊身整体偏黑。我在推理端加入了灰度世界白平衡对输入帧做自动色偏矫正效果好过训练更多暗光样本。其次是相机抖动由于养殖场摄像头大多安装在围栏或立柱上风一吹就会发生轻微晃动。我采用了一个轻量级的电子稳像策略对前后两帧特征做相对位置对齐代价是延迟增加1毫秒。再有就是羊群密集导致的检测框重叠。因为每个检测框会被独立送进分类头重叠的框可能把两只羊的特征拼在一起造成错误分类。我在后处理阶段加入了非极大值抑制的改进版对重叠框计算IoU后若置信度差值小于0.05则将该框标记为“待复核”而不是直接硬分类。这个策略把现场挑战集的准确率又拉回1个百分点。5.3 常见问题速查表我把这几个月遇到最频繁的问题整理成一个表格方便遇到同样情况的人对照排查现象可能原因解决方案训练时loss震荡不下降学习率过大或预热不充分初始学习率降到0.0005延长预热轮数到100验证集准确率稳定但现场测试掉点训练样本与真实场景分布不一致补充局部截图加入现场光照增强模拟蒙古羊与小尾寒羊混淆关键判别特征被遮挡或剪毛后外观趋同增加背部特征训练数据提高Focal Loss gamma推理速度慢模型未转TensorRT或未开FP16导出ONNX后转RT开启FP16注意保留关键层FP32检测框重叠导致分类不准羊只密度过大调整NMS阈值到0.6加入重叠框复核策略最后再分享一个小经验这类农业视觉项目最值得投资的不是模型结构而是数据采集和标注的规范性。我前前后后光是在数据清洗上花掉的时间就占总项目的一半。与其纠结把YOLO11改成多大的魔改版不如先把“真实场景下哪些特征能区分品种”想清楚模型和注意力只是帮你把这些特征挑出来的工具。这套项目做完之后我对注意力模块的理解也从“拿来即用”变成了“看任务重新设计”这才是最有价值的收获。后续我准备把HAFB-1扩展到更多细分品种比如不同肉质的肉羊分类思路应该会更快。

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

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

免费获取报价 →
↑