
1. 项目背景与核心价值去年帮兽医朋友解决宠物诊所的监控问题时发现一个有趣现象通过摄像头观察猫咪状态时疲劳程度判断完全依赖人工经验。这让我萌生了用卷积神经网络(CNN)自动识别猫疲劳状态的想法。这个毕业设计项目不仅具有学术价值在实际宠物健康监测、智能养宠设备开发等领域都有广泛应用场景。传统宠物状态监测主要依赖可穿戴设备但猫咪对颈圈等设备耐受性差。基于视觉的疲劳识别方案无需接触宠物通过普通摄像头即可实现全天候监测。当猫咪连续玩耍超过健康时长时系统能及时提醒主人预防过度疲劳导致的健康问题。2. 技术方案设计思路2.1 为什么选择CNN架构卷积神经网络在图像识别领域的优势主要体现在三个方面局部连接特性适合提取眼部、耳朵等关键部位特征权重共享机制大幅减少参数量池化操作增强了对猫咪姿态变化的鲁棒性经过对比测试采用ResNet18作为基础架构在其后接入自定义的全连接层。输入图像统一处理为224×224分辨率在最后全连接层使用Sigmoid激活函数实现二分类疲劳/非疲劳。2.2 数据集构建技巧收集了2000张标注好的猫咪图像包含以下关键特征眼睛睁开程度半闭眼是重要指标耳朵位置疲劳时耳朵会向后贴身体姿态趴卧时长与疲劳正相关数据增强策略随机水平翻转p0.5±15度随机旋转亮度调整0.8-1.2倍添加高斯噪声σ0.01特别注意要确保增强后的图像不会改变疲劳状态的视觉特征如不能将睁眼图片增强为闭眼效果。3. 模型实现细节3.1 环境配置方案# 推荐使用conda创建虚拟环境 conda create -n cat_fatigue python3.8 conda activate cat_fatigue pip install torch1.12.0 torchvision0.13.0 pip install opencv-python pillow matplotlib3.2 核心网络结构import torch.nn as nn from torchvision.models import resnet18 class CatFatigueDetector(nn.Module): def __init__(self): super().__init__() self.backbone resnet18(pretrainedTrue) # 替换最后一层全连接 self.backbone.fc nn.Sequential( nn.Linear(512, 256), nn.ReLU(), nn.Dropout(0.5), nn.Linear(256, 1), nn.Sigmoid() ) def forward(self, x): return self.backbone(x)关键参数说明使用预训练ResNet18的卷积层参数在全连接层添加Dropout防止过拟合最终输出通过Sigmoid映射到[0,1]区间3.3 训练技巧实录# 损失函数与优化器配置 criterion nn.BCELoss() optimizer torch.optim.Adam(model.parameters(), lr1e-4, weight_decay1e-5) # 学习率调度器 scheduler torch.optim.lr_scheduler.ReduceLROnPlateau( optimizer, modemin, factor0.1, patience3 )训练过程中的重要发现当验证集准确率连续3个epoch没有提升时自动降低学习率早停机制设置为10个epoch没有改善就终止训练最佳batch_size为32过小会导致收敛不稳定4. 实际应用中的挑战与解决方案4.1 光照条件影响在实地测试中发现夜间红外摄像头拍摄的图像识别准确率下降约15%。解决方案在数据集中加入20%的低光照样本在预处理阶段加入自适应直方图均衡化使用Gamma校正γ1.5增强暗部细节4.2 多猫场景处理当画面中出现多只猫时需要先进行个体检测。改进方案先用YOLOv5检测各猫咪的bounding box对每个检测区域单独进行疲劳判断添加跟踪ID避免重复检测实现代码片段def process_multi_cats(frame): results yolo_model(frame) # YOLO检测 fatigue_results [] for box in results.xyxy[0]: x1, y1, x2, y2 map(int, box[:4]) cat_img frame[y1:y2, x1:x2] fatigue_prob fatigue_model(transform(cat_img)) fatigue_results.append((box, fatigue_prob)) return fatigue_results5. 模型优化方向5.1 知识蒸馏压缩模型将ResNet18替换为MobileNetV3后模型大小从45MB减小到6.8MB推理速度提升3倍从120ms到40ms准确率仅下降2.3%5.2 多模态数据融合尝试结合声音特征呼噜声频率使用Mel频谱图作为第二输入通道设计双分支网络结构准确率提升4.7%但需要额外麦克风设备5.3 边缘设备部署使用TensorRT优化后的模型在Jetson Nano上达到25FPS内存占用控制在300MB以内支持同时处理4路摄像头输入部署命令示例trtexec --onnxcat_fatigue.onnx \ --saveEnginecat_fatigue.engine \ --fp16 --workspace10246. 项目完整实现建议对于想完整实现本项目的同学建议按以下步骤进行数据收集阶段2周使用网络摄像头录制自家猫咪视频每30分钟截取1张图像并标注状态至少收集500张有效图片模型训练阶段1周先用ImageNet预训练权重初始化冻结卷积层先训练全连接层3个epoch解冻全部参数微调10-15个epoch部署测试阶段3天使用Flask搭建简易Web服务通过浏览器上传图片测试手机APP可通过API调用服务常见训练问题排查如果验证集准确率始终低于60%检查数据标注质量遇到梯度爆炸时尝试减小学习率或添加梯度裁剪当训练损失震荡严重时适当增大batch_size这个项目最让我惊喜的是在实际测试中发现模型还能间接检测猫咪的脱水状态——当猫咪眼睛周围出现轻微凹陷时虽然不在训练标签中但模型会给出高疲劳概率。这提示我们CNN确实学习到了更丰富的健康特征后续可以考虑扩展为多任务学习框架。