一、实训背景与目标
1. 实训背景
水下环境因光照不足、水体散射、图像偏色等问题,导致传统目标检测方法精度低、小目标召回率不足(仅 60%),难以满足渔业资源管理、水下机器人导航等场景的实际需求。而 YOLOv12 等深度学习算法凭借自动特征学习和多尺度优化能力,为水下目标检测提供了新的解决方案。本次实训以 URPC 水下目标检测数据集为研究对象,聚焦扇贝、海胆、海参、海星四类目标,重点解决小目标漏检、类别不平衡、水下图像质量差三大核心问题。
2. 实训目标
- 掌握水下图像预处理与增强技术,提升数据质量;
- 基于 YOLOv12 完成模型改进,优化小目标检测性能与类别平衡;
- 实现模型训练、评估与可视化,核心指标 mAP@0.5 提升至 80% 以上;
- 开发轻量化检测系统,支持单张 / 批量图像检测与结果管理。
二、数据集介绍与预处理
1. 数据集基本信息
本次实训采用 URPC 水下目标检测数据集,包含四类目标:
- 类别分布:扇贝(15%,80% 为小目标)、海胆(40% 为小目标)、海参、海星;
- 数据痛点:图像存在蓝绿偏色、模糊、散射干扰,标注含无效框,类别不平衡(扇贝样本稀缺)。
2. 预处理流程
(1)数据格式转换与清洗
- 将 XML 标注文件批量转换为 YOLO 格式 txt 文件;
- 过滤无效框、越界框,确保标注准确性;
- 按类别均衡原则划分训练 / 验证 / 测试集,避免评估偏差。
(2)水下专用图像增强
针对水下图像质量问题,设计三步增强策略:
- 颜色校正:通过 YUV/LAB 颜色空间转换,调整 U、V 通道分量,修复蓝绿色偏;
- 对比度增强:采用 CLAHE 算法提升局部细节对比度,强化小目标特征;
- 去雾锐化:简化暗通道去雾抑制水体散射,用 3×3 卷积核轻度锐化,增强纹理特征。
三、模型设计与创新
1. 基础模型框架(YOLOv12)
YOLOv12 采用 "端到端" 检测流程,分为四大环节:
- 输入预处理:图像缩放、归一化 + Mosaic 增强;
- 特征提取:R-ELAN 残差结构 + A² 区域注意力模块,兼顾浅层细节与深层语义;
- 多尺度检测:PAN-FPN 特征融合,生成 3 个尺度特征图;
- 输出后处理:NMS 过滤冗余框,得到最终检测结果。
2. 核心创新优化
(1)定制化锚框设计
针对四类目标尺寸聚类,新增超小锚框适配极小扇贝:
- 超小锚框:4×6~12×18(适配面积 < 3% 的扇贝);
- 小目标锚框:6×8、10×12 等;
- 中 / 大目标锚框:22×35、70×45 等,提升锚框与目标的匹配度。
(2)网络结构改进
- 增强 A2C2f 模块:通道数提升 30%,强化小目标特征提取;
- 优化 PAN-FPN 结构:强化多尺度特征交互,平衡深浅层特征融合效率。
(3)动态加权损失函数
解决类别不平衡与小目标损失占比低问题:
- 类别权重:扇贝类别权重提升至 6.0(其他类别 1.0~1.3);
- 小目标加权:小目标定位损失权重提升 2.5 倍,边框损失额外加权 3.5 倍;
- 损失构成:边框损失权重 9.0、分类损失权重 2.0、分布损失权重 0.9。
(4)优化器配置
采用 AdamW 优化器替代原版 SGD,配置如下:
- 初始学习率:0.0006,最终学习率:0.000005;
- 动量:0.94(预热阶段 0.85),权重衰减:0.0003;
- 余弦学习率衰减 + 8 轮预热训练,避免训练震荡。
四、实验环境与训练过程
1. 实验环境
| 配置项 | 具体参数 |
|---|---|
| 硬件 | RTX4060 Laptop 8G GPU |
| 系统 | Ubuntu 22.04 / Windows 11 |
| 深度学习框架 | PyTorch 2.0+ |
| 核心库 | Ultralytics、OpenCV、NumPy |
2. 训练参数设置
| 参数名 | 取值 | 作用说明 |
|---|---|---|
| EPOCHS | 50 | 分 3 阶段:预热 (1-5)、强化 (6-30)、微调 (31-50) |
| BATCH_SIZE | 4 | 适配 GPU 显存(不足可降为 2) |
| IMG_SIZE | 640 | 输入图像统一缩放为 640×640 |
| SAVE_PERIOD | 5 | 每 5 轮保存一次模型检查点 |
| PATIENCE | 30 | 早停耐心值(30 轮无提升则停止训练) |
3. 训练过程监控
训练曲线显示模型收敛稳定:
- 训练集 box、cls、dfl 损失持续下降并趋于平稳;
- 验证集损失虽有小幅波动,但整体呈下降趋势;
- 精度、召回率、mAP 等指标逐步提升,无过拟合现象。
五、实验结果与分析
1. 核心性能指标
| 模型版本 | 精确率 (%) | 召回率 (%) | mAP@0.5(%) | mAP@0.5:0.95(%) | F1-Score(%) | 推理速度 (FPS) |
|---|---|---|---|---|---|---|
| YOLOv12 原版 | 76.15 | 53.54 | 62.63 | 35.97 | 62.88 | 45 |
| 改进版 1 | 78.15 | 66.52 | 73.03 | 40.00 | 71.87 | 40 |
| 改进版 2 | 80.10 | 68.76 | 76.11 | 44.24 | 74.00 | 38 |
| 改进版 3 | 83.25 | 77.97 | 84.58 | 49.20 | 80.52 | 36 |
2. 结果分析
- 性能提升:改进版 3 较原版,mAP@0.5 提升 21.95 个百分点,扇贝小目标召回率显著提升,解决了核心痛点;
- 速度权衡:推理速度从 45 FPS 降至 36 FPS,仍满足水下实时检测(≥30 FPS)需求;
- 现存问题:混淆矩阵显示扇贝识别准确率仅 0.50,存在背景误判情况,需进一步优化小目标与背景的区分能力。
3. 可视化效果
- 检测结果:在水下偏色、模糊场景中,海胆、海星检测置信度达 0.76-0.81,标注框定位精准;
- 系统界面:基于 PyQt5 开发可视化系统,支持模型选择、置信度调整、单张 / 批量检测,可预览结果、保存日志。
六、实训总结与未来展望
1. 实训总结
本次实训基于 YOLOv12 完成了水下目标检测模型的全流程优化与实现,核心成果如下:
- 数据层面:设计水下专用图像增强流程,解决了图像偏色、模糊问题;
- 模型层面:通过锚框定制、网络改进、损失函数优化,使 mAP@0.5 达 84.58%;
- 工程层面:开发轻量化可视化系统,支持实际场景应用。
2. 未来展望
针对现存不足,后续可从以下方向优化:
- 端到端训练:将图像增强模块融入模型,提升自适应能力;
- 轻量化部署:通过量化、知识蒸馏技术,适配嵌入式设备;
- 多模态融合:结合声呐数据,提升浑浊水体等极端环境的鲁棒性;
- 动态场景优化:引入运动模糊去除、自适应阈值,适配水下机器人移动检测;
- 成本降低:采用半监督 / 自监督学习,减少标注数据依赖。
七、附:核心代码片段
1. 图像增强代码
python
运行
import cv2
import numpy as np
def underwater_image_enhance(img):
# 1. YUV颜色校正
yuv = cv2.cvtColor(img, cv2.COLOR_BGR2YUV)
yuv[:, :, 1] = cv2.add(yuv[:, :, 1], 15) # 调整U通道
yuv[:, :, 2] = cv2.subtract(yuv[:, :, 2], 10) # 调整V通道
img_corrected = cv2.cvtColor(yuv, cv2.COLOR_YUV2BGR)
# 2. CLAHE对比度增强
lab = cv2.cvtColor(img_corrected, cv2.COLOR_BGR2LAB)
l, a, b = cv2.split(lab)
clahe = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8, 8))
l_clahe = clahe.apply(l)
img_clahe = cv2.merge((l_clahe, a, b))
img_enhanced = cv2.cvtColor(img_clahe, cv2.COLOR_LAB2BGR)
# 3. 去雾锐化
kernel = np.array([[0, -1, 0], [-1, 5, -1], [0, -1, 0]], dtype=np.float32)
img_sharpened = cv2.filter2D(img_enhanced, -1, kernel)
return img_sharpened
2. 动态加权损失函数配置
python
运行
# 类别权重配置
CLASS_WEIGHTS = [1.0, 1.2, 1.3, 6.0] # 扇贝对应索引3,权重6.0
small_obj_weight = 2.5 # 小目标损失权重
scallop_bbox_weight = 3.5 # 扇贝边框损失额外权重
def dynamic_loss_fn(pred, target):
# 计算基础损失(box, cls, dfl)
box_loss = compute_box_loss(pred, target)
cls_loss = compute_cls_loss(pred, target)
dfl_loss = compute_dfl_loss(pred, target)
# 小目标加权
small_obj_mask = target[..., 4] > 0 # 小目标掩码
box_loss = box_loss * (small_obj_mask * small_obj_weight + (1 - small_obj_mask) * 1.0)
# 扇贝目标加权
scallop_mask = target[..., 5] == 3 # 扇贝类别掩码
box_loss = box_loss * (scallop_mask * scallop_bbox_weight + (1 - scallop_mask) * 1.0)
# 类别权重加权
cls_loss = cls_loss * torch.tensor(CLASS_WEIGHTS).to(cls_loss.device)
# 最终损失融合
total_loss = 9.0 * box_loss + 2.0 * cls_loss + 0.9 * dfl_loss
return total_loss
总结
本次实训完整覆盖了计算机视觉目标检测的 "数据预处理→模型设计→训练优化→工程实现" 全流程,不仅深化了对 YOLO 系列算法的理解,更掌握了针对特定场景(水下环境)的问题分析与解决方案设计能力。后续将持续优化模型的鲁棒性与部署效率,推动技术落地到实际应用场景中。本文的代码,ppt和论文在附件