1. 项目背景与核心价值
水产养殖业面临的最大挑战之一就是鱼病的早期发现与防控。传统的人工巡检方式存在三个致命缺陷:一是依赖肉眼观察,难以发现早期轻微症状;二是专业兽医资源稀缺,偏远养殖场难以及时获得诊断;三是人工记录效率低下,难以建立系统的病害档案。这些问题直接导致每年因鱼病造成的经济损失高达数十亿元。
我们开发的这套基于YOLOv12的鱼病害智能检测系统,正是为了解决这些行业痛点。系统能够自动识别四种最常见的鱼类疾病:溃疡性综合症(EUS)、眼部疾病、鳍部病变和烂鳃病。在实际测试中,对典型症状的识别准确率达到92%以上,比人工巡检效率提升20倍。
2. 技术架构解析
2.1 YOLOv12模型选型
为什么选择YOLOv12而不是其他版本?经过我们大量实测对比发现:
- 推理速度:YOLOv12在RTX 3060上能达到140FPS,比v8快23%
- 内存占用:12s模型仅占用1.8GB显存,适合边缘设备部署
- 精度平衡:在鱼病数据集上,mAP@0.5达到0.89,误检率低于5%
我们特别测试了不同规模模型的表现:
| 模型类型 | 参数量 | mAP@0.5 | 推理速度(FPS) | 显存占用 |
|---|---|---|---|---|
| yolov12n | 3.2M | 0.82 | 210 | 1.2GB |
| yolov12s | 11.4M | 0.87 | 160 | 1.8GB |
| yolov12m | 25.3M | 0.89 | 110 | 3.5GB |
最终选择yolov12s作为基础模型,在精度和速度间取得最佳平衡。
2.2 多模态检测架构
系统采用分层设计架构:
code复制[输入层]
├─ 图片检测(JPG/PNG)
├─ 视频解析(MP4/AVI)
└─ 实时摄像头(RTSP/USB)
[核心引擎]
├─ 预处理模块(尺寸归一化/直方图均衡)
├─ YOLOv12推理引擎
└─ 后处理(NMS/置信度过滤)
[输出层]
├─ 可视化标注界面
├─ 结构化数据表格
└─ 自动归档系统
特别值得说明的是视频处理采用帧采样策略:对于>5分钟的长视频,自动启用动态采样率(关键帧优先),确保检测效率。
3. 数据集构建关键
3.1 数据采集难点
鱼病数据收集面临三大挑战:
- 病鱼样本获取困难(养殖场不愿公开病鱼情况)
- 症状表现多样(同种病害在不同鱼种表现不同)
- 背景干扰复杂(网箱、水池等环境干扰)
我们的解决方案:
- 与5家养殖基地建立合作,获取真实病例
- 使用数据增强模拟不同环境:
python复制transform = A.Compose([ A.RandomShadow(p=0.3), A.RandomFog(p=0.1), A.RandomSunFlare(p=0.2), A.WaterSurfaceRipple(p=0.25) ]) - 人工标注经过三轮交叉验证,确保标注质量
3.2 数据集分布
最终构建的数据集包含:
- 训练集:2321张(含增强后图像)
- 验证集:255张
- 测试集:290张
类别分布统计:
| 病害类型 | 训练集 | 验证集 | 测试集 |
|---|---|---|---|
| EUS | 623 | 68 | 79 |
| 眼部疾病 | 587 | 64 | 73 |
| 鳍部病变 | 582 | 62 | 71 |
| 烂鳃病 | 529 | 61 | 67 |
4. 模型训练细节
4.1 超参数配置
采用两阶段训练策略:
第一阶段(冻结骨干网络)
yaml复制lr0: 0.01
lrf: 0.1
momentum: 0.9
weight_decay: 0.0005
warmup_epochs: 3
batch: 16
第二阶段(全参数微调)
yaml复制lr0: 0.001
lrf: 0.01
cutmix: 0.5
mosaic: 1.0
mixup: 0.2
关键技巧:
- 使用EMA(指数移动平均)稳定训练
- 采用自适应锚框计算
- 添加分类损失权重(1:1.2,因烂鳃病样本较少)
4.2 训练过程监控
通过Val指标动态调整策略:

观察到:
- 约30epoch后mAP趋于稳定
- 验证损失在45epoch左右出现最低点
- 分类损失下降最快,框回归损失波动较大
最终采用早停策略,在验证loss连续5轮不下降时终止训练。
5. 系统实现关键代码
5.1 多线程检测引擎
python复制class DetectionThread(QThread):
def __init__(self, model, source, conf, iou):
self.model = model
self.source = source # 支持路径/camera索引/RTSP流
self.frame_queue = Queue(maxsize=3) # 防止内存堆积
def run(self):
while self.running:
frame = self.get_frame()
if frame is None: break
# 异步推理
results = self.model.track(
frame,
persist=True, # 视频追踪需要
conf=self.conf,
iou=self.iou,
verbose=False
)
# 结果处理
annotated = results[0].plot()
detections = self.parse_results(results)
# 发送到UI线程
self.frame_received.emit(frame, annotated, detections)
关键点:采用生产者-消费者模式,通过队列控制帧处理速度,避免UI卡顿
5.2 动态参数调节
python复制def update_params(self):
# 滑块与数值框双向绑定
self.conf_slider.valueChanged.connect(
lambda v: self.conf_spin.setValue(v/100))
self.conf_spin.valueChanged.connect(
lambda v: self.conf_slider.setValue(v*100))
# 实时生效
if self.detection_thread:
self.detection_thread.conf = self.conf_spin.value()
self.detection_thread.iou = self.iou_spin.value()
6. 系统部署实践
6.1 环境配置要点
推荐使用conda创建隔离环境:
bash复制conda create -n fish_detection python=3.9
conda install pytorch==2.0.1 torchvision==0.15.2 -c pytorch
pip install -r requirements.txt
常见问题解决:
- 如果遇到OpenCV无法打开摄像头:
bash复制sudo apt install libgtk2.0-dev - 视频写入失败时检查编码器:
python复制fourcc = cv2.VideoWriter_fourcc(*'mp4v') # 或'avc1'
6.2 边缘设备适配
在Jetson Xavier NX上的优化方案:
- 转换TensorRT模型:
python复制model.export(format='engine', device=0) - 启用半精度推理:
python复制model = YOLO('model.engine', fp16=True) - 限制解码线程数:
python复制cv2.setNumThreads(2)
实测性能:
- 1080p视频处理:28FPS
- 功耗:15W
- 内存占用:1.2GB
7. 实际应用案例
7.1 养殖场部署效果
在广东某鲈鱼养殖基地的实测数据:
| 指标 | 人工巡检 | 本系统 |
|---|---|---|
| 检测耗时 | 3小时/池 | 15分钟 |
| 早期发现率 | 62% | 89% |
| 误报率 | 15% | 6% |
| 记录完整性 | 纸质记录 | 数字档案 |
7.2 典型问题排查
问题1:夜间检测准确率下降
- 原因:红外摄像头成像质量差
- 解决:添加灰度直方图均衡化预处理
python复制gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) clahe = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8,8)) enhanced = clahe.apply(gray)
问题2:密集鱼群误检
- 原因:NMS阈值过高
- 解决:动态调整iou_thres
python复制if crowded_scene: results = model(frame, iou=0.3) # 默认0.45
8. 未来改进方向
- 多模态融合:加入水质传感器数据(pH值、溶氧量)辅助诊断
- 病害预测:基于时间序列分析预测发病趋势
- 轻量化:开发专用于手机的轻量级模型(<50MB)
- 知识图谱:构建鱼病治疗方案推荐系统
当前系统已在GitHub开源,欢迎开发者共同完善:
code复制项目地址:https://github.com/xxx/fish_disease_detection
注:实际部署时建议根据养殖密度调整检测频率,高密度养殖建议每小时自动扫描一次,数据异常时实时报警。
