基于深度学习的文字识别【DB+CRNN+PyQt5界面实现】


前言

  随着计算机技术的不断发展和完善,利用计算机图像处理技术对目标自动识别的技术研究具有现实意义,如文字文字识别系统, 基于深度学习的文字识别方法,采用DB算法进行文字定位和CRNN算法进行文字识别,并使用Paddle作为框架实现。首先,基于DB算法进行文字定位,DB算法具有自适应阈值和标注生成的特性,能够有效地检测和定位文字区域。通过学习图像中的文字和非文字区域,DB算法能够生成准确的文字边界框,为后续的文字识别提供准确的输入。其次,基于CRNN算法进行文字识别。
  本文选择Paddle作为深度学习框架。Paddle具有良好的可扩展性和高性能,同时基于PyQt5开发可视化交互界面,支持用户批量图像识别,矩形框鼠标绘制任意区域并进行文字识别,支持文字识别结果在图像上显示。

关键词:文字识别;DB;CRNN;深度学习;卷积神经网络;PyQt5;PaddlePaddle


视频演示效果

基于深度学习的中英文文字识别

代码下载链接

  若您想获得博文中涉及的实现完整全部程序文件(包括测试图片、py文件,ocr模型权重文件,调试说明等),这里已打包上传至博主的面包多平台,具体见可参考博客与视频,已将所有涉及的文件同时打包到里面,软件安装调试有具体说明,我们有专业的调试技术人员,将远程协助客户调试,具体请看安装条件说明.txt,完整文件截图如下:
在这里插入图片描述

1.DB文字定位

1.1 DB概述

  Differentiable Binarization(DB)是一种用于文字定位的深度学习算法,由第一作者Minghui Liao等人在2018年提出。DB算法的目标是通过可微分的方式实现文本区域的二值化(二分类),从而能够端到端地进行训练和优化。
  传统的文字定位方法通常依赖于手工设计的特征和阈值来进行二值化处理,存在着许多困难和限制。而DB算法通过引入可微分的连续函数替代传统的二值化操作,允许梯度回传和端到端的训练过程。DB文字定位框图如下图所示。
在这里插入图片描述

1.2 DB算法原理

1.2.1 整体框架

  DB文字定位算法网络框架如下图所示,将输入图像输入到特征金字塔后骨骼中。其次,金字塔特征被上采样到相同的尺度并级联以产生特征F。然后,特征F用于预测概率图P和阈值映射T。之后,近似二进制map由P和F计算。在训练周期中监督应用于概率图,即阈值映射和近似二值映射,其中概率映射和近似二进制映射共享相同的监督。在推理阶段,边界框可以容易地从近似二进制映射概率图。
在这里插入图片描述

1.2.2 特征提取网络Resnet

  ResNet(Residual Neural Network)是一种深度卷积神经网络架构,由Kaiming He等人在2015年提出。ResNet的设计目标是解决深层网络训练中的梯度消失和网络退化问题,使得更深的网络能够更容易地训练和优化。
  ResNet的核心思想是通过引入残差连接(residual connection)来构建深层网络。具体而言,ResNet的特征提取网络由一系列残差块(residual block)组成,每个残差块包含了多个卷积层和批归一化层。在残差块内部,输入特征经过一系列卷积和激活函数的变换后,与残差连接相加,然后再经过激活函数,得到最终的输出特征。这种跳跃连接使得网络可以学习残差部分,同时保留了原始特征的信息。

# 定义ResNet网络
class ResNet(nn.Layer):
    def __init__(self, block, layers, num_classes=1000):
        super(ResNet, self).__init__()
        self.in_channels = 64
        self.conv1 = nn.Conv2D(3, 64, kernel_size=7, stride=2, padding=3, bi-as_attr=False)
        self.bn1 = nn.BatchNorm2D(64)
        self.relu = nn.ReLU()
        self.maxpool = nn.MaxPool2D(kernel_size=3, stride=2, padding=1)
        self.layer1 = self._make_layer(block, 64, layers[0])
        self.layer2 = self._make_layer(block, 128, layers[1], stride=2)
        self.layer3 = self._make_layer(block, 256, layers[2], stride=2)
        self.layer4 = self._make_layer(block, 512, layers[3], stride=2)
        self.avgpool = nn.AdaptiveAvgPool2D((1, 1))
        self.fc = nn.Linear(512, num_classes)
    def _make_layer(self, block, out_channels, blocks, stride=1):
        downsample = None
        if stride != 1 or self.in_channels != out_channels:
            downsample = nn.Sequential(
                nn.Conv2D(self.in_channels, out_channels, kernel_size=1, stride=stride, bias_attr=False),
                nn.BatchNorm2D(out_channels)
            )
        layers = [block(self.in_channels, out_channels, stride, downsample)]
        self.in_channels = out_channels

        for _ in range(1, blocks):
            layers.append(block(out_channels, out_channels))
        return nn.Sequential(*layers)

1.2.3 自适应阈值

  在DB算法中,自适应阈值是一种用于文字定位的重要原理。传统的二值化方法通常使用固定的阈值来将图像分割成前景(文字)和背景两部分。然而,由于图像中的文字可能具有不同的亮度和对比度,使用固定阈值的方法可能导致不准确的分割结果,自适应阈值效果如下图所示。
在这里插入图片描述
  DB算法通过引入自适应阈值的机制,可以根据每个像素的局部信息来动态地确定二值化的阈值,从而实现更准确的文字定位。以下是DB算法中自适应阈值的原理:
  首先,特征提取,使用CNN从输入图像中提取N维度特征。
  阈值估计,预测网络通常由一系列卷积层和激活函数组成,以特征图中特征最明显的参数值作为阈值。
  二值化,使用自适应阈值对特征图阈值进行比较进行二值化操作。
通过使用自适应阈值,DB算法能够根据图像中不同区域的亮度和对比度变化,实现更精确的文字定位。

1.2.4 文字区域标注生成

  在DB算法中,标注生成是指生成用于训练的二值分割掩模(mask),用于指示图像中每个像素是否属于文本区域。这些二值分割掩模可以作为监督信号,帮助网络学习正确的文字定位,以下是DB算法中标注生成的原理:
  数据准备:首先,需要准备带有文本区域标注的训练图像数据集。
标注转换:针对每个图像,将文本区域的标注信息转换为二值分割掩模。
  数据增强:为了增加训练样本的多样性和鲁棒性,可以应用数据增强技术,如随机旋转、缩放、裁剪等操作,生成多个变换后的图像和对应的二值分割掩模。
  分割掩模预测:在DB算法的训练过程中,网络会接收输入图像,并预测文本区域的二值分割掩模。
  损失计算:通过比较网络预测的二值分割掩模与真实的二值分割掩模,计算损失函数。
  通过标注生成,DB算法能够为每个训练样本生成相应的二值分割掩模,并与网络的预测结果进行对比,从而实现监督式学习。网络可以通过优化损失函数,逐步调整参数,使得预测结果逼近真实的二值分割掩模,提高文字定位的准确性,其文字区域标注过程如下图3-4所示:

在这里插入图片描述

1.2.5 DB文字定位模型训练

  DB文字定位算法模型训练的原理与过程如下:

  1. 数据准备:首先,需要准备用于训练的数据集。数据集应包含正样本和负样本。正样本是带有标注的包含文字的图像,负样本是不包含文字的图像。
  2. 模型设计:接下来,需要设计DB文字定位算法模型的网络结构。通常使用深度卷积神经网络(CNN)来构建模型。
  3. 损失函数定义:为了训练模型,需要定义适当的损失函数来衡量模型的性能和误差。在文字定位任务中,常用的损失函数包括二分类交叉熵损失和边界框回归损失。
  4. 模型训练:使用准备好的数据集和定义的损失函数,开始训练DB文字定位算法模型。
  5. 模型评估:在训练过程中,需要定期评估模型的性能。可以使用一些评价指标,如准确率、召回率、F1分数等,来衡量模型在文字定位任务上的表现。

2.CRNN文字识别

2.1 CRNN概述

  CRNN是一种深度学习算法,用于文字识别任务,其能够同时处理图像的空间特征和序列信息,使得文字识别变得更加高效和准确,CRNN整体流程如下图所示,CRNN算法的原理如下:
  首先,特征提取,输入的文字图像经过卷积层的特征提取。
  序列建模(Recurrent Sequence Modeling):提取的特征被输入到循环神经网络(RNN)中进行序列建模。
  序列分类(Sequence Classification):在CRNN的最后一步,通过全连接层将RNN输出的特征映射到文本的概率分布。
  CRNN算法的优点在于它能够同时捕捉到图像的局部特征和序列的上下文信息。卷积层能够提取图像的低级特征,如边缘、纹理等,而循环神经网络则能够对特征序列进行建模,捕捉到文字的语义和上下文信息。
在这里插入图片描述

2.2 CRNN原理

2.2.1 CRNN网络架构实现

  CRNN整体处理逻辑流程如下图所示
在这里插入图片描述

# 定义CRNN模型
class CRNN(nn.Layer):
    def __init__(self, num_classes):
        super(CRNN, self).__init__()

        self.cnn = nn.Sequential(
            nn.Conv2D(1, 64, kernel_size=3, stride=1, padding=1),
            nn.ReLU(),
            nn.MaxPool2D(kernel_size=2, stride=2),
            nn.Conv2D(64, 128, kernel_size=3, stride=1, padding=1),
            nn.ReLU(),
            nn.MaxPool2D(kernel_size=2, stride=2),
            nn.Conv2D(128, 256, kernel_size=3, stride=1, padding=1),
            nn.BatchNorm2D(256),
            nn.ReLU(),
            nn.Conv2D(256, 256, kernel_size=3, stride=1, padding=1),
            nn.ReLU(),
            nn.MaxPool2D(kernel_size=(2, 1), stride=(2, 1)),
            nn.Conv2D(256, 512, kernel_size=3, stride=1, padding=1),
            nn.BatchNorm2D(512),
            nn.ReLU(),
            nn.Conv2D(512, 512, kernel_size=3, stride=1, padding=1),
            nn.ReLU(),
            nn.MaxPool2D(kernel_size=(2, 1), stride=(2, 1)),
            nn.Conv2D(512, 512, kernel_size=2, stride=1),
            nn.ReLU()
        )

2.2.2 CNN结构

  在CRNN框架中,CNN(Convolutional Neural Network)用于文字图像的特征提取。CNN通过卷积操作对输入的文字图像进行滤波和特征提取,以捕捉图像中的局部信息和纹理特征,CRNN框架中CNN整体流程如下图所示。

在这里插入图片描述
  通过CNN的特征提取,CRNN能够从原始的文字图像中学习到具有语义和区分能力的特征表示,为后续的序列建模和文字识别提供有用的输入。在CRNN框架中,CNN的参数通常是通过端到端的训练方式进行学习,以最大程度地提取和表示输入图像中的文字特征。

2.2.3 RNN结构

  在CRNN框架中,RNN(Recurrent Neural Network)用于对CNN提取的特征进行序列建模。RNN能够捕捉到序列数据中的上下文信息,并通过时间步长的迭代来处理不定长度的输入序列,CRNN框架中RNN整体流程如下图所示。
在这里插入图片描述

  以下是CRNN框架中RNN实现的基本原理:
  特征序列:在CRNN中,CNN提取的特征图被转换成一个特征序列,以便RNN能够逐步处理序列数据。
  RNN单元:RNN单元是RNN的基本组成部分,它通过一个循环结构来处理序列数据。
  隐藏状态传递:RNN的隐藏状态在每个时间步之间传递。隐藏状态包含了序列数据的上下文信息,能够记忆之前时间步的信息,并影响后续时间步的计算。
  循环迭代:CRNN中的RNN单元会根据序列的长度进行多次循环迭代。
  序列特征建模:通过RNN的循环迭代,将序列数据中的上下文信息进行建模。
  在CRNN框架中,RNN的参数通常是通过端到端的训练方式进行学习,以最大程度地提取和表示序列数据中的文字特征。

3. 文字识别系统实现与分析

3.1 文字识别系统整体功能

  本文设计的深度学习文字识别系统框架如下图所示。
在这里插入图片描述
  其具体功能具有以下功能:
  文字检测:文字检测是深度学习文字识别系统的关键功能之一。它可以自动从图像中检测和定位出现的文字区域。
  文字定位:文字定位是指确定文字在图像中的准确位置和边界框。
  文字识别:文字识别是深度学习文字识别系统的核心功能。使用深度学习模型对文字图像进行分析和识别。
  文字校正:深度学习文字识别系统还可以进行文字校正和后处理操作,以提高识别结果的准确性。文字校正可以纠正文字识别过程中可能存在的错误,如字符识别错误、字符漏检等。后处理操作可以进一步优化和校正识别结果,如基于语言模型进行文本纠错和连续文本分割等。
  中英支持:深度学习文字识别系统通常具有多语言支持的功能,能够处理不同语言和字符集的文字识别任务。可以适应不同语言文字的特点和规律,并提供准确的识别结果。
  批量处理:深度学习文字识别系统通常支持批量处理,能够同时处理多个文字图像,提高处理效率和性能。
  可视化和交互界面:一些深度学习文字识别系统还提供可视化和交互界面,方便用户上传、预览和编辑文字图像,查看识别结果并进行必要的修改和校正。

3.2 系统主界面设计

  本文的深度学习文字识别系统采用PyQt5框架设计,包含菜单栏,状态栏、标题栏、文件列表框、图像显示框、图像缩放滚动条、文字定位、文字识别功能按钮、识别结果列表显示框,文字检测位置显示框,其整体界面如下图所示。

在这里插入图片描述

3.3 图像数据加载功能

  本文的深度学习文字识别系统支持批量图像加载与识别功能首先,用户选择一个包含图像数据集的路径,然后点击加载该目录。
  选择图像目录功能下图所示,系统会自动把该路径下所有的图像格式文件加载到文字识别系统中来,加载完成后,图像会自动在图像文件列表中显示其文件名称,用户选择对应的图像后,会自动在图像控件显示当前的图像。

在这里插入图片描述
在这里插入图片描述

3.4 图像自动识别功能

  将DB和CRNN两个算法融合的优缺点如下:
  优点在于:第一, 结合了检测和识别两个任务,DB算法主要用于文字检测,可以准确地定位和提取图像中的文本区域;CRNN算法主要用于文字识别,可以识别出检测到的文本区域中的具体文字内容。将两者融合,可以同时完成文字检测和识别任务,提高整体的文字识别准确性。其次, 强大的特征学习能力,CRNN算法通过卷积和循环神经网络结合的方式,能够有效地学习到图像中的文本特征。融合后的算法能够充分利用CRNN的特征学习能力,提高文字识别的准确性和鲁棒性。最后, 上下文信息的利用,CRNN算法通过循环神经网络可以建模序列数据的上下文信息,对于文字识别任务非常有用。融合后的算法可以将DB检测到的文字区域输入到CRNN中进行识别,有效利用上下文信息提高文字识别的准确性和语义一致性。
  但是缺点也有:首先, 复杂度较高,将DB和CRNN两个算法融合需要进行模型集成和联合训练,这会增加算法的复杂度和训练的难度。其次,训练数据要求高,融合算法的训练需要大量的标注数据,包括文字检测和识别的标注信息。获取高质量的标注数据是一项具有挑战性的任务。最后一点,运行时间较长,融合后的算法需要依次进行文字检测和识别两个阶段的计算,会增加整体的运行时间。特别是在处理大规模图像或视频数据时,时间开销会更大。
  当选择完图像路径后,系统自动加载图像数据集,点击OCR识别按钮,系统会自动批量识别所有的图像文件,其运行界面如下图所示。
在这里插入图片描述
  当系统自动识别所有图像数据集后,点击OK按钮,系统会自动批量显示所有的文字识别结果,包含文字区域与识别结果,其中,系统自动将对应识别结果在图像上一一对应显示,更加直观,其界面如下图所示。用户在识别结果列表任意选择某一个结果,系统会自动显示对应编号的识别结果。

在这里插入图片描述

3.5 图像绘制矩形区域识别功能

  当系统加载指定图像后,系统支持用户鼠标绘制任意区域进行图像文字识别功能,点击矩形文字定位按钮,用户可以在图像区域绘制矩形框.
在这里插入图片描述

3.6 图像绘制任意多变形区域识别功能

  当系统加载指定图像后,系统支持用户鼠标绘制任意区域进行图像文字识别功能,点击多边形文字定位按钮,用户可以在图像区域绘制矩形框,多边形区域绘制完成后,多边形区域左上角会显示待识别,其运行界面如下图所示
在这里插入图片描述

参考文献

  1. 基于深度学习与Dense SIFT融合的文字文字识别[J]. 彭玉青,王纬华,刘璇,赵晓松,魏铭. 中国科学技术大学学报. 2019(02)
  2. 基于跨连接LeNet-5网络的面部文字识别[J]. 李勇,林小竹,蒋梦莹. 自动化学报. 2018(01)
  3. 文字微文字识别综述[J]. 徐峰,张军平. 自动化学报. 2017(03)
  4. 文字文字识别研究进展[J]. 黄建,李文书,高玉娟. 计算机科学. 2016(S2)基于特征点提取技术的车辆行车视距检测算法研究[J]. 李亭,赖延年,方腾源,袁天宇,刘永涛. 重庆理工大学学报(自然科学). 2019(07)
  5. 卷积神经网络的分布式训练在文字识别中的应用[J]. 董飞艳. 软件. 2020(01)
  6. 基于多特征融合卷积神经网络的文字文字识别[J]. 王建霞,陈慧萍,李佳泽,张晓明. 河北科技大学学报. 2019(06)
  7. 融合卷积神经网络与支持向量机的文字识别[J]. 王忠民,李和娜,张荣,衡霞. 计算机工程与设计. 2019(12)
  8. 文字文字识别研究的新进展[J]. 刘晓旻,谭华春,章毓晋. 中国图象图形学报. 2006(10)
  9. 基于非线性降维的文字文字识别若干算法的研究[D]. 黄明威.五邑大学 2011
  10. 基于LBP和PCA的文字识别[J]. 范礼鸿,宁媛. 新型工业化. 2019(02)
  11. 基于多尺度熵的DNA序列相似性分析[J]. 张静,周小安,赵宇. 智能计算机与应用. 2019(01)
  12. 彩色图像灰度化算法综述[J]. 顾梅花,苏彬彬,王苗苗,王志磊. 计算机应用研究. 2019(05)
  13. 模式分类中的特征融合方法[J]. 刘渭滨,邹智元,邢薇薇. 北京邮电大学学报. 2017(04)
  14. 基于排列熵与多重分形指数结合的特征提取算法在情感识别中的应用[J]. 李昕,齐晓英,田彦秀,孙小棋,范梦頔,蔡二娟. 高技术通讯. 2016(07)
  15. 基于IMF能量熵的脑电情感特征提取研究[J]. 陆苗,邹俊忠,张见,肖姝源,卫作臣. 生物医学工程研究. 2016(02)
  16. 基于YOLOv3的船舶实时监测识别[J]. 屈雯怡. 计算机与现代化. 2020(03)
  17. DS-YOLO网络在遥感图像中的飞机检测算法研究[J]. 吴杰,段锦,赫立群,李英超,朱文涛. 计算机工程与应用. 2021(01)
  18. 卷积神经网络算法分析及图像处理示例[J]. 刘中雨. 电脑知识与技术. 2019(34)
  19. 一种神经网络模型剪枝后泛化能力的验证方法[J]. 刘崇阳,刘勤让. 计算机工程. 2019(10)
  20. 基于卷积神经网络的文字识别算法研究[J]. 查志华,邓红涛,田敏. 信息与电脑(理论版). 2019(15)
  21. 基于图像深度学习的无线电信号识别[J]. 周鑫,何晓新,郑昌文. 通信学报. 2019(07)
  22. Deep Facial Expression Recognition: A Survey[J] . Li Shan,Deng Weihong. IEEE Trans-actions on Affective Computing . 2020
  23. Facial expression recognition sensing the complexity of testing samples[J] . Tianyuan Chang,Huihui Li,Guihua Wen,Yang Hu,Jiajiong Ma. Applied Intelligence . 2019 (12)
  24. RTCRelief-F: an effective clustering and ordering-based ensemble pruning algorithm for facial expression recognition[J] . Danyang Li,Guihua Wen,Zhi Hou,Eryang Huan,Yang Hu,Huihui Li. Knowledge and Information Systems . 2019 (1)
  25. Hierarchical committee of deep convolutional neural networks for robust facial expression recognition[J] . Bo-Kyeong Kim,Jihyeon Roh,Suh-Yeon Dong,Soo-Young Lee. Journal on Multimodal User Interfaces . 2016 (2)
  26. Very Deep Convolutional Networks for Large-Scale Image Recognition.[J] . Karen Simo-nyan,Andrew Zisserman. CoRR . 2014
  27. [7]Graph-preserving sparse nonnegative matrix factorization with application to facial ex-pression recognition.[J] . Zhi Ruicong,Flierl Markus,Ruan Qiuqi,Kleijn W Bastiaan. IEEE transactions on systems, man, and cybernetics. Part B, Cybernetics : a publication of the IEEE Systems, Man, and Cybernetics Society . 2011 (1)
  28. Facial expression recognition based on Local Binary Patterns: A comprehensive study[J] . Caifeng Shan,Shaogang Gong,Peter W. McOwan. Image and Vision Computing . 2008 (6)

总结

  基于深度学习的文字识别在近年来取得了显著的进展,其主要由文字定位和文字识别两个关键步骤组成。文字定位使用了DB(Differentiable Binarization)算法,而文字识别则采用了CRNN(Convolutional Recurrent Neural Network)算法。这篇综述将总结这些方法在文字识别领域的应用,并介绍使用PaddlePaddle框架实现它们的基本原理。
  文字定位是文字识别的前置步骤,其目标是在图像中准确地定位出文字区域。DB算法通过自适应阈值的方式解决了传统二值化方法中固定阈值的问题。它利用深度学习网络预测每个像素是否属于文字区域,生成二值分割掩模。该方法具有良好的鲁棒性和适应性,能够根据不同图像的亮度和对比度变化进行准确的文字定位。文字识别是将文字图像转化为可理解的文本的过程。CRNN算法结合了卷积和RNN优势,能够同时处理图像的空间特征和序列信息。
  深度学习框架选择上,本文采用国产的PaddlePaddle进行模型开发与测试。深度学习文字识别系统界面则使用PyQt5实现库。整体系统包含文字检测、文字定位、文字识别、图像批量处理以及可视化和交互界面功能。

猜你喜欢

转载自blog.csdn.net/weixin_40280870/article/details/132250413