计算机视觉实训作业记录:基于 YOLOv12 的水下目标检测模型优化与实现

一、实训背景与目标

1. 实训背景

水下环境因光照不足、水体散射、图像偏色等问题,导致传统目标检测方法精度低、小目标召回率不足(仅 60%),难以满足渔业资源管理、水下机器人导航等场景的实际需求。而 YOLOv12 等深度学习算法凭借自动特征学习和多尺度优化能力,为水下目标检测提供了新的解决方案。本次实训以 URPC 水下目标检测数据集为研究对象,聚焦扇贝、海胆、海参、海星四类目标,重点解决小目标漏检、类别不平衡、水下图像质量差三大核心问题。

2. 实训目标

  • 掌握水下图像预处理与增强技术,提升数据质量;
  • 基于 YOLOv12 完成模型改进,优化小目标检测性能与类别平衡;
  • 实现模型训练、评估与可视化,核心指标 mAP@0.5 提升至 80% 以上;
  • 开发轻量化检测系统,支持单张 / 批量图像检测与结果管理。

二、数据集介绍与预处理

1. 数据集基本信息

本次实训采用 URPC 水下目标检测数据集,包含四类目标:

  • 类别分布:扇贝(15%,80% 为小目标)、海胆(40% 为小目标)、海参、海星;
  • 数据痛点:图像存在蓝绿偏色、模糊、散射干扰,标注含无效框,类别不平衡(扇贝样本稀缺)。

2. 预处理流程

(1)数据格式转换与清洗
  • 将 XML 标注文件批量转换为 YOLO 格式 txt 文件;
  • 过滤无效框、越界框,确保标注准确性;
  • 按类别均衡原则划分训练 / 验证 / 测试集,避免评估偏差。
(2)水下专用图像增强

针对水下图像质量问题,设计三步增强策略:

  1. 颜色校正:通过 YUV/LAB 颜色空间转换,调整 U、V 通道分量,修复蓝绿色偏;
  2. 对比度增强:采用 CLAHE 算法提升局部细节对比度,强化小目标特征;
  3. 去雾锐化:简化暗通道去雾抑制水体散射,用 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. 端到端训练:将图像增强模块融入模型,提升自适应能力;
  2. 轻量化部署:通过量化、知识蒸馏技术,适配嵌入式设备;
  3. 多模态融合:结合声呐数据,提升浑浊水体等极端环境的鲁棒性;
  4. 动态场景优化:引入运动模糊去除、自适应阈值,适配水下机器人移动检测;
  5. 成本降低:采用半监督 / 自监督学习,减少标注数据依赖。

七、附:核心代码片段

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和论文在附件

相关推荐
Piar1231sdafa2 小时前
蓝莓目标检测——改进YOLO11-C2TSSA-DYT-Mona模型实现
人工智能·目标检测·计算机视觉
AI浩3 小时前
C-RADIOv4(技术报告)
人工智能·目标检测
小白狮ww3 小时前
Ovis-Image:卓越的图像生成模型
人工智能·深度学习·目标检测·机器学习·cpu·gpu·视觉分割模型
LASDAaaa12314 小时前
红外图像中的鸟类目标检测:YOLOv5-SPDConv改进实践
yolo·目标检测·目标跟踪
Lun3866buzha5 小时前
涡轮叶片表面缺陷识别与分类使用YOLOv8与特征金字塔共享卷积详解及代码实现
yolo·分类·数据挖掘
星爷AG I5 小时前
9-19 视觉识别(AGI基础理论)
人工智能·计算机视觉·agi
小金子会发光6 小时前
【工业相机实战】基于 C# WinForms 的映美精(ic4)相机采集与显示全流程实现
计算机视觉·c#·视觉检测·visual studio
2501_941337066 小时前
基于YOLO11-C3k2-DeepDBB的台球目标检测与识别系统详解
人工智能·目标检测·目标跟踪
爱打代码的小林6 小时前
基于 OpenCV 的摄像头四格实时风格迁移实现
人工智能·opencv·计算机视觉