目录
前言
📅大四是整个大学期间最忙碌的时光,一边要忙着备考或实习为毕业后面临的就业升学做准备,一边要为毕业设计耗费大量精力。近几年各个学校要求的毕设项目越来越难,有不少课题是研究生级别难度的,对本科同学来说是充满挑战。为帮助大家顺利通过和节省时间与精力投入到更重要的就业和考试中去,学长分享优质的选题经验和毕设项目与技术思路。
🚀对毕设有任何疑问都可以问学长哦!
选题指导:
大家好,这里是海浪学长毕设专题,本次分享的课题是
🎯复杂场景下的文本检测与识别系统
一、课题背景与意义
在现实生活中,复杂场景中的文本检测与识别一直是计算机视觉领域的重要研究方向。复杂场景指的是包含多种复杂背景、光照不均、尺度变化、遮挡等因素的图像或视频中的文本。传统的文本检测与识别方法在这些复杂场景中常常面临困难,无法实现准确的文本定位和识别,限制了相关应用的发展。复杂场景下的文本检测与识别系统在提升图像和视频理解能力、改善自动驾驶和智能交通系统、促进图像搜索和信息检索技术以及推动深度学习和计算机视觉发展方面具有重要意义。
二、算法理论技术
2.1 场景文本检测
近年来,基于像素分割的文本检测算法成为主流,如PSENet和DBNet。PSENet通过对每个文本实例生成不同规模的文本内核来进行多个预测,而DBNet则使用一个缩小的文本内核,并引入自适应阈值图和可微分二值化方法来提高后处理效率。然而,DBNet在特征提取与融合过程中存在特征丢失问题,导致标定的文本框不够准确,尤其对长文本中的字符标定困难。为解决这些问题,提出加强网络的特征提取与融合部分,通过引入SA注意力机制提升特征提取能力,并采用双向特征融合机制和高效的上采样方式。同时,在训练方式上采用预训练后微调的形式,使用多语种数据集进行预训练,以实现检测多语种文本并在实际场景中表现更好的效果。

在文本检测中,为了在复杂背景下检测形式多样的文本,首先需要一个强大的特征提取器。基于深度学习的方法使用卷积神经网络来提取特征作为检测任务的基础。网络层越深,可更新的神经元越多,对于特定任务的拟合能力更强,但深层网络也会面临梯度消失/爆炸和网络退化等问题。ResNet通过引入残差单元有效克服了深层神经网络中的梯度消失和网络退化问题,使得文本检测任务可以通过深层网络获得良好的效果。此外,ResNet广泛使用3×3卷积操作,而Nvidia GPU对该操作进行了优化,使得ResNet在Nvidia GPU上的训练和推理效率都非常高。

为了提高主干网络在场景文本特征提取方面的准确性,在ResNet中加入了SA(Spatial and Channel)注意力机制。SA注意力机制结合了空间注意力和通道注意力,以提升主干网络的特征提取能力。
通道注意力机制的目标是根据通道的重要性,在特征图中为不同通道分配不同的权重,增强重要通道的信息,抑制不重要通道,并通过不同权重对特征进行重新组合。在自然场景图像中存在噪声,通道注意力机制可以抑制噪声通道的影响。
空间注意力机制的目标是在特征图中确定最重要的位置。图像中的不同区域对于检测任务的贡献程度不同,通过空间注意力机制,网络能够快速有效地关注到关键区域,提高检测的精确性和效率。

代码如下(示例):
class SAAttention(nn.Module):
def __init__(self, in_channels, reduction_ratio=16):
super(SAAttention, self).__init__()
self.pool = nn.AdaptiveAvgPool2d(1)
self.fc1 = nn.Conv2d(in_channels, in_channels // reduction_ratio, kernel_size=1, stride=1, padding=0)
self.relu = nn.ReLU(inplace=True)
self.fc2 = nn.Conv2d(in_channels // reduction_ratio, in_channels, kernel_size=1, stride=1, padding=0)
self.sigmoid = nn.Sigmoid()
def forward(self, x):
# Spatial attention
spatial_attention = self.pool(x)
spatial_attention = self.fc1(spatial_attention)
spatial_attention = self.relu(spatial_attention)
spatial_attention = self.fc2(spatial_attention)
spatial_attention = self.sigmoid(spatial_attention)
# Channel attention
channel_attention = torch.mean(x, dim=(2, 3), keepdim=True)
channel_attention = self.fc1(channel_attention)
channel_attention = self.relu(channel_attention)
channel_attention = self.fc2(channel_attention)
channel_attention = self.sigmoid(channel_attention)
# Apply attention
x = x * spatial_attention + x * channel_attention
return x
2.2 算法实现
在目标检测任务中,无论是大文本还是小文本,都需要进行准确的检测。为了解决这个问题,需要在不同的特征层之间进行特征融合,以获得更好的检测结果。深层特征通常携带更丰富的语义信息,可以用于检测大尺寸目标,而浅层特征更适合检测小尺寸目标。FPN(Feature Pyramid Network)通过将深层特征图逐个上采样到次深层特征图来进行特征融合,但这种单向信息流的方式不可避免地导致信息损失。
为了增强文本检测网络的特征融合性能,使得不同大小的文本都能更好地被检测到,本学位论文采用了双向特征融合机制(BiFPN)。双向特征融合包括从高语义特征图向低语义特征图的上采样融合和从低语义特征图向高语义特征图的下采样融合。通过对不同特征层进行加权融合,根据其重要程度进行特征层级别的注意机制。双向特征融合模块可以在模型中重复使用,并根据需要选择重复次数。通过双向特征融合,不同特征层之间的信息得到了良好的交流和融合,从而提高了文本检测的性能。

对CRNN算法进行改进,并将其应用于场景中文识别中。通过替换主干网络为ResNet18和ResNet34,增强了对复杂图像特征的提取能力。引入Focal CTC损失解决了中文数据集中的样本不平衡问题,并提升了模型对出现次数较少字符的识别能力。同时,采用在线数据增强技术缓解了过拟合问题。这些改进使得CRNN算法在场景中文识别中表现更好,提高了模型的性能和鲁棒性。

代码如下(示例):
class CRNN(nn.Module):
def __init__(self, backbone='resnet18', num_classes=1000):
super(CRNN, self).__init__()
# Define the backbone network
if backbone == 'resnet18':
self.backbone = models.resnet18(pretrained=True)
backbone_out_channels = 512
elif backbone == 'resnet34':
self.backbone = models.resnet34(pretrained=True)
backbone_out_channels = 512
else:
raise NotImplementedError("Backbone '{}' is not supported.".format(backbone))
# Remove the last fully-connected layer
self.backbone = nn.Sequential(*list(self.backbone.children())[:-1])
# Add the CRNN layers
self.rnn = nn.GRU(backbone_out_channels, hidden_size=256, num_layers=2, bidirectional=True)
self.fc = nn.Linear(256 * 2, num_classes)
def forward(self, x):
# Extract features using the backbone network
features = self.backbone(x)
features = features.squeeze(2).permute(2, 0, 1) # Shape: (T, N, C)
# Apply the RNN layers
recurrent_features, _ = self.rnn(features)
# Apply the fully-connected layer
output = self.fc(recurrent_features[-1])
return output
三、模型训练
3.1 数据处理
由于网络上没有现有的合适的数据集,我决定自己去现场进行拍摄,收集图片并制作了一个全新的数据集,专注于文本检测任务。这个数据集包含了各种真实场景中的文本图片,涵盖了不同的背景、字体、大小和方向等多样性。通过现场拍摄,我能够捕捉到真实的环境和多样的文本样式,这将为我的研究提供更准确、可靠的数据。

在不定长文本识别任务中,由于文本标注不可改变且字符之间有位置关系,数据增强不能破坏这些属性。因此,本研究采用了一系列数据增强方法,如对比度调整、亮度调整、锐度调整、加横线、旋转、添加椒盐噪声和颜色翻转等。这些方法在保留原数据字符的主要特征和字符间顺序关系的同时,给文本图像引入一定的扰动,以提升模型的鲁棒性。

3.2 实验环境
本研究在硬件环境方面使用了Ubuntu 20.04操作系统,并配置了两张NVIDIA GeForce RTX 3090显卡和Intel Xeon Gold 6130H CPU。这样的硬件配置可以提供较高的计算性能和并行处理能力,有助于实现高效的场景文本检测。
在软件环境方面,采用Python作为编程语言,并使用PyTorch 1.8.1作为深度学习框架。此外,CUDA版本为11.1,可以充分利用NVIDIA显卡的计算能力加速深度学习任务。这样的软件环境配置为场景文本检测提供了强大的工具和库支持。
3.3 结果分析
在模型训练过程中,采用了预训练和微调的策略。首先,在合成数据集上进行了100轮的预训练,通过大规模合成数据的训练来初始化模型权重。然后,在真实数据集上进行微调,通过在真实场景中对模型进行微调来提高其性能和泛化能力。训练过程中,使用了批量大小为16和初始学习率为0.007的设置,并采用指数递减的学习率调度策略。通过这种组合训练策略,模型能够充分利用合成数据和真实数据的优势,达到更好的性能和泛化能力。

在数据集上,通过将ResNet18和FPN组合进行训练得到了基线模型。随后采用预训练后微调的策略,在基线模型的基础上进行改进。首先,在ResNet18中引入SA注意力机制以增强网络对关键特征的关注。接着,将FPN替换为双向特征融合机制BiFPN,并改变了上采样中的插值方式,使用双线性插值来提升上采样结果的精度。通过这些改进,旨在提高文本检测模型在数据集上的性能和准确度。这些研究和改进有望推动文本检测领域的进展,并为实际应用提供更准确和可靠的文本检测技术。

本文探讨了在复杂场景中进行文本检测与识别的技术挑战,介绍了基于深度学习的PSENet、DBNet和改进的算法,如SA注意力机制和双向特征融合。模型训练部分详细描述了数据采集、预训练与微调过程。这些技术有望提升文本检测的准确性和鲁棒性,为实际应用提供有力支持。

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



