基于YOLOv5的母猪生产智能识别系统|深度学习助力智慧养殖

42 阅读8分钟

🐖 基于YOLOv5的母猪生产智能识别系统|深度学习助力智慧养殖

本文为本科毕业设计精华版,完整源码+数据集获取方式见文末

💡 研究背景与畜牧业智能化需求

智慧养殖的迫切需求

我国是世界猪肉消费第一大国,2020年猪肉产量达4113万吨,占全球产量的42%。随着生活品质提高,人们对猪肉品质要求不断提升,传统养殖方式已难以满足现代畜牧业发展需求。

传统养殖痛点:

  • 👨‍🌾 人工监控低效:依赖经验判断,效率低下
  • 时效性差:无法实现24小时不间断监控
  • 📊 主观性强:检测标准易受人为主观因素影响
  • 💰 成本高昂:人力成本和时间成本巨大

智能检测优势:

  • 🤖 自动化监控:7×24小时不间断工作
  • 🎯 客观准确:基于数据驱动的标准化识别
  • 实时预警:及时发现异常情况
  • 📈 数据驱动:为养殖决策提供科学依据

🏗️ 系统架构设计

完整技术栈

🎯 数据采集层:
├── 海康威视网络摄像头
├── 视频帧切割处理
└── 图像数据预处理

🔧 算法核心层:
├── YOLOv5目标检测
├── DeeplabV3+语义分割
├── 迁移学习优化
└── 多网络模型对比

🧠 模型应用层:
├── 母猪姿态识别
├── 生产行为分析
└── 健康状态监测

💾 数据存储层:
├── 原始图像数据集
├── 标注数据文件
└── 模型权重文件

技术路线架构

数据采集 → 图像标注 → 模型训练 → 迁移学习 → 性能评估

⚡ 核心算法实现

1. YOLOv5网络优化

import torch
import torch.nn as nn
import torch.nn.functional as F

class ImprovedYOLOv5(nn.Module):
    """改进的YOLOv5网络结构"""
    
    def __init__(self, num_classes=3):  # 站立、坐立、卧姿
        super(ImprovedYOLOv5, self).__init__()
        self.num_classes = num_classes
        
        # 主干网络
        self.backbone = self._build_backbone()
        
        # 颈部网络
        self.neck = self._build_neck()
        
        # 检测头
        self.head = self._build_head()
    
    def _build_backbone(self):
        """构建主干特征提取网络"""
        layers = [
            # Focus结构
            nn.Conv2d(3, 64, 6, 2, 2),
            nn.BatchNorm2d(64),
            nn.SiLU(),
            
            # CSP结构
            self._build_csp_block(64, 128, 3),
            self._build_csp_block(128, 256, 3),
            self._build_csp_block(256, 512, 3),
        ]
        return nn.Sequential(*layers)
    
    def _build_csp_block(self, in_channels, out_channels, num_blocks):
        """构建CSP残差块"""
        layers = []
        # 实现CSP结构
        return nn.Sequential(*layers)
    
    def _build_neck(self):
        """构建特征融合颈部网络"""
        return nn.Sequential(
            # FPN + PAN结构
            nn.Conv2d(512, 256, 1),
            nn.BatchNorm2d(256),
            nn.SiLU(),
            nn.Upsample(scale_factor=2),
            
            nn.Conv2d(256, 128, 1),
            nn.BatchNorm2d(128),
            nn.SiLU(),
            nn.Upsample(scale_factor=2),
        )
    
    def _build_head(self):
        """构建检测头"""
        return nn.Sequential(
            nn.Conv2d(128, 256, 3, padding=1),
            nn.BatchNorm2d(256),
            nn.SiLU(),
            nn.Conv2d(256, (5 + self.num_classes) * 3, 1),  # 3个anchor
        )
    
    def forward(self, x):
        # 特征提取
        features = self.backbone(x)
        
        # 特征融合
        fused_features = self.neck(features)
        
        # 检测输出
        outputs = self.head(fused_features)
        
        return outputs

class CoordinateAttention(nn.Module):
    """坐标注意力机制增强特征提取"""
    
    def __init__(self, in_channels, reduction=32):
        super(CoordinateAttention, self).__init__()
        self.in_channels = in_channels
        self.reduction = reduction
        
        # 通道压缩
        self.channel_compress = nn.Sequential(
            nn.Conv2d(in_channels, in_channels // reduction, 1),
            nn.BatchNorm2d(in_channels // reduction),
            nn.ReLU(inplace=True)
        )
        
    def forward(self, x):
        # 实现坐标注意力机制
        batch_size, _, height, width = x.size()
        
        # 水平方向全局平均池化
        x_h = F.adaptive_avg_pool2d(x, (height, 1))
        # 垂直方向全局平均池化  
        x_w = F.adaptive_avg_pool2d(x, (1, width))
        
        # 特征融合
        out = x * x_h * x_w
        
        return out

2. 数据预处理与增强

import cv2
import numpy as np
import albumentations as A
from albumentations.pytorch import ToTensorV2

class SowBehaviorDataset:
    """母猪行为数据集"""
    
    def __init__(self, image_paths, annotations, transform=None):
        self.image_paths = image_paths
        self.annotations = annotations
        self.transform = transform
        
        # 行为类别映射
        self.behavior_map = {
            'standing': 0,    # 站立
            'sitting': 1,     # 坐立  
            'lying': 2,       # 卧姿
        }
    
    def __len__(self):
        return len(self.image_paths)
    
    def __getitem__(self, idx):
        # 读取图像
        image = cv2.imread(self.image_paths[idx])
        image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
        
        # 读取标注
        boxes = []
        labels = []
        for annotation in self.annotations[idx]:
            xmin, ymin, xmax, ymax = annotation['bbox']
            behavior_type = annotation['behavior']
            
            boxes.append([xmin, ymin, xmax, ymax])
            labels.append(self.behavior_map[behavior_type])
        
        # 数据增强
        if self.transform:
            transformed = self.transform(
                image=image,
                bboxes=boxes,
                class_labels=labels
            )
            image = transformed['image']
            boxes = transformed['bboxes']
            labels = transformed['class_labels']
        
        # 转换为Tensor
        target = {
            'boxes': torch.tensor(boxes, dtype=torch.float32),
            'labels': torch.tensor(labels, dtype=torch.int64),
        }
        
        return image, target

class SowDataAugmentation:
    """母猪数据增强管道"""
    
    def __init__(self, image_size=640):
        self.train_transform = A.Compose([
            # Mosaic数据增强
            A.OneOf([
                A.Mosaic(always_apply=False, p=1.0),
                A.Compose([
                    A.RandomResizedCrop(image_size, image_size, scale=(0.5, 1.0)),
                    A.HorizontalFlip(p=0.5),
                ])
            ], p=0.5),
            
            # 颜色增强
            A.ColorJitter(
                brightness=0.2,
                contrast=0.2,
                saturation=0.2,
                hue=0.1,
                p=0.5
            ),
            
            # 几何变换
            A.ShiftScaleRotate(
                shift_limit=0.1,
                scale_limit=0.1,
                rotate_limit=15,
                p=0.5
            ),
            
            # 模糊增强
            A.OneOf([
                A.MotionBlur(p=0.2),
                A.GaussianBlur(blur_limit=3, p=0.1),
            ], p=0.5),
            
            # 标准化
            A.Normalize(
                mean=[0.485, 0.456, 0.406],
                std=[0.229, 0.224, 0.225]
            ),
            ToTensorV2(),
        ], bbox_params=A.BboxParams(format='pascal_voc', label_fields=['class_labels']))

3. 迁移学习实现

import tensorflow as tf
from tensorflow.keras.applications import MobileNetV2, VGG16, DenseNet121, InceptionV3
from tensorflow.keras.layers import Dense, GlobalAveragePooling2D
from tensorflow.keras.models import Model
from tensorflow.keras.optimizers import Adam

class TransferLearningModel:
    """迁移学习模型管理"""
    
    def __init__(self, base_model_name='MobileNetV2', num_classes=3):
        self.base_model_name = base_model_name
        self.num_classes = num_classes
        self.model = None
        
    def build_model(self):
        """构建迁移学习模型"""
        
        # 选择基础模型
        if self.base_model_name == 'MobileNetV2':
            base_model = MobileNetV2(weights='imagenet', include_top=False)
        elif self.base_model_name == 'VGG16':
            base_model = VGG16(weights='imagenet', include_top=False)
        elif self.base_model_name == 'DenseNet121':
            base_model = DenseNet121(weights='imagenet', include_top=False)
        elif self.base_model_name == 'InceptionV3':
            base_model = InceptionV3(weights='imagenet', include_top=False)
        else:
            raise ValueError("不支持的模型类型")
        
        # 冻结基础模型层
        base_model.trainable = False
        
        # 添加自定义层
        x = base_model.output
        x = GlobalAveragePooling2D()(x)
        x = Dense(512, activation='relu')(x)
        predictions = Dense(self.num_classes, activation='softmax')(x)
        
        # 构建完整模型
        self.model = Model(inputs=base_model.input, outputs=predictions)
        
        return self.model
    
    def compile_model(self):
        """编译模型"""
        self.model.compile(
            optimizer=Adam(lr=0.001),
            loss='categorical_crossentropy',
            metrics=['accuracy']
        )
    
    def fine_tune(self, train_generator, val_generator, epochs=50):
        """微调模型"""
        
        # 第一阶段:只训练自定义层
        history1 = self.model.fit(
            train_generator,
            epochs=10,
            validation_data=val_generator,
            verbose=1
        )
        
        # 第二阶段:解冻部分基础层进行微调
        base_model = self.model.layers[0]
        base_model.trainable = True
        
        # 只微调后面的层
        for layer in base_model.layers[:-20]:
            layer.trainable = False
        
        # 重新编译
        self.model.compile(
            optimizer=Adam(lr=0.0001),
            loss='categorical_crossentropy', 
            metrics=['accuracy']
        )
        
        # 继续训练
        history2 = self.model.fit(
            train_generator,
            epochs=epochs-10,
            validation_data=val_generator,
            verbose=1
        )
        
        return history1, history2

# 使用示例
def train_sow_behavior_model():
    """训练母猪行为识别模型"""
    
    # 初始化迁移学习模型
    tl_model = TransferLearningModel(
        base_model_name='MobileNetV2',
        num_classes=3  # 站立、坐立、卧姿
    )
    
    # 构建模型
    model = tl_model.build_model()
    tl_model.compile_model()
    
    # 准备数据生成器
    train_datagen = tf.keras.preprocessing.image.ImageDataGenerator(
        rescale=1./255,
        shear_range=0.2,
        zoom_range=0.2,
        horizontal_flip=True
    )
    
    train_generator = train_datagen.flow_from_directory(
        'data/train',
        target_size=(224, 224),
        batch_size=32,
        class_mode='categorical'
    )
    
    # 训练模型
    history = tl_model.fine_tune(train_generator, train_generator)
    
    return model, history

📊 实验效果与性能评估

1. 不同网络模型性能对比

各网络在母猪行为识别上的表现:

模型参数量(M)准确率(%)训练时间(小时)模型大小(MB)
VGG1613871.524.5528
MobileNetV23.490.231.28.8
DenseNet1218.088.042.133
InceptionV323.890.063.592

2. 迁移学习效果对比

迁移学习前后准确率提升:

网络结构迁移前准确率迁移后准确率提升幅度
VGG1670.37%71.52%+1.15%
MobileNetV288.28%90.23%+1.95%
DenseNet12187.50%88.04%+0.54%
InceptionV387.67%90.06%+2.39%

3. 语义分割性能

不同分割模型在母猪图像上的表现:

模型MIoU训练时间参数量
Unet0.8983.2小时7.8M
PSPnet0.9244.1小时23.5M
DeeplabV3+0.9565.3小时41.3M

🎯 系统功能特色

技术创新点

  1. 多模型融合:结合YOLOv5检测与DeeplabV3+分割
  2. 迁移学习优化:利用ImageNet预训练模型加速收敛
  3. 注意力机制:坐标注意力增强特征提取能力
  4. 数据增强:针对养殖场环境的专用增强策略

实用功能

  • 🐖 行为识别:准确识别站立、坐立、卧姿三种状态
  • 📹 实时监控:支持摄像头实时视频流分析
  • 📊 数据统计:行为时长、频率统计分析
  • ⚠️ 异常预警:异常行为实时预警
  • 💾 数据导出:检测结果自动保存记录

💼 应用场景与价值

实际应用场景

  • 🏢 规模化养殖场:自动化母猪行为监控与管理
  • 🔬 科研机构:母猪行为学研究数据采集
  • 📱 养殖管理:移动端远程监控与预警
  • 📈 生产优化:基于行为数据的养殖策略调整

产业价值

  1. 提升福利:及时发现异常行为,改善动物福利
  2. 节约成本:减少人工监控成本,提高效率
  3. 提高产量:优化养殖管理,提高繁殖效率
  4. 数据驱动:为精准养殖提供数据支持

在这里插入图片描述 在这里插入图片描述 在这里插入图片描述

🚀 优化与展望

技术改进方向

  • 🤖 多模态融合:结合温度、声音等多传感器数据
  • 🌐 边缘计算:部署到养殖场现场设备
  • 📈 自适应学习:在线学习适应不同养殖场环境
  • 🔄 时序分析:结合历史数据进行行为预测

功能扩展

  1. 健康评估:基于行为模式的健康状态评估
  2. 繁殖预测:发情期、分娩期智能预测
  3. 个体识别:结合个体身份识别技术
  4. 群体分析:群体行为模式分析

🎁 资源获取

完整项目资料包:

  • ✅ 母猪行为识别系统完整源码
  • ✅ 优化YOLOv5算法实现
  • ✅ 母猪行为数据集
  • ✅ 预训练模型权重
  • ✅ 系统使用文档

获取方式: 由于项目包含重要的计算机视觉技术创新,需要付费获取完整资源


💬 技术交流

常见问题解答:

Q: 系统对养殖场环境适应性强吗? A: 通过多种数据增强策略,系统能够适应不同光照、角度条件下的养殖场环境。

Q: 识别准确率如何? A: 在测试集上,最佳模型达到90.23%的准确率,优于传统方法。

Q: 能否实时处理多路视频? A: 支持多路摄像头实时处理,具体路数取决于硬件配置。

Q: 部署复杂吗? A: 提供完整的部署脚本,支持Windows/Linux系统一键部署。


如果本研究成果对您的养殖管理工作有帮助,请点赞、收藏、关注支持!