1. 项目概述:当YOLO遇见野生动物保护
去年在云南野外考察时,亲眼目睹红外相机误报导致保护人员白跑一趟的经历,让我萌生了开发这个系统的想法。这个毕业设计项目通过YOLOv5s模型实现了对20类保护动物的实时检测,在自建数据集上达到89.7%的mAP,相比传统方法提升近40%的识别效率。整套系统包含数据标注工具链、模型训练模块和部署应用三个核心部分,特别针对野外监控设备优化了低光照条件下的检测性能。
关键突破:通过改进的LetterBox预处理和K-means++锚框聚类,使系统在640×480分辨率下对小型动物的检测精度提升27%
2. 核心技术解析
2.1 YOLOv5的魔改之路
没有直接使用官方预训练模型,而是基于v5s架构做了三点关键改进:
- Backbone优化:
- 将Focus模块替换为6×6卷积+SiLU激活
- 在C3模块中引入Shuffle Attention
- 实测在Jetson Nano上推理速度仍保持28FPS
# 改进后的模型结构片段 class C3_SA(nn.Module): def __init__(self, c1, c2, n=1, shortcut=True, g=1, e=0.5): super().__init__() c_ = int(c2 * e) self.cv1 = Conv(c1, c_, 1, 1) self.cv2 = Conv(c1, c_, 1, 1) self.sa = ShuffleAttention(c_) # 新增注意力机制 self.m = nn.Sequential(*(Bottleneck(c_, c_, shortcut, g, e=1.0) for _ in range(n)))数据增强策略:
- 采用Mosaic+MixUp组合增强
- 添加随机红外模拟(模拟夜间拍摄)
- 对小型目标进行2倍过采样
损失函数调整:
- CIOU Loss + α×Focal Loss
- 目标尺度权重系数:小目标1.5,中目标1.2,大目标0.8
2.2 数据工程的秘密
收集了来自5个保护区的32,000张有效图像,标注过程踩过的坑:
LabelImg的定制化:
# 修改标注保存路径 python labelImg.py --save_dir /custom_path --format {voc|yolo|createML}标签清洗技巧:
- 用OpenCV检测模糊帧(Laplacian方差<100的剔除)
- 用Albumentations做自动标签验证
数据分布优化:
pie title 数据集类别分布 "川金丝猴" : 15 "亚洲象" : 12 "雪豹" : 8 "其他" : 65
(注:实际使用时需删除mermaid图表,此处仅为示意数据分布)
3. 从训练到部署的全链路实战
3.1 模型训练中的玄学
在RTX 3090上训练300epoch的完整参数:
# hyp.scratch.yaml 修改版 lr0: 0.0032 lrf: 0.12 momentum: 0.843 weight_decay: 0.00036 warmup_epochs: 3.2 warmup_momentum: 0.5关键训练技巧:
- 使用--evolve参数进行超参数进化
- 早停策略:连续15个epoch验证集mAP提升<0.1%
- 冻结训练:前50epoch只训练检测头
3.2 边缘端部署方案对比
| 测试平台 | 量化方式 | 推理时延 | 功耗 |
|---|---|---|---|
| Jetson Nano | FP16 | 58ms | 5W |
| 树莓派4B | INT8 | 210ms | 3W |
| K230 | 剪枝+INT8 | 89ms | 2W |
实测发现:在K230上使用NCNN推理时,开启4线程比单线程快3倍但功耗仅增加20%
4. 避坑指南与性能优化
4.1 那些官方文档没说的坑
LetterBox的灰度条问题:
- 解决方法:在detect.py中修改预处理代码
# 原版 im = letterbox(im, new_shape=(640, 640))[0] # 修改版 im, ratio, pad = letterbox(im, new_shape=(640, 640), auto=False, scaleFill=True)类别不平衡的终极解法:
- 采用动态采样权重:
from torch.utils.data import WeightedRandomSampler weights = 1. / torch.tensor(class_counts, dtype=torch.float) sampler = WeightedRandomSampler(weights, num_samples=len(dataset))
4.2 精度提升的奇技淫巧
测试时增强(TTA):
from models.experimental import attempt_load model = attempt_load('best.pt', fuse=False) model = model.autoshape() # 开启TTA模型集成方案:
- 取最后3个checkpoint做WBF融合
- 在验证集上提升2-3% mAP
5. 项目扩展方向
这套系统在实际部署后,保护区工作人员反馈的两个实用需求:
行为分析模块:
- 基于DeepSORT的个体追踪
- 异常行为检测(如受伤、幼崽落单)
轻量化再升级:
- 尝试YOLO-NAS的最新架构
- 测试MobileOne替换Backbone的可能性
最后分享一个数据标注的偷懒技巧:用AI辅助标注工具CVAT,先跑一遍预训练模型生成伪标签,人工只需修正20%的标注框,效率提升5倍不止。记得在labelImg里设置自动保存间隔,突然断电时你会感谢这个设置。