目录
前言
📅大四是整个大学期间最忙碌的时光,一边要忙着备考或实习为毕业后面临的就业升学做准备,一边要为毕业设计耗费大量精力。近几年各个学校要求的毕设项目越来越难,有不少课题是研究生级别难度的,对本科同学来说是充满挑战。为帮助大家顺利通过和节省时间与精力投入到更重要的就业和考试中去,学长分享优质的选题经验和毕设项目与技术思路。
🚀对毕设有任何疑问都可以问学长哦!
选题指导:
最新最全计算机专业毕设选题精选推荐汇总
大家好,这里是海浪学长毕设专题,本次分享的课题是
🎯基于深度学习的城市场景实时实例分割技术研究
选题意义背景
城市场景中的实例分割技术在2023-2025年间已成为计算机视觉领域的研究热点,其在自动驾驶、智能监控、机器人导航等领域具有广阔的应用前景。随着城市化进程的加速和智能交通系统的普及,城市场景中的车辆、行人等目标的精确检测与分割变得尤为重要。这些技术能够为自动驾驶车辆提供关键的环境感知能力,帮助车辆准确识别道路上的各种目标,从而做出正确的决策,提高行车安全性。深度学习技术的快速发展推动了实例分割算法的进步,但城市场景下的实例分割仍然面临诸多挑战。首先,城市场景中目标种类繁多、尺度变化大,不同车辆的形状和大小差异显著,这对模型的特征提取能力提出了更高要求。其次,城市场景中的目标经常出现遮挡、重叠等情况,这增加了实例分割的难度。此外,边缘计算设备在智能交通系统中的广泛应用,对实例分割模型的轻量化和实时性提出了严格要求。

现有的实例分割算法在城市场景下的应用存在一些不足。传统的两阶段实例分割算法如Mask R-CNN虽然精度较高,但计算复杂度大,无法满足实时处理的需求。单阶段实例分割算法如YOLACT虽然速度较快,但在复杂城市场景下的检测精度和鲁棒性仍有待提高。同时,现有的轻量化模型往往在精度和速度之间难以取得良好平衡,特别是在目标尺度变化大、遮挡严重的城市场景中。研究适用于城市场景的高精度、实时、轻量化的实例分割算法具有重要的理论意义和实际应用价值。本研究旨在通过改进现有的实例分割算法,解决城市场景中实例分割面临的挑战,提高模型的检测精度、实时性能和轻量化程度,为智能交通系统、自动驾驶等领域提供技术支持。
数据集
本研究使用的主要数据集基于MS COCO数据集,这是当前实例分割领域最常用的大规模数据集之一。MS COCO数据集包含80种不同物体类别,涵盖了城市场景中的大部分常见目标。为了使实验数据更加适用于城市场景下的车辆实例分割任务,研究人员对原始数据集进行了精心的筛选和处理。
数据获取方式:MS COCO数据集可以通过其官方网站或GitHub仓库免费获取。研究中使用的是MS COCO 2017版本,该版本包括训练集、验证集和测试集三部分。训练集包含约115000张图像,验证集包含5000张图像,测试集包含约20000张图像。
数据筛选与处理:为了聚焦于城市场景中的车辆目标,研究人员从MS COCO数据集中抽取了与车辆相关的五个类别作为主要研究对象,包括汽车类、卡车类、公共汽车类、摩托车类和自行车类。训练集一共选取了9880张包含这五类车辆的图像,并对相应的标签文件进行了处理,确保每个图像中的车辆目标都有准确的边界框和实例分割标注。验证集则从MS COCO验证集中抽取了870张包含相同五类车辆的图像,用于评估模型的性能。
数据格式:处理后的数据集采用标准的COCO JSON格式进行标注,每个标注包含目标的类别信息、边界框坐标和实例分割掩码。边界框坐标使用[x, y, width, height]的格式表示,其中x和y是边界框左上角的坐标,width和height分别是边界框的宽度和高度。实例分割掩码则使用RLE编码格式存储,以节省存储空间。
数据规模:经过筛选后的训练集包含9880张图像,其中包含大量车辆实例。根据统计,训练集中各类别的车辆实例数量大致分布为:汽车类约占60%,摩托车类约占15%,自行车类约占10%,公共汽车类约占8%,卡车类约占7%。这种分布基本反映了城市场景中各类车辆的实际出现频率。验证集包含870张图像,各类别的分布比例与训练集保持一致。
数据增强:为了提高模型的泛化能力和鲁棒性,研究中采用了多种数据增强技术,包括随机翻转、随机缩放、随机裁剪、颜色抖动等。这些数据增强操作不仅增加了训练数据的多样性,还能模拟不同天气、光照条件下的城市场景,使模型在实际应用中具有更好的适应性。
数据集分割策略:研究中将数据集分为训练集、验证集和测试集三部分。训练集用于模型的训练,验证集用于在训练过程中评估模型性能并调整超参数,测试集则用于最终的模型性能评估。
功能模块介绍
YOLACT基础网络模块
YOLACT是一种实时实例分割算法,其核心思想是将实例分割任务分解为生成原型掩码和预测掩码系数两个并行任务。该模块主要包括特征提取网络、原型生成网络、类别预测分支和掩码系数预测分支四个部分。

特征提取网络负责从输入图像中提取多级特征。在本研究中,根据不同的应用场景分别采用了ResNet101和ResNet50作为主干特征提取网络。ResNet网络通过引入残差连接有效地解决了深层网络的梯度消失问题,能够提取丰富的语义特征和细节特征。提取的特征经过特征金字塔网络处理,生成多尺度特征图,为后续的实例分割任务提供不同尺度的特征信息。原型生成网络负责生成一组原型掩码,这些原型掩码包含了图像中不同区域的特征信息。在YOLACT中,原型掩码是通过卷积神经网络生成的,其数量通常设置为32个。这些原型掩码具有不同的感受野和语义信息,可以覆盖图像中的各种目标特征。
类别预测分支和掩码系数预测分支是两个并行的任务头。类别预测分支用于预测每个目标的类别概率,而掩码系数预测分支则用于预测每个目标对应的原型掩码组合系数。最终的实例掩码通过将原型掩码与对应的系数进行线性组合得到,然后通过阈值处理和后处理步骤生成最终的实例分割结果。
融合ICIoU和改进Res2Net的车辆实例分割模块
该模块是针对城市场景中车辆实例分割任务的改进,主要包括Res2nEt模块、ICIoU损失函数和Cluster NMS算法三个核心组件。Res2nEt模块是将Res2Net和ECA注意力机制融合得到的改进特征提取模块。Res2Net通过引入多尺度分支结构,能够在不同粒度级别上提取特征,增强网络对多尺度目标的表示能力。ECA模块则通过自适应学习通道权重,能够有效地突出重要特征,抑制无关特征。将这两个模块结合,Res2nEt能够同时利用多尺度特征提取和通道注意力机制的优势,提高模型对车辆目标的特征提取能力。ICIoU损失函数是对CIoU损失函数的改进,主要解决了CIoU损失函数在某些情况下的退化问题。CIoU损失函数考虑了预测框和真实框的交并比、中心点距离以及长宽比三个几何因素,但当预测框和真实框的长宽比相等时,其惩罚因子项会失效,导致损失函数退化为DIoU损失函数。ICIoU损失函数通过引入新的惩罚因子计算方式,有效解决了这一问题,提高了边界框回归的精度和收敛速度。

Cluster NMS算法是对传统NMS算法的改进,主要用于解决同类目标重叠时的漏检问题。传统的Fast NMS算法在处理重叠目标时,往往会抑制置信度较低的预测框,导致漏检。Cluster NMS算法通过聚类的思想,将具有较高IoU的预测框分组,并在组内保留多个预测框,从而提高了对重叠目标的检测率。在城市场景中,车辆之间的重叠遮挡情况较为常见,Cluster NMS算法能够有效改善这种情况下的检测效果。通过将这三个组件集成到YOLACT基础网络中,显著提高了模型在城市场景下的车辆实例分割性能。
融合可变卷积和改进FPN的轻量化实例分割模块
该模块是为了满足边缘设备部署需求而设计的轻量化实例分割解决方案,主要包括SimAM注意力模块、可变卷积DCNv2和改进的特征金字塔A-FPN三个核心组件。
SimAM注意力模块是一种无参数的注意力机制,其核心思想是通过能量函数来评估神经元的重要性。该模块通过计算神经元之间的能量差异,自适应地生成注意力权重,能够在不增加模型参数量的情况下,提高模型对重要特征的关注度。在主干网络的残差结构中添加SimAM模块,能够有效提高模型在城市场景下的特征提取能力,同时保持模型的轻量化特性。可变卷积DCNv2是对传统卷积的改进,通过引入偏移量参数和调制标量,使卷积核能够根据输入特征动态调整其感受野。传统卷积的采样位置是固定的,无法适应目标形状和尺度的变化。而DCNv2通过从输入特征中学习偏移量和调制标量,使卷积核能够自适应地调整采样位置,更好地捕捉目标的几何形状信息。在城市场景中,车辆的形状和尺度变化较大,DCNv2能够有效提高模型对不同形状和尺度车辆的检测能力。改进的特征金字塔A-FPN是在传统FPN的基础上,集成了ASPP模块。ASPP模块通过使用不同膨胀率的空洞卷积,能够在不降低特征图分辨率的情况下,扩大感受野,获取多尺度上下文信息。将ASPP模块集成到FPN中,能够增强特征金字塔的多尺度特征融合能力,提高模型对不同尺度目标的检测性能。在城市场景中,车辆的距离远近不同导致尺度变化较大,A-FPN能够有效改善模型对多尺度车辆的检测效果。

该模块通过将这三个组件集成到YOLACT基础网络中,并使用ResNet50作为主干网络,在保持较高检测精度的同时,显著降低了模型的参数量和计算复杂度。
算法理论
实例分割的基本原理
实例分割是计算机视觉中的一个重要任务,它结合了目标检测和语义分割的优点,不仅需要识别图像中的目标类别,还需要为每个目标实例生成精确的分割掩码。与语义分割不同,实例分割需要区分同一类别的不同实例,这使得任务更加复杂。实例分割算法主要分为两大类:两阶段实例分割算法和单阶段实例分割算法。两阶段实例分割算法通常先生成目标候选区域,然后对每个候选区域进行分类和分割,代表性的算法包括Mask R-CNN、FCIS等。单阶段实例分割算法则直接从输入图像中预测目标的类别、边界框和分割掩码,代表性的算法包括YOLACT、PolarMask、SOLO等。YOLACT作为一种单阶段实例分割算法,其核心思想是将实例分割任务分解为两个并行的子任务:生成一组原型掩码和预测每个目标的掩码系数。原型掩码是一组通用的特征表示,包含了图像中不同区域的语义信息。掩码系数则决定了如何组合这些原型掩码来生成特定目标的分割掩码。最终的实例分割结果通过将原型掩码与对应的掩码系数进行线性组合,然后应用阈值处理和后处理步骤得到。

改进的Res2nEt模块原理
Res2nEt模块是对ResNet的改进,其核心思想是通过引入多尺度分支结构,增强网络的多尺度特征表示能力。传统的ResNet在每个残差块中使用3×3卷积提取特征,而Res2Net则将特征通道分成多个组,每组通过不同的1×1卷积和3×3卷积处理,然后将结果合并。这种结构使得网络能够在不同的粒度级别上提取特征,从而更好地捕捉目标的多尺度信息。ECA模块是一种轻量级的通道注意力机制,其核心思想是通过一维卷积自适应地学习通道之间的依赖关系。与传统的SE模块不同,ECA模块不使用全连接层,而是使用一维卷积来捕获局部跨通道交互信息,这不仅减少了参数量,还提高了模型的性能。Res2nEt模块将Res2Net和ECA模块相结合,在Res2Net的残差结构中引入ECA注意力机制。具体来说,在Res2Net的特征融合之后,添加ECA模块来学习通道注意力权重,然后将注意力加权后的特征与输入特征通过跳跃连接相加。这种结构不仅保留了Res2Net的多尺度特征提取能力,还增强了模型对重要特征的关注度,从而提高了特征表示的有效性。

ICIoU损失函数原理
边界框回归是目标检测和实例分割中的重要环节,其性能直接影响到检测精度。传统的边界框回归损失函数如Smooth L1虽然简单有效,但没有考虑边界框的几何特性。为了提高边界框回归的精度,研究人员提出了多种考虑几何因素的损失函数,如IoU损失、GIoU损失、DIoU损失和CIoU损失等。CIoU损失函数考虑了三个几何因素:预测框和真实框的交并比、中心点距离以及长宽比。其数学表达式为:L_CIoU = 1 - IoU + ρ²/c² + αv,其中ρ表示预测框和真实框中心点之间的距离,c表示包围两个框的最小外接矩形的对角线长度,α是权重因子,v是衡量长宽比一致性的指标。ICIoU损失函数通过重新设计惩罚因子,有效解决了CIoU损失函数在某些情况下的退化问题,提高了边界框回归的精度和收敛速度。在实验中,使用ICIoU损失函数的模型比使用CIoU损失函数的模型在检测精度上有明显提升。
Cluster NMS算法原理
非极大值抑制是目标检测和实例分割中的关键后处理步骤,其目的是消除冗余的重叠边界框,确保每个目标只被检测一次。传统的贪婪NMS算法按置信度降序排列边界框,然后依次保留高置信度的边界框,并抑制与其IoU大于阈值的边界框。这种方法在处理重叠目标时,容易抑制正确的检测结果,导致漏检。Cluster NMS算法通过聚类的思想改进了传统NMS算法。其核心思想是将具有较高IoU的边界框聚类成组,然后在每个组内保留多个边界框,而不是只保留一个。具体来说,Cluster NMS算法首先计算所有边界框之间的IoU矩阵,然后通过迭代的方式,逐步确定哪些边界框应该被保留。Cluster NMS算法的具体步骤如下:首先,将边界框按置信度降序排列,并初始化一个全1的张量表示所有边界框都被保留。然后,计算IoU矩阵并将其转换为上三角矩阵。接着,将初始张量展开为对角矩阵,与IoU矩阵相乘,得到新的矩阵。然后,对新矩阵按列取最大值,并根据阈值生成新的保留张量。重复上述步骤,直到保留张量不再变化。最终,保留张量中值为1的位置对应的边界框被保留作为检测结果。
在城市场景中,车辆之间的重叠遮挡情况较为常见,Cluster NMS算法能够有效提高对重叠车辆的检测率,减少漏检现象。
可变卷积和改进FPN原理
可变卷积是对传统卷积的重要改进,其核心思想是通过引入可学习的偏移量,使卷积核能够自适应地调整其感受野。传统卷积的采样位置是固定的,无法适应目标形状和尺度的变化。而可变卷积通过从输入特征中学习偏移量,使卷积核能够根据输入特征动态调整采样位置,更好地捕捉目标的几何形状信息。DCNv2是可变卷积的改进版本,它不仅引入了偏移量,还添加了调制标量。调制标量用于控制每个采样点的贡献权重,使网络能够更加灵活地调整感受野。DCNv2的卷积公式为:y = Σ * x * Δmn),其中Δpn是偏移量,Δmn是调制标量。SimAM注意力机制是一种无参数的注意力机制,其核心思想是通过能量函数来评估神经元的重要性。SimAM基于神经科学中的空域抑制原理,认为活跃的神经元会抑制周围的神经元。通过计算神经元之间的能量差异,可以确定哪些神经元更重要,从而生成注意力权重。SimAM的优点是不需要额外的参数,计算效率高,同时能够有效地提高模型性能。ASPP模块通过使用不同膨胀率的空洞卷积,能够在不降低特征图分辨率的情况下,扩大感受野,获取多尺度上下文信息。将ASPP模块集成到FPN中,形成A-FPN结构,能够增强特征金字塔的多尺度特征融合能力。A-FPN通过在FPN的不同层级上应用ASPP模块,能够有效融合不同尺度的特征信息,提高模型对不同尺度目标的检测性能。
核心代码介绍
Res2nEt模块实现
Res2nEt模块是融合了Res2Net和ECA注意力机制的改进特征提取模块,以下是其核心实现代码:
def conv3x3:
"""3x3 convolution with padding"""
return nn.Conv2d
def conv1x1:
"""1x1 convolution"""
return nn.Conv2d
class ECA:
"""ECA模块实现"""
def __init__:
super.__init__
self.avg_pool = nn.AdaptiveAvgPool2d
self.conv = nn.Conv1d // 2, bias=False)
self.sigmoid = nn.Sigmoid
def forward:
# 全局平均池化
y = self.avg_pool
# 一维卷积捕获通道依赖关系
y = self.conv.transpose).transpose.unsqueeze
# Sigmoid激活生成注意力权重
y = self.sigmoid
# 注意力加权
return x * y.expand_as
class Res2NetBlock:
"""Res2Net模块实现"""
expansion = 4
def __init__:
super.__init__
if groups != 1 or base_width != 64:
raise ValueError
if scale < 1:
raise ValueError
self.inplanes = inplanes
self.planes = planes
self.stride = stride
self.downsample = downsample
self.scale = scale
# 1x1卷积降维
self.conv1 = conv1x1
self.bn1 = nn.BatchNorm2d
# 分组3x3卷积
self.conv2 = nn.ModuleList
self.bn2 = nn.ModuleList
for i in range:
self.conv2.append)
self.bn2.append)
# 1x1卷积升维
self.conv3 = conv1x1
self.bn3 = nn.BatchNorm2d
# ECA注意力模块
self.eca = ECA
self.relu = nn.ReLU
def forward:
identity = x
# 1x1卷积降维
out = self.conv1
out = self.bn1
out = self.relu
# 将特征分成多个组
spx = torch.split
sp = spx[0]
sp_outs = [sp]
# 多尺度特征提取
for i in range:
if i == 0 or self.stride == 1:
sp = spx[i + 1]
else:
sp = self.conv2[i]
sp = self.bn2[i]
sp = self.relu
sp = sp + sp_outs[i]
sp_outs.append
# 特征融合
out = torch.cat
# 1x1卷积升维
out = self.conv3
out = self.bn3
# ECA注意力
out = self.eca
# 跳跃连接
if self.downsample is not None:
identity = self.downsample
out += identity
out = self.relu
return out
- 实现了Res2nEt模块的核心结构。首先定义了ECA注意力机制,它通过全局平均池化和一维卷积来学习通道注意力权重。然后实现了Res2NetBlock,它将输入特征分成多个组,通过多尺度分支结构提取特征,最后通过ECA模块增强重要特征。整个模块在不增加太多计算量的情况下,有效提高了网络的多尺度特征提取能力。
ICIoU损失函数实现
ICIoU损失函数是对CIoU损失函数的改进,以下是其核心实现代码:
def bbox_iou:
"""计算边界框的IoU损失"""
# 获取边界框坐标
if x1y1x2y2:
x1, y1, x2, y2 = box1.chunk
x1g, y1g, x2g, y2g = box2.chunk
else:
# xywh格式转换为x1y1x2y2格式
x1, y1 = box1[..., 0] - box1[..., 2] / 2, box1[..., 1] - box1[..., 3] / 2
x2, y2 = box1[..., 0] + box1[..., 2] / 2, box1[..., 1] + box1[..., 3] / 2
x1g, y1g = box2[..., 0] - box2[..., 2] / 2, box2[..., 1] - box2[..., 3] / 2
x2g, y2g = box2[..., 0] + box2[..., 2] / 2, box2[..., 1] + box2[..., 3] / 2
# 计算重叠区域
inter = - torch.max).clamp * \
- torch.max).clamp
# 计算并集
w1, h1 = x2 - x1, y2 - y1
w2, h2 = x2g - x1g, y2g - y1g
union = w1 * h1 + w2 * h2 - inter + eps
# IoU计算
iou = inter / union
if GIoU or DIoU or CIoU or ICIoU:
# 计算最小外接矩形
cw = torch.max - torch.min
ch = torch.max - torch.min
if GIoU:
# GIoU损失
c_area = cw * ch + eps
return iou - / c_area
# 计算中心点距离
c2 = cw ** 2 + ch ** 2 + eps
rho2 = ** 2 + ** 2) / 4
if DIoU:
# DIoU损失
return iou - rho2 / c2
if CIoU:
# CIoU损失
v = * torch.pow - torch.atan, 2)
with torch.no_grad:
alpha = v /
return iou -
if ICIoU:
# ICIoU损失
v_v = * - math.pi / 4) ** 2 +
- math.pi / 4) ** 2)
with torch.no_grad:
alpha_v = v_v /
return iou -
return iou
def ICIoU_loss:
"""ICIoU损失函数"""
# 计算ICIoU
iou = bbox_iou
# 损失为1 - ICIoU
loss = 1.0 - iou
return loss.mean
- 实现了ICIoU损失函数的计算。首先定义了一个通用的bbox_iou函数,它支持计算普通IoU、GIoU、DIoU、CIoU和ICIoU。ICIoU的核心改进在于重新设计了长宽比惩罚项v_v,通过考虑预测框和真实框各边的比例关系,解决了CIoU在某些情况下的退化问题。然后定义了ICIoU_loss函数,用于计算批量边界框的ICIoU损失。实验表明,使用ICIoU损失函数能够有效提高边界框回归的精度和收敛速度。
Cluster NMS算法实现
Cluster NMS算法是对传统NMS的改进,以下是其核心实现代码:
def cluster_nms:
"""Cluster NMS算法实现"""
# 按置信度降序排序
_, indexes = scores.sort
bboxes = bboxes[indexes]
scores = scores[indexes]
# 初始化保留标记
keep = torch.ones_like
# 计算IoU矩阵
ious = compute_iou_matrix
# 上三角矩阵处理
ious = torch.triu
# Cluster NMS迭代过程
while True:
# 获取当前保留的边界框
keep_inds = torch.where[0]
if len <= 1:
break
# 计算当前IoU矩阵
current_ious = ious[keep_inds][:, keep_inds]
# 按列取最大值
max_ious, _ = current_ious.max
# 根据阈值更新保留标记
current_keep = max_ious < iou_threshold
# 如果没有变化,结束循环
if current_keep.all:
break
# 更新全局保留标记
keep[keep_inds[~current_keep]] = False
# 重新排序并限制最大数量
keep_inds = torch.where[0]
keep_inds = keep_inds[:max_num]
# 返回原始索引
return indexes[keep_inds]
def compute_iou_matrix:
"""计算边界框之间的IoU矩阵"""
# 边界框坐标
x1 = bboxes[:, 0] - bboxes[:, 2] / 2
y1 = bboxes[:, 1] - bboxes[:, 3] / 2
x2 = bboxes[:, 0] + bboxes[:, 2] / 2
y2 = bboxes[:, 1] + bboxes[:, 3] / 2
# 计算面积
area = *
# 计算所有边界框对之间的交集
x1_ = torch.max, x1.unsqueeze)
y1_ = torch.max, y1.unsqueeze)
x2_ = torch.min, x2.unsqueeze)
y2_ = torch.min, y2.unsqueeze)
# 交集面积
inter = torch.clamp * torch.clamp
# IoU矩阵
iou = inter / + area.unsqueeze - inter + 1e-9)
return iou
- 实现了Cluster NMS算法的核心逻辑。首先,按置信度降序排列边界框,然后计算所有边界框之间的IoU矩阵。接着,通过迭代的方式,逐步确定哪些边界框应该被保留。在每次迭代中,计算当前保留边界框之间的最大IoU,然后根据阈值更新保留标记。重复这一过程,直到保留标记不再变化。与传统的Fast NMS算法相比,Cluster NMS算法能够更好地处理重叠目标,提高检测率。
1393

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



