1. 项目概述:基于YOLOv11的鱼类识别系统
去年帮导师带本科生毕设时,接触到一个挺有意思的课题——用YOLOv11实现水下鱼类自动识别。这个系统不仅能识别常见养殖鱼种,还能统计鱼群密度,对水产养殖业帮助很大。当时学生们从零开始搭建环境、标注数据、训练模型,踩了不少坑,也积累了些实战经验,今天就把这个项目的完整实现过程分享给大家。
这个系统核心是用YOLOv11目标检测算法,配合PyTorch框架实现的。相比传统图像处理方法,深度学习方案在复杂水下环境(如光线折射、水体浑浊)中表现更稳定。我们测试发现,在自建的数据集上,mAP@0.5能达到0.87,单张图片推理速度在RTX 3060上约23ms,完全满足实时监测需求。
注意:YOLOv11并非官方命名,而是社区对YOLO系列最新改进版的统称。本文使用的是2023年GitHub上star数最高的一个改进版本,主要优化了neck部分的结构。
2. 核心设计思路
2.1 为什么选择YOLOv11?
相比YOLOv5,v11在三个关键点做了改进:
- Neck结构优化:引入BiFPN加权特征金字塔,让不同尺度特征融合更充分
- 标签分配策略:采用Task-Aligned Assigner,缓解了密集鱼群场景的漏检问题
- 损失函数:新增WIoU(Wise-IoU)计算方式,对重叠鱼体的边界框预测更准
实测在拥挤鱼群场景下,v11的召回率比v5高出12%,特别适合养殖池监控这类目标密集的场景。
2.2 系统架构设计
整套系统分为四个模块:
graph TD A[水下摄像头] --> B[预处理模块] B --> C[YOLOv11推理引擎] C --> D[数据可视化界面]- 预处理模块:用OpenCV做白平衡校正+CLAHE对比度增强,解决水下图像偏蓝问题
- 推理引擎:基于PyTorch的量化版YOLOv11,模型体积仅14.3MB
- 可视化界面:PyQt5开发,实时显示识别结果和鱼群统计曲线
3. 关键实现步骤
3.1 环境配置
推荐使用conda创建虚拟环境:
conda create -n fishdet python=3.8 conda install pytorch==1.12.1 torchvision==0.13.1 cudatoolkit=11.3 -c pytorch pip install opencv-python==4.6.0.66 albumentations==1.2.1 pyqt5==5.15.7踩坑记录:PyTorch 2.0+版本与某些YOLOv11改进分支存在兼容性问题,建议锁定1.x版本
3.2 数据准备
我们收集了5种常见养殖鱼类的图像:
- 训练集:3200张(含不同光照、密度场景)
- 验证集:800张
- 测试集:500张
标注工具推荐使用LabelImg,保存为YOLO格式的txt文件。关键技巧:
# 数据增强配置示例(albumentations库) transform = A.Compose([ A.HorizontalFlip(p=0.5), A.RandomBrightnessContrast(p=0.2), A.Blur(blur_limit=3, p=0.1), # 模拟水下模糊 A.ToGray(p=0.1) # 应对低可见度场景 ], bbox_params=A.BboxParams(format='yolo'))3.3 模型训练
核心训练参数配置:
# hyp.yaml lr0: 0.01 lrf: 0.01 momentum: 0.937 weight_decay: 0.0005 warmup_epochs: 3 warmup_momentum: 0.8 box: 0.05 # WIoU权重 cls: 0.5 dfl: 1.0启动训练命令:
python train.py --img 640 --batch 16 --epochs 100 --data fish.yaml --cfg models/yolov11s.yaml --weights '' --device 03.4 模型优化技巧
- 量化部署:使用TensorRT加速
# 转换ONNX python export.py --weights runs/train/exp/weights/best.pt --include onnx # TensorRT优化 trtexec --onnx=best.onnx --fp16 --saveEngine=best.engine实测在Jetson Nano上,推理速度从78ms提升到41ms
- 改进建议:
- 对于小鱼检测:在neck部分添加SPPF模块
- 密集场景:将NMS改为Soft-NMS
- 轻量化:用ShuffleNetV2替换部分卷积
4. 系统集成与部署
4.1 PyQt5界面开发
核心功能类设计:
class FishMonitor(QMainWindow): def __init__(self): super().__init__() self.model = torch.jit.load('fish_det.pt') # 加载量化模型 self.timer = QTimer(self) self.timer.timeout.connect(self.detect_frame) def detect_frame(self): ret, frame = self.cap.read() if ret: results = self.model(frame) # 推理 self.display_results(results) # 可视化 self.update_chart(results) # 更新统计图表4.2 实际部署问题
我们遇到的两个典型问题及解决方案:
- 水下反光干扰:
- 现象:强光照射区域误检率高
- 解决:在预处理阶段添加基于HSV色彩空间的过曝区域检测与修复
- 鱼体重叠问题:
- 现象:密集鱼群出现漏检
- 解决:将默认IOU阈值从0.45调整到0.3,并启用Wise-IoU
5. 论文写作要点
对于毕设论文,建议重点突出以下创新点:
- 数据增强策略:针对水下环境设计的特殊增强方法
- 模型改进:对原YOLO架构的优化项及其效果对比
- 系统实用性:在真实养殖场的测试结果(如识别准确率与人工计数对比)
图表制作技巧:
- 使用Python的seaborn库绘制mAP曲线
- 用Visio绘制系统架构图时,建议采用分层设计风格
- 混淆矩阵用热力图形式展示更直观
6. 项目扩展方向
这个基础系统还可以进一步扩展:
- 鱼类行为分析:通过连续帧检测实现摄食行为识别
- 多模态融合:结合水下声呐数据提升低能见度下的检测精度
- 养殖密度预警:基于检测结果动态计算鱼群分布均匀度
我在实际部署中发现,用OpenVINO替代TensorRT可以在Intel设备上获得更好的性能表现。另外建议在数据采集阶段就做好光照条件标注,这对后期模型优化很有帮助。