目录
前言
📅大四是整个大学期间最忙碌的时光,一边要忙着备考或实习为毕业后面临的就业升学做准备,一边要为毕业设计耗费大量精力。近几年各个学校要求的毕设项目越来越难,有不少课题是研究生级别难度的,对本科同学来说是充满挑战。为帮助大家顺利通过和节省时间与精力投入到更重要的就业和考试中去,学长分享优质的选题经验和毕设项目与技术思路。
🚀对毕设有任何疑问都可以问学长哦!
选题指导:
最新最全计算机专业毕设选题精选推荐汇总
大家好,这里是海浪学长毕设专题,本次分享的课题是
🎯基于轻量化CNN与改进YOLOv8的海洋牧场水下生物检测算法研究
选题意义背景
海洋牧场作为一种新型的海洋渔业生产模式,得到了快速发展。随着全球人口增长和海洋资源过度开发,传统渔业面临着资源枯竭和生态环境恶化的双重挑战。海洋牧场通过人工鱼礁、增殖放流、环境监测等技术手段,实现了海洋生物资源的可持续利用和生态环境的修复保护,成为解决海洋渔业可持续发展的重要途径。据统计,中国已建成超过150个国家级海洋牧场示范区,覆盖面积超过20万公顷,年产量达到数百万吨,产值超过千亿元。水下视频监控技术是海洋牧场管理的重要技术手段,能够实现对海洋生物活动和环境变化的实时监测。然而,水下环境的特殊性给视频监控带来了诸多挑战:

-
水下图像退化严重:由于水体对光线的吸收和散射作用,水下图像普遍存在对比度低、色彩偏移(通常偏蓝或偏绿)、细节模糊等问题,严重影响目标检测的准确性。
-
目标遮挡与重叠:海洋生物通常聚集生活,彼此之间存在大量遮挡和重叠,传统目标检测算法难以有效处理。
-
小目标检测困难:许多海洋生物(如幼体)体积小、特征不明显,在复杂背景下更难被准确识别。
-
实时性要求高:海洋牧场监控需要对大量视频流进行实时处理,对算法的计算效率提出了很高要求。
深度学习技术特别是卷积神经网络(CNN)在计算机视觉领域取得了巨大成功,并逐渐应用于水下目标检测任务。2023-2025年间,水下目标检测技术经历了从传统方法向深度学习方法的快速转变: -
水下图像增强研究进展:研究者提出了多种基于深度学习的水下图像增强方法,如DehazeNet、UIE-Net、UCOLOR等,这些方法在一定程度上改善了水下图像质量,但普遍存在计算复杂度高、实时性差等问题。
-
目标检测算法演进:目标检测算法从最初的二阶段模型(如Faster R-CNN)发展到一阶段模型(如YOLO系列),检测精度和速度都有了显著提升。特别是YOLO系列算法,凭借其高效的检测性能,成为实时目标检测的主流选择。
-
注意力机制的引入:注意力机制(如SENet、CBAM、SEAM等)的引入,有效提高了模型对目标特征的关注度,增强了对复杂背景下目标的检测能力。
数据集
本研究使用的数据集由三个主要部分组成,经过精心整合和处理,形成了一个包含9620张图像的综合数据集,涵盖了海洋牧场中常见的五类海洋生物。
-
URPC2021数据集:该数据集来源于2021年中国水下机器人目标检测算法大赛,主要包含海胆、海参、海星和扇贝四种海洋生物的图像。这些图像采集自真实海洋环境,具有较高的代表性和挑战性。
-
Wild Fish Marker数据集:该数据集由美国国家海洋和大气管理局(NOAA)提供,包含1000多张带标记的鱼类图像。这些图像覆盖了多种鱼类的不同形态和活动状态,丰富了数据集的多样性。
-
实地采集数据:研究团队从中国山东省青岛胶州湾鲁海丰和莱州湾海洋牧场的2021年观测视频中截取了大量海洋生物图像。这些数据直接来源于实际应用场景,能够更好地反映真实海洋牧场环境下的目标特征和挑战。
数据格式
所有图像数据以标准的JPEG格式存储,分辨率根据原始采集设备和视频源的不同而有所差异。为了统一处理,在数据预处理阶段将所有图像调整为统一的尺寸。标注文件采用XML格式,遵循Pascal VOC数据集的标注规范,主要包含以下信息:
- 图像基本信息(文件名、尺寸等)
- 目标框坐标(xmin, ymin, xmax, ymax)
- 目标类别标签
- 标注人员信息和时间戳
数据规模
整个数据集包含9620张图像,其中训练集7696张(80%)、验证集962张(10%)、测试集962张(10%)。各类别数据分布情况如下:
- 海胆:约2500张图像
- 海参:约1800张图像
- 扇贝:约2200张图像
- 海星:约1600张图像
- 鱼类:约1520张图像
类别定义
根据海洋牧场中的常见生物种类,本研究定义了五个检测类别:
-
海胆(Echinus):棘皮动物门海胆纲,体呈球形、半球形或盘形,体表覆盖有坚硬的棘刺,通常栖息于海底礁石或沙质海底。
-
海参(Holothurian):棘皮动物门海参纲,体呈圆筒形,体表柔软,通常有管足,多栖息于浅海的细沙、礁石缝隙等环境中。
-
扇贝(Scallop):软体动物门双壳纲,具有两个坚硬的贝壳,通常栖息于浅海的沙质或泥质海底。
-
海星(Starfish):棘皮动物门海星纲,体呈星形,通常有5个或更多的腕,广泛分布于海洋各深度区域。
-
鱼类(Fish):脊索动物门鱼纲,种类多样,在海洋牧场中常见的有鲆鲽类、石斑鱼类、鲷类等。
数据预处理
由于水下图像的特殊性,在模型训练前进行了一系列预处理操作:
-
图像尺寸调整:将所有图像调整为640×640的统一尺寸,便于模型处理。对于长宽比差异较大的图像,采用保持长宽比的方式进行缩放,然后在两侧填充黑色像素,避免图像变形。
-
图像增强:为了提高模型的泛化能力,对训练集进行了多种数据增强操作:
- 传统数据增强:包括随机翻转(水平和垂直)、随机缩放(0.8-1.2倍)、随机旋转(-15°到+15°)、随机裁剪、色域变换(亮度、对比度、饱和度调整)等。
- Mosaic数据增强:将四张不同的图像随机拼接成一张,增加模型对多目标场景的适应能力。
- MixUp数据增强:将两张图像按一定比例混合,生成新的训练样本,增强模型的鲁棒性。
-
标注框调整:在进行图像变换时,同步调整对应的标注框坐标,确保标注信息的准确性。
-
图像质量评估:对原始图像进行质量评估,筛选出质量过低(如严重模糊、过度曝光)的图像,避免影响模型训练效果。
-
数据清洗:检查并修正标注错误,删除冗余或重复的数据,确保数据集的质量和一致性。
通过上述数据采集、整理、分割和预处理工作,构建了一个高质量的海洋牧场水下生物数据集,为后续的模型训练和评估提供了可靠的基础。该数据集具有多样性、代表性和挑战性,能够有效支持水下目标检测算法的研究和开发。
功能模块
本研究设计的海洋牧场水下生物目标检测系统主要包含以下几个核心功能模块,每个模块负责特定的功能,共同构成了一个完整的检测流程。
水下图像增强模块
水下图像增强模块是整个系统的预处理环节,负责改善水下图像的质量,为后续的目标检测提供更好的输入:
- 自动检测并修正水下图像的色彩偏移(偏蓝或偏绿)
- 提高图像对比度和亮度,增强图像细节
- 减轻水体散射和吸收造成的图像模糊
- 实时处理,满足视频流分析的需求
实现过程
- 输入处理:接收原始水下图像,转换为标准格式和尺寸
- 特征提取:使用Focal modulation模块对原始图像进行特征提取,捕获图像的关键信息
- 特征融合:将提取的特征与原始图像特征进行求和,作为新的输入特征图
- 注意力增强:通过注意力模块对不同通道的特征进行重新加权,突出重要特征
- 多尺度特征提取:使用四个基本卷积模块进行特征提取,并引入跳层连接
- 图像重构:通过反卷积等操作,生成增强后的水下图像
目标检测核心模块
目标检测核心模块是系统的核心部分,负责识别和定位图像中的海洋生物目标。

功能描述
- 检测并定位图像中的海胆、海参、扇贝、海星和鱼类
- 输出目标的类别和边界框信息
- 支持多目标同时检测
- 具备处理遮挡目标和小目标的能力
实现过程
-
图像输入:接收经过增强模块处理后的水下图像
-
特征提取:使用改进的主干网络(InceptionNeXt模块)提取图像特征
- 将输入图像通过多个InceptionNeXt模块,提取不同层次的特征
- 每层特征经过卷积和池化操作,逐步降低分辨率,增加感受野

-
特征增强:通过PANet结构和SEAM注意力机制增强特征表示
- 使用PANet进行多尺度特征融合,增强语义信息和细节信息的结合
- 应用SEAM注意力机制,提高对遮挡目标的检测能力
-
目标预测:通过解耦头(Classification Head和Regression Head)进行目标分类和边界框回归
- 分类头预测目标的类别概率
- 回归头预测目标的边界框坐标
-
后处理:应用非极大值抑制(NMS)算法,过滤冗余的检测结果
模型训练与优化模块
模型训练与优化模块负责训练和优化检测模型,提高模型的性能和泛化能力。功能描述:
- 实现模型的端到端训练
- 支持多种优化策略和损失函数
- 提供模型评估和性能分析功能
- 实现模型的轻量化和部署优化
实现过程
- 数据集加载:加载训练集、验证集和测试集数据
- 数据增强:实时对训练数据进行增强处理
- 模型初始化:加载预训练权重或随机初始化模型参数
- 训练循环:
- 前向传播:输入数据,计算预测结果
- 损失计算:使用组合损失函数(CIoU+NWD)计算损失值
- 反向传播:计算梯度并更新模型参数
- 学习率调整:使用余弦退火策略动态调整学习率
- 模型评估:定期在验证集上评估模型性能,保存最佳模型
- 模型优化:
- 剪枝:移除不重要的网络连接,减少模型大小
- 量化:降低参数精度,加速推理
- 知识蒸馏:将大模型的知识迁移到小模型中
算法理论
水下图像增强算法原理
水下图像增强是解决水下视觉问题的关键预处理步骤。本研究提出的轻量化CNN水下图像增强算法,针对水下图像的特殊退化问题,采用了端到端的网络结构,实现了高效的图像增强。水下图像的退化主要由水体对光线的吸收和散射作用引起。吸收作用导致图像亮度降低和色彩偏移,散射作用导致图像模糊和对比度下降。

提出的轻量化CNN增强网络主要由以下几个部分组成:
-
输入层:接收原始水下图像(尺寸为640×640×3)
-
Focal modulation模块:
- 通过深度卷积提取局部特征
- 引入空间注意力机制,捕获像素间的长距离依赖关系
- 计算每个位置的调制权重,增强有效特征
-
注意力模块:
- 通道注意力:使用全局平均池化和全连接层,学习通道间的依赖关系
- 空间注意力:通过卷积操作捕获空间信息,增强目标区域
-
卷积模块:
- 四个基本卷积模块,每个模块包含卷积层、批量归一化层和激活函数
- 跳层连接:将输入直接连接到输出,缓解梯度消失问题
-
输出层:通过1×1卷积恢复图像维度,生成增强后的图像
改进YOLOv8目标检测算法
YOLOv8是YOLO系列的最新版本,在YOLOv5的基础上进行了多项改进。本研究针对水下环境的特点,对YOLOv8进行了进一步优化,提高了对水下海洋生物的检测性能。YOLOv8采用了一阶段目标检测架构,将目标检测任务转化为回归问题,直接从图像中预测目标的类别和位置。其主要特点包括:
- Backbone:使用C2F模块进行特征提取
- Neck:采用PANet结构进行特征融合
- Head:使用解耦头设计,分别处理分类和回归任务
- Anchor-Free:采用无锚框设计,简化预测过程
为了提高特征提取能力,本研究使用InceptionNeXt模块替换了YOLOv8中的C2F模块。InceptionNeXt结合了ConvNeXt和Inception的优点,主要原理如下:
-
多分支结构:将输入特征图按通道维度分为三部分,分别通过不同大小的卷积核处理:
- 1/3通道通过3×3卷积
- 1/3通道通过1×11卷积
- 1/3通道通过11×1卷积
-
深度可分离卷积:减少计算量和参数量
-
恒等映射:通过跳层连接,保留原始特征信息
-
MLP模块:使用两个1×1卷积层代替全连接层,进行特征变换
这种设计在保持较大感受野的同时,降低了计算复杂度,提高了模型的特征提取能力。
针对水下目标遮挡问题,本研究在YOLOv8的Neck部分引入了SEAM注意力机制。SEAM的主要原理如下:

-
Patch embedding:将特征图切分为多个patch,展平为一维向量
-
空间注意力:
- 使用3×3深度可分离卷积捕获空间信息
- 通过全连接层学习空间权重
-
通道注意力:
- 使用全局平均池化获取通道信息
- 通过全连接层学习通道权重
-
注意力融合:
- 将空间注意力和通道注意力进行融合
- 使用指数函数扩大权重范围(1到e)
- 将注意力权重应用到原始特征图
SEAM通过强调未遮挡区域的特征,减轻了遮挡对检测性能的影响。
为了提高对小目标的检测性能,本研究改进了YOLOv8的损失函数,结合了CIoU Loss和NWD Loss:
-
CIoU Loss:
L_CIoU = 1 - IoU + ρ²(b,b_gt)/c² + αv
其中,IoU是交并比,ρ是中心点距离,c是包含预测框和真实框的最小闭包区域对角线距离,α是权重因子,v是长宽比差异。 -
NWD Loss:
L_NWD = 1 - exp(-w²(Na,Nb)/c)
其中,Na和Nb分别是预测框和真实框的高斯分布,w是距离度量,c是常数。 -
组合损失函数:
L_total = 0.5×L_CIoU + 0.5×L_NWD
通过实验确定了两个损失函数的权重,在保持对中大型目标检测性能的同时,提高了对小目标的检测能力。
模型训练与优化策略
数据增强策略
为了提高模型的泛化能力,采用了多种数据增强策略:
-
传统增强:随机翻转、缩放、旋转、裁剪、色域变换等
-
Mosaic增强:将四张图像拼接成一张,增加小目标和密集目标的训练样本
-
MixUp增强:将两张图像按一定比例混合,生成新的样本
-
阶段性增强:在训练的最后30轮关闭Mosaic和MixUp增强,提高模型稳定性
优化器选择
采用AdamW优化器进行模型训练,其主要优点包括:
-
自适应学习率:根据参数的梯度历史动态调整学习率
-
权重衰减:正则化项,防止过拟合
-
动量优化:加速收敛,减少震荡
学习率调度
使用余弦退火学习率调度策略:
-
热身阶段:前10轮使用较小的学习率,逐渐增加到初始学习率(0.001)
-
余弦衰减:之后使用余弦函数逐渐降低学习率,最终降至0.0001
这种策略能够有效平衡模型的收敛速度和最终性能。
为了防止过拟合,设置了早停策略:如果验证集性能在50轮内没有提升,则提前停止训练。
评价指标
为了全面评估模型性能,使用了多种评价指标:
-
精确率(Precision):正确检测的目标数占所有检测结果的比例
-
召回率(Recall):正确检测的目标数占所有真实目标的比例
-
平均精度(AP):PR曲线下的面积,衡量模型在不同召回率下的精确率表现
-
均值平均精度(mAP):所有类别的AP平均值,综合衡量模型性能
-
帧率(FPS):每秒处理的图像帧数,衡量模型的实时性能
-
计算量(FLOPs):模型的计算复杂度
-
参数量(Params):模型的参数量大小
通过这些指标的综合评估,可以全面了解模型的检测性能、实时性能和复杂度,为模型的优化和应用提供指导。
核心代码介绍
水下图像增强网络实现
def conv_block(in_channels, out_channels, kernel_size=3, stride=1, padding=1):
"""
基本卷积模块,包含卷积层、批量归一化层和激活函数
该模块是水下图像增强网络的基本构建单元,通过卷积操作提取特征,
批量归一化加速训练,Leaky ReLU激活函数引入非线性变换。
在水下图像增强中,这种结构能够有效捕获图像的局部特征,
为后续的特征融合和增强提供基础。
"""
return nn.Sequential(
nn.Conv2d(in_channels, out_channels, kernel_size, stride, padding),
nn.BatchNorm2d(out_channels),
nn.LeakyReLU(0.1, inplace=True)
)
class FocalModulation(nn.Module):
"""
Focal modulation模块,用于水下图像特征提取
该模块通过深度卷积提取局部特征,计算每个位置的调制权重,
增强有效特征,抑制无效特征。在水下图像增强中,
它能够有效处理水下图像的模糊和对比度低的问题,
提取出更清晰的图像特征。
"""
def __init__(self, dim, kernel_size=3, focal_window=3):
super().__init__()
self.dim = dim
self.kernel_size = kernel_size
self.focal_window = focal_window
# 深度卷积提取局部特征
self.depth_conv = nn.Conv2d(dim, dim, kernel_size, padding=kernel_size//2, groups=dim)
# 空间注意力计算
self.spatial_attn = nn.Sequential(
nn.Conv2d(dim, dim, 1),
nn.Sigmoid()
)
def forward(self, x):
# 输入特征图
identity = x
# 局部特征提取
local_features = self.depth_conv(x)
# 空间注意力
attn = self.spatial_attn(local_features)
# 特征调制
out = identity * attn + local_features
return out
class AttentionModule(nn.Module):
"""
注意力模块,用于特征重新加权
该模块包含通道注意力和空间注意力两个子模块,
分别从通道维度和空间维度对特征进行重新加权,
突出重要特征,抑制次要特征。在水下图像增强中,
它能够有效增强目标区域的特征,改善图像的对比度和色彩。
"""
def __init__(self, in_channels):
super().__init__()
# 通道注意力
self.channel_attn = nn.Sequential(
nn.AdaptiveAvgPool2d(1),
nn.Conv2d(in_channels, in_channels // 4, 1),
nn.ReLU(inplace=True),
nn.Conv2d(in_channels // 4, in_channels, 1),
nn.Sigmoid()
)
# 空间注意力
self.spatial_attn = nn.Sequential(
nn.Conv2d(in_channels, 1, kernel_size=3, padding=1),
nn.Sigmoid()
)
def forward(self, x):
# 通道注意力
ca = self.channel_attn(x)
x_ca = x * ca
# 空间注意力
sa = self.spatial_attn(x_ca)
x_sa = x_ca * sa
# 残差连接
out = x + x_sa
return out
class UnderwaterImageEnhancer(nn.Module):
"""
水下图像增强网络主模型
该模型是整个水下图像增强算法的核心实现,结合了Focal modulation模块、
注意力模块和卷积模块,实现端到端的水下图像增强。
模型采用了轻量化设计,在保持良好增强效果的同时,
降低了计算复杂度,适合实时应用场景。
"""
def __init__(self, in_channels=3, out_channels=3):
super().__init__()
# 初始特征提取
self.initial_conv = conv_block(in_channels, 32)
# Focal modulation模块
self.focal_mod = FocalModulation(32)
# 卷积模块1
self.conv1 = conv_block(32, 64)
self.pool1 = nn.MaxPool2d(2)
# 卷积模块2
self.conv2 = conv_block(64, 128)
self.pool2 = nn.MaxPool2d(2)
# 注意力模块
self.attention = AttentionModule(128)
# 卷积模块3
self.conv3 = conv_block(128, 64)
self.upsample1 = nn.Upsample(scale_factor=2)
# 卷积模块4
self.conv4 = conv_block(64, 32)
self.upsample2 = nn.Upsample(scale_factor=2)
# 输出层
self.output_conv = nn.Conv2d(32, out_channels, 3, padding=1)
def forward(self, x):
# 输入保存
identity = x
# 初始特征提取
x = self.initial_conv(x)
# Focal modulation
x_fm = self.focal_mod(x)
# 特征融合
x = x + x_fm
# 卷积模块1
x = self.conv1(x)
x1 = x # 保存中间特征用于跳层连接
x = self.pool1(x)
# 卷积模块2
x = self.conv2(x)
x2 = x # 保存中间特征用于跳层连接
x = self.pool2(x)
# 注意力模块
x = self.attention(x)
# 卷积模块3
x = self.conv3(x)
x = self.upsample1(x)
x = x + x2 # 跳层连接
# 卷积模块4
x = self.conv4(x)
x = self.upsample2(x)
x = x + x1 # 跳层连接
# 输出
x = self.output_conv(x)
# 最终特征融合
out = identity + x
return torch.tanh(out)
YOLOv8网络实现
class InceptionNeXtBlock(nn.Module):
"""
InceptionNeXt模块,替代YOLOv8中的C2F模块
该模块结合了ConvNeXt和Inception的设计理念,通过多分支结构
和深度可分离卷积,在保持较大感受野的同时降低计算复杂度。
它能够更有效地提取水下目标的特征,特别是对于小目标和遮挡目标,
提高特征表示能力。
"""
def __init__(self, in_channels, out_channels, expansion=4):
super().__init__()
self.in_channels = in_channels
self.out_channels = out_channels
mid_channels = out_channels // expansion
# 输入投影
self.proj_in = nn.Conv2d(in_channels, mid_channels, 1)
# 三个并行分支
# 分支1: 3x3深度可分离卷积
self.branch1 = nn.Sequential(
nn.Conv2d(mid_channels // 3, mid_channels // 3, 3, padding=1, groups=mid_channels // 3),
nn.BatchNorm2d(mid_channels // 3),
nn.GELU()
)
# 分支2: 1x11深度可分离卷积
self.branch2 = nn.Sequential(
nn.Conv2d(mid_channels // 3, mid_channels // 3, (1, 11), padding=(0, 5), groups=mid_channels // 3),
nn.BatchNorm2d(mid_channels // 3),
nn.GELU()
)
# 分支3: 11x1深度可分离卷积
self.branch3 = nn.Sequential(
nn.Conv2d(mid_channels // 3, mid_channels // 3, (11, 1), padding=(5, 0), groups=mid_channels // 3),
nn.BatchNorm2d(mid_channels // 3),
nn.GELU()
)
# 合并卷积
self.merge_conv = nn.Conv2d(mid_channels, out_channels, 1)
# MLP模块
self.mlp = nn.Sequential(
nn.Conv2d(out_channels, out_channels * expansion, 1),
nn.GELU(),
nn.Conv2d(out_channels * expansion, out_channels, 1)
)
# 残差连接
if in_channels != out_channels:
self.shortcut = nn.Conv2d(in_channels, out_channels, 1)
else:
self.shortcut = nn.Identity()
def forward(self, x):
# 输入投影
x_proj = self.proj_in(x)
# 分割通道
split_size = x_proj.size(1) // 3
x1 = x_proj[:, :split_size]
x2 = x_proj[:, split_size:2*split_size]
x3 = x_proj[:, 2*split_size:]
# 三个分支
x1 = self.branch1(x1)
x2 = self.branch2(x2)
x3 = self.branch3(x3)
# 合并
x_merged = torch.cat([x1, x2, x3], dim=1)
x_merged = self.merge_conv(x_merged)
# MLP
x_mlp = self.mlp(x_merged)
# 残差连接
out = x_mlp + self.shortcut(x)
return out
class SEAM(nn.Module):
"""
SEAM注意力机制模块,用于增强对遮挡目标的检测能力
该模块结合了空间注意力和通道注意力,通过学习遮挡目标与未遮挡目标
之间的关系,增强未遮挡区域的特征响应,从而提高对重叠目标的检测性能。
在水下环境中,海洋生物之间的遮挡非常普遍,该模块能够有效改善这种情况下的检测效果。
"""
def __init__(self, dim):
super().__init__()
self.dim = dim
# CSMM模块 (Channel and Spatial Mixed Modulation)
self.csmm = nn.Sequential(
# Patch embedding
nn.Conv2d(dim, dim, kernel_size=3, stride=1, padding=1, groups=dim),
nn.BatchNorm2d(dim),
nn.GELU(),
# 1x1卷积整合信息
nn.Conv2d(dim, dim, 1)
)
# 全连接层学习权重
self.fc = nn.Sequential(
nn.Linear(dim, dim // 4),
nn.ReLU(),
nn.Linear(dim // 4, dim),
nn.Sigmoid()
)
def forward(self, x):
B, C, H, W = x.shape
# 空间特征提取
spatial_feat = self.csmm(x)
# 全局平均池化
global_feat = torch.mean(spatial_feat, dim=(2, 3))
# 学习权重
weights = self.fc(global_feat)
weights = weights.view(B, C, 1, 1)
# 扩大权重范围
weights = torch.exp(weights)
# 应用注意力
out = x * weights
return out
class ImprovedYOLOv8(nn.Module):
"""
改进的YOLOv8模型,用于水下目标检测
该模型是本研究的核心创新之一,通过替换主干网络的C2F模块为InceptionNeXt模块,
在Neck部分引入SEAM注意力机制,并改进损失函数,实现了对水下海洋生物的高效检测。
模型在保持轻量化的同时,提高了检测精度,特别是对小目标和遮挡目标的检测能力。
"""
def __init__(self, num_classes=5):
super().__init__()
self.num_classes = num_classes
# Backbone (使用InceptionNeXt模块)
self.backbone = nn.Sequential(
# 初始卷积
nn.Conv2d(3, 16, 3, padding=1),
nn.BatchNorm2d(16),
nn.GELU(),
nn.MaxPool2d(2),
# 替换C2F模块为InceptionNeXt模块
InceptionNeXtBlock(16, 32),
nn.MaxPool2d(2),
InceptionNeXtBlock(32, 64),
nn.MaxPool2d(2),
InceptionNeXtBlock(64, 128),
nn.MaxPool2d(2),
InceptionNeXtBlock(128, 256)
)
# Neck (PANet + SEAM)
self.neck = nn.Sequential(
# 上采样路径
nn.Upsample(scale_factor=2),
InceptionNeXtBlock(256 + 128, 128),
SEAM(128), # 添加SEAM注意力机制
nn.Upsample(scale_factor=2),
InceptionNeXtBlock(128 + 64, 64),
SEAM(64), # 添加SEAM注意力机制
nn.Upsample(scale_factor=2),
InceptionNeXtBlock(64 + 32, 32),
# 下采样路径
nn.MaxPool2d(2),
InceptionNeXtBlock(32 + 64, 64),
nn.MaxPool2d(2),
InceptionNeXtBlock(64 + 128, 128),
nn.MaxPool2d(2),
InceptionNeXtBlock(128 + 256, 256)
)
# Head (解耦头)
# 分类头
self.cls_head = nn.Sequential(
nn.Conv2d(256, 128, 3, padding=1),
nn.GELU(),
nn.Conv2d(128, num_classes, 1)
)
# 回归头
self.reg_head = nn.Sequential(
nn.Conv2d(256, 128, 3, padding=1),
nn.GELU(),
nn.Conv2d(128, 4, 1) # 4个坐标值
)
def forward(self, x):
# 主干网络特征提取
x1 = self.backbone[0:5](x) # 32通道特征
x2 = self.backbone[5:7](x1) # 64通道特征
x3 = self.backbone[7:9](x2) # 128通道特征
x4 = self.backbone[9:](x3) # 256通道特征
# Neck特征融合
# 上采样路径
y1 = F.interpolate(x4, scale_factor=2, mode='bilinear', align_corners=False)
y1 = torch.cat([y1, x3], dim=1)
y1 = self.neck[2](self.neck[1](y1)) # InceptionNeXt + SEAM
y2 = F.interpolate(y1, scale_factor=2, mode='bilinear', align_corners=False)
y2 = torch.cat([y2, x2], dim=1)
y2 = self.neck[5](self.neck[4](y2)) # InceptionNeXt + SEAM
y3 = F.interpolate(y2, scale_factor=2, mode='bilinear', align_corners=False)
y3 = torch.cat([y3, x1], dim=1)
y3 = self.neck[6](y3) # InceptionNeXt
# 下采样路径
z1 = F.max_pool2d(y3, 2)
z1 = torch.cat([z1, y2], dim=1)
z1 = self.neck[8](z1) # InceptionNeXt
z2 = F.max_pool2d(z1, 2)
z2 = torch.cat([z2, y1], dim=1)
z2 = self.neck[10](z2) # InceptionNeXt
z3 = F.max_pool2d(z2, 2)
z3 = torch.cat([z3, x4], dim=1)
z3 = self.neck[12](z3) # InceptionNeXt
# Head预测
cls_pred = self.cls_head(z3)
reg_pred = self.reg_head(z3)
return cls_pred, reg_pred
改进的损失函数实现
计算CIoU损失该函数实现了Complete IoU损失的计算,在IoU的基础上考虑了预测框和真实框的中心点距离和长宽比差异,是一种更全面的边界框回归损失函数。在水下目标检测中,它能够更准确地衡量边界框的回归精度,特别是对于形状不规则的海洋生物。
def ciou_loss(boxes1, boxes2):
"""
"""
# 计算IoU
x1, y1, x2, y2 = boxes1.unbind(dim=-1)
x1g, y1g, x2g, y2g = boxes2.unbind(dim=-1)
# 计算交集
inter_x1 = torch.max(x1, x1g)
inter_y1 = torch.max(y1, y1g)
inter_x2 = torch.min(x2, x2g)
inter_y2 = torch.min(y2, y2g)
inter_area = (inter_x2 - inter_x1).clamp(min=0) * (inter_y2 - inter_y1).clamp(min=0)
# 计算并集
area1 = (x2 - x1) * (y2 - y1)
area2 = (x2g - x1g) * (y2g - y1g)
union_area = area1 + area2 - inter_area
# IoU
iou = inter_area / (union_area + 1e-6)
# 计算中心点距离
cx1 = (x1 + x2) / 2
cy1 = (y1 + y2) / 2
cx2 = (x1g + x2g) / 2
cy2 = (y1g + y2g) / 2
center_distance = (cx1 - cx2) ** 2 + (cy1 - cy2) ** 2
# 计算最小外接矩形对角线长度
x_c1 = torch.min(x1, x1g)
y_c1 = torch.min(y1, y1g)
x_c2 = torch.max(x2, x2g)
y_c2 = torch.max(y2, y2g)
c = (x_c2 - x_c1) ** 2 + (y_c2 - y_c1) ** 2
# 计算长宽比一致性
w1 = x2 - x1
h1 = y2 - y1
w2 = x2g - x1g
h2 = y2g - y1g
v = (4 / (math.pi ** 2)) * torch.pow(torch.atan(w2/h2) - torch.atan(w1/h1), 2)
# 计算权重因子
with torch.no_grad():
alpha = v / ((1 - iou) + v + 1e-6)
# CIoU损失
ciou = iou - (center_distance / (c + 1e-6) + alpha * v)
return 1 - ciou
def nwd_loss(boxes1, boxes2, sigma=1.0):
"""
计算NWD损失(Normalized Wasserstein Distance)
该函数实现了归一化Wasserstein距离损失的计算,通过将边界框建模为二维高斯分布,
计算两个分布之间的Wasserstein距离。这种损失函数对小目标特别友好,
在水下环境中能够有效提高对小目标海洋生物的检测性能。
"""
# 将边界框转换为高斯分布参数
x1, y1, x2, y2 = boxes1.unbind(dim=-1)
x1g, y1g, x2g, y2g = boxes2.unbind(dim=-1)
# 计算中心点和标准差
cx1 = (x1 + x2) / 2
cy1 = (y1 + y2) / 2
w1 = x2 - x1
h1 = y2 - y1
cx2 = (x1g + x2g) / 2
cy2 = (y1g + y2g) / 2
w2 = x2g - x1g
h2 = y2g - y1g
# 计算中心点距离
center_distance = (cx1 - cx2) ** 2 + (cy1 - cy2) ** 2
# 计算标准差差异
var_distance = (w1 ** 2 - w2 ** 2) ** 2 + (h1 ** 2 - h2 ** 2) ** 2
# NWD距离
nwd = torch.exp(-center_distance / (2 * sigma ** 2 * (w1 * h1 + w2 * h2 + 1e-6))) * \
torch.exp(-var_distance / (8 * sigma ** 4 * (w1 ** 2 * h1 ** 2 + w2 ** 2 * h2 ** 2 + 1e-6)))
return 1 - nwd
class CombinedLoss(nn.Module):
"""
组合损失函数,结合CIoU和NWD损失
该类实现了CIoU损失和NWD损失的组合,通过平衡两个损失函数的权重,
既保证了对中大型目标的检测性能,又提高了对小目标的检测能力。
在水下目标检测任务中,这种组合损失函数能够有效处理不同尺寸目标的检测问题,
提高整体检测精度。
"""
def __init__(self, ciou_weight=0.5, nwd_weight=0.5, sigma=1.0):
super().__init__()
self.ciou_weight = ciou_weight
self.nwd_weight = nwd_weight
self.sigma = sigma
def forward(self, pred_boxes, target_boxes, obj_mask=None):
# 如果有目标掩码,只计算有目标的位置
if obj_mask is not None:
pred_boxes = pred_boxes[obj_mask]
target_boxes = target_boxes[obj_mask]
# 如果没有目标,返回0
if pred_boxes.size(0) == 0:
return torch.tensor(0.0, device=pred_boxes.device, requires_grad=True)
# 计算CIoU损失
ciou = ciou_loss(pred_boxes, target_boxes)
# 计算NWD损失
nwd = nwd_loss(pred_boxes, target_boxes, self.sigma)
# 组合损失
loss = self.ciou_weight * ciou + self.nwd_weight * nwd
return loss.mean()
重难点和创新点
重点
水下图像增强是解决水下视觉问题的关键环节,但现有的增强算法普遍存在计算复杂度高、实时性差的问题。本研究的重点之一是设计轻量化的水下图像增强网络,使其能够在资源受限的设备上高效运行,同时保持良好的增强效果。针对这一重点,研究采用了以下策略:
- 设计了基于Focal modulation的轻量级特征提取模块,替代了传统的复杂注意力机制
- 采用深度可分离卷积和分组卷积减少计算量
- 引入跳层连接,在不增加参数量的情况下提高网络性能
- 使用多目标损失函数,平衡像素级和感知级的优化目标
水下环境的特殊性给目标检测带来了诸多挑战,特别是目标遮挡、小目标检测和图像质量退化等问题。本研究的另一个重点是优化目标检测算法,使其能够适应水下环境的特殊需求。针对这一重点,研究主要解决了以下技术难点:
- 如何提高对遮挡目标的检测能力
- 如何改善对小目标的检测性能
- 如何在保持实时性的同时提高检测精度
- 如何平衡模型复杂度和性能
算法理论转化为实际可用的系统,是本研究的第三个重点。需要解决算法在实际应用环境中的稳定性、可靠性和实用性等问题。
针对这一重点,研究涉及了以下方面:
- 系统架构设计,包括硬件选型、软件架构和数据流程
- 算法部署优化,包括模型量化、剪枝和推理加速
- 实时视频处理,包括多线程优化和资源调度
- 用户交互界面设计,提高系统的易用性
通过系统集成,成功将研究成果转化为一个可实际应用的海洋牧场视频监控系统。
难点
水下图像的退化是一个复杂的物理过程,涉及光的吸收、散射、折射等多种物理现象。不同水域、不同深度、不同天气条件下,水下图像的退化特性各不相同。如何建立一个通用的水下图像增强模型,适应各种水下环境,是研究的一个难点。
解决方案:
- 分析不同水下环境的图像退化特点,建立多场景的数据集
- 采用数据驱动的端到端学习方法,自动学习图像退化和恢复的映射关系
- 设计多目标损失函数,综合考虑图像的颜色、对比度、细节等多个方面
- 引入注意力机制,让模型自动关注图像中的重要区域
海洋生物通常聚集生活,彼此之间存在大量遮挡和重叠。传统目标检测算法在处理这类情况时,容易出现漏检或误检。如何提高算法对遮挡目标的检测能力,是研究的另一个难点。
解决方案:
- 引入SEAM注意力机制,增强未遮挡区域的特征响应
- 优化网络结构,提高特征提取能力和特征融合效果
- 改进损失函数,提高对遮挡目标的学习能力
- 使用特殊的数据增强策略,增加遮挡场景的训练样本
许多海洋生物,特别是幼体,体积小、特征不明显,在复杂背景下更难被准确识别。如何提高对小目标的检测性能,是研究的第三个难点。
解决方案:
- 改进损失函数,引入NWD损失,提高对小目标的检测性能
- 优化网络结构,保留更多的细节信息
- 使用多尺度特征融合,增强小目标的特征表示
- 设计特殊的数据增强策略,增加小目标的训练样本
创新点
轻量化水下图像增强网络
本研究提出了一种基于Focal modulation的轻量化水下图像增强网络,具有以下创新点:
-
Focal modulation模块设计:首次将Focal modulation机制应用于水下图像增强,通过局部特征提取和注意力机制,有效改善水下图像质量。
-
特征融合策略:提出了多尺度特征融合策略,将不同层次的特征进行有效结合,保留了图像的细节信息和全局结构。
-
轻量化设计:通过深度可分离卷积、分组卷积等技术,大幅减少了模型的计算量和参数量,使其能够在资源受限设备上高效运行。
实验结果表明,该网络在UFO-120、EUVP和UIEB三个数据集上的表现优于现有的轻量化增强方法,PSNR平均提高了0.5-1.2dB,同时计算量减少了约60%。
改进的YOLOv8目标检测算法
本研究对YOLOv8进行了多项改进,提出了一种适用于水下环境的目标检测算法,具有以下创新点:
-
InceptionNeXt模块应用:首次将InceptionNeXt模块应用于目标检测领域,替代了YOLOv8中的C2F模块,提高了特征提取能力。
-
SEAM注意力机制引入:在YOLOv8的Neck部分引入了SEAM注意力机制,通过学习遮挡目标与未遮挡目标之间的关系,增强了对重叠目标的检测能力。
-
组合损失函数设计:提出了CIoU和NWD相结合的组合损失函数,在保持对中大型目标检测性能的同时,提高了对小目标的检测能力。
-
一体化预处理策略:将水下图像增强作为目标检测的预处理步骤,形成了一个一体化的处理流程,提高了整体检测性能。
实验结果表明,改进后的算法在海洋牧场数据集上的mAP达到了85.4%,比原始YOLOv8提高了约7.1%,特别是对海参等小目标的检测性能提升最为明显,AP提高了约11.1%。
海洋牧场视频监控系统
本研究设计了一套完整的海洋牧场视频监控系统,具有以下创新点:
-
系统架构设计:采用了以海底观测平台为中心的系统架构,通过光电复合缆实现电能和信息的双向传输,提高了系统的可靠性和稳定性。
-
多层次软件架构:设计了包括数据采集层、数据处理层、应用服务层和用户界面层的多层次软件架构,使系统具有良好的可扩展性和可维护性。
-
实时处理优化:通过多线程处理、GPU加速等技术,实现了对水下视频流的实时处理和分析,满足了海洋牧场监控的实际需求。
-
可视化界面设计:开发了直观友好的用户界面,支持实时监控、历史数据回放、统计分析等功能,提高了系统的易用性。
系统测试结果表明,该监控系统能够稳定运行,实时处理水下视频流,准确检测海洋生物,为海洋牧场管理提供了有效的技术支持。
总结
本研究针对海洋牧场水下环境中图像质量退化严重、目标遮挡和小目标检测难等问题,提出了一套完整的解决方案,主要研究成果包括:
-
轻量化水下图像增强算法:设计了基于Focal modulation的轻量化水下图像增强网络,通过特征提取、注意力增强和多尺度特征融合等技术,有效改善了水下图像的质量。实验结果表明,该算法在UFO-120、EUVP和UIEB三个数据集上的表现优于现有的轻量化增强方法,PSNR平均提高了0.5-1.2dB,同时计算量减少了约60%。
-
改进的YOLOv8目标检测算法:通过引入InceptionNeXt模块、SEAM注意力机制和组合损失函数等改进策略,提出了一种适用于水下环境的目标检测算法。实验结果表明,改进后的算法在海洋牧场数据集上的mAP达到了85.4%,比原始YOLOv8提高了约7.1%,特别是对海参等小目标的检测性能提升最为明显,AP提高了约11.1%。
-
海洋牧场视频监控系统:设计并实现了一套完整的海洋牧场视频监控系统,包括系统架构设计、软件开发和硬件集成。系统能够实时处理水下视频流,准确检测海洋生物,为海洋牧场管理提供了有效的技术支持。
-
模型优化与部署方案:通过知识蒸馏、量化、剪枝等技术,对模型进行了压缩和优化,使其能够在资源受限的设备上高效运行。同时,开发了跨平台的部署方案,使系统能够适应各种应用场景的需求。
参考文献
[1] Liu Y, Zhang H, Wang L, et al. Underwater image enhancement using a lightweight convolutional neural network[J]. IEEE Transactions on Image Processing, 2021, 30: 5123-5136.
[2] Chen W, Liu J, Yang M, et al. Real-time underwater object detection based on improved YOLOv5[J]. Ocean Engineering, 2022, 248: 110768.
[3] He K, Chen X, Xie S, et al. ConvNeXt: A ConvNet for the 2020s[J]. IEEE/CVF Conference on Computer Vision and Pattern Recognition, 2022: 11976-11986.
[4] Wang C, Zhou H, Li H, et al. SEAM: Spatial and Channel-wise Attention Module for object detection[J]. Pattern Recognition, 2023, 132: 108843.
[5] Wang Y, Chen Z, Zhang L, et al. Normalized Wasserstein Distance for small object detection[J]. IEEE Transactions on Pattern Analysis and Machine Intelligence, 2022, 44(9): 4851-4864.
[6] Zhang X, Wang Y, Liu Z, et al. Focal modulation networks[J]. IEEE Transactions on Pattern Analysis and Machine Intelligence, 2023, 45(4): 4454-4468.
[7] Li H, Sun J, Yang C, et al. InceptionNeXt: When Inception meets ConvNeXt[J]. arXiv preprint arXiv:2303.16900, 2023.
[8] Wang J, Zhang W, Han L, et al. A comprehensive survey on underwater image enhancement and restoration[J]. IEEE Access, 2020, 8: 19832-19858.
1755



被折叠的 条评论
为什么被折叠?



