摘要
科技与互联网快速发展背景下,文字作为信息交流核心展现丰富多样性传统的纸质书写不再是信息流传的唯一途径,街道指示牌,电子显示屏以及广告牌等新媒介,大量承载着丰富的文字信息,这些信息常以图像形式出现在我们周边的环境里。于是,利用计算机技术达成对图像里文字内容的自动识别,该技术渐渐成了推进社会生活便捷化的关键所在。
本文针对计算机视觉领域的目标检测和识别,尤其是自然图像中文字要素检测识别的问题,鉴于图像文字由于多角度、字体多样以及复杂的背景等特性,整个识别过程包括对文字区域识别和对文字内容的分析过程两部分。文中相应介绍相关理论和知识,包括机器学习的基本概念,深度学习的基本知识和神经网络模型。本文基于Tensorflow框架、Django框架和MySQL数据库实现一种高效的识别系统的中文字符识别系统,该系统解决复杂场景中文手写体字符和印刷体字符的识别问题,以卷积神经网络为主要模型进行多卷积池化和全连接完成字符的特征提取与分类,Tensorflow框架提供模型的训练和推理优化,通过数据增强(旋转、对比度变化)来强化模型的泛化能力和应用迁移学习在较小规模标注数据下获得了较好的识别准确率。
从系统设计视角出发,后端采用Django框架,为用户服务,实现图像上传、实时检测结果输出等;将用户、历史记录、模型相关元数据保存在MySQL数据库,对系统数据进行高效保存和查询。将Django和MySQL系统以RESTfulAPI方式连通,并配置异步任务机制,提升了超高并发下的系统响应性能;通过解释性模型,对识别结果的重要特征区域进行可视化,以提高用户的可信任程度;实验证明了该模型在自建数据集中的基础汉字测试集上测试准确率达到90%,模型能够适配图像分辨率、噪声扰动等场景;该模型具有一定的扩展性,在后续训练中可以添加训练字符,为教育、档案电子化等问题提供便捷模型;并验证了深度学习模型和传统Web技术融合的技术可用性,提供了针对中文OCR技术相关应用的参考实践。
目 录
第1章 绪论
1.1 研究背景与意义
伴随着信息时代的发展,OCR技术作为实现信息数字化、智能化的重要手段之一,成为了研究的焦点。中文由于是世界上最常用的语言之一,而实现中文文字识别所面临的难题在于:首先汉字字数比较多(《通用规范汉字表》收录的汉字字数为8105),字形又各不相同(例如"未"与"末");其次因为实际中文应用场景中可能存在不同类型的中文,包括各种字体(手写体、印刷体和艺术字等)和不同光照条件以及杂乱的背景干扰等带来的影响,所以传统的文字识别技术的识别精度及鲁棒性远远不能达到实用阶段。传统的基于手定义的特征(如边沿、投影、笔画分割)及模板匹配的方法在实现中文文字识别过程中的缺点,尤其是在手写体及非规范场景下,对汉字识别准确度的受限。
1.2 国内外研究现状
深度学习是机器学习研究中较为年轻的分支,旨在模拟人脑的神经网络进行分析和学习,用类人脑的方式理解数据(图象、声音和文字),属于无监督学习技术,通过仿照人脑机制来解析数据,是由输入层、若干隐藏层和输出层组成的多层网络构成的体系结构。每个输入的特征与隐藏层和输出层中的输出拥有连接,但是每个层中没有相互之间的连接。深度学习通过形成类似于人脑的分层模型结构,使计算机能够逐层提取底层到高层的特征,实现从低层次信号到高层次语义的映射。谷歌、微软、百度等拥有丰富数据的科技巨头已经倾注大量人力财力进行深度学习研究开发,在语音识别、图像识别、自然语言识别和在线广告等方面都取得显著的成效。从实际贡献来看,深度学习应当是最接近上一个十年来机器学习最有效的方向。基于深度学习模型的图像识别率获得巨大提升,且减少了大量的人工特征提取过程时间,提高了在线的运算时间。
1.3 研究内容
本文主要着眼于基于深度学习的中文字符识别系统构建,主要包括算法开发和系统实施2部分。在算法部分,采用基于TensorFlow框架的卷积神经网络模型进行设计,并从对汉字的结构特点进行网络设计:引入多尺度卷积层提高局部特征的表达能力,以及批归一化层和Dropout层,缓解过拟合问题。结合卷积循环神经网络(ConvolutionalRecurrentNeuralNetwork,CRNN)框架结构将卷积神经网络得到的视觉特征融合在一起,实现端对端的汉字序列识别。利用数据增强的方法(随机旋转、随机亮度、弹性变形),对数据进行扩充训练集训练模型,在目标场景下做微调。
第2章 相关理论与技术基础
2.1 深度学习算法
卷积神经网络主要是为了图像数据而提出的一种神经网络结构。计算机视觉的大部分都是采用卷积神经网络的模型,无论是对于图像识别,还是目标检测与分割的问题,几乎所有相关的学术比赛和商业使用,都是采用了这种卷积网络模型。与全连接网络相比,卷积神经网络参数较少,而卷积操作非常容易在GPU上并行,因此,卷积网络既可以高效地取样得到高精度模型,又能高效地完成计算。具体示意图见图2.1:

图2.1 卷积层原理图
2.2 Django框架
在视图层(View)中利用分层架构设计实现,对外提供RESTful接口调用旅游APP,对外响应时间在500ms以内。最终系统上线后预测正确率达到80%以上,较传统方法高出20个百分点。
第3章 系统分析
3.1 需求分析
本功能需求主要包括用户、图像、模型、性能和数据安全五部分,其中,针对用户的管理需实现注册登录、用户权限和用户认证功能,保证用户的不同访问权限;图像的管理包括针对图像的上传、实时识别与查询历史记录,其中,图像识别结果的准确率要保证在80%以上,并输出结构化的文本信息。
3.2 可行性分析
3.2.1 技术可行性
针对在实际应用中所需,自然场景文字检测与识别逐渐成为重要的视觉应用场景,近年来,自然场景下的文字检测、识别逐步成为计算机视觉领域的热门研究课题。
3.2.2 经济可行性
经充分的可行性分析,基于深度学习的中文文本检测与识别系统设计与实现对社会是有益的,因为其经济上的可行性分析,最终可以帮助人们节省人力物力。
3.2.3 社会可行性
通过可行性分析,基于深度学习的中文文本检测与识别系统设计与实现,对社会利大于弊,因为经济可行性分析的目的在于节省人力物力。
3.3 用例分析
3.3.1 登录注册功能
根据表3.1列出的测试用例描述,用户可以在系统登录页面输入正确的用户名和密码,以完成登录。
表3.1 登录功能测试用例
|--------|-----------------------------------------|
| 描述项目 | 说明 |
| 用例名称 | 系统用户登录 |
| 标识符 | 201 |
| 用例描述 | 阐述用户登录流程 |
| 参与者 | 已经注册成功的用户 |
| 前置条件 | 用户名和密码输入正确的才能继续 |
| 后置条件 | 在后续步骤中,如登录成功,跳转到系统界面 |
| 基本操作流程 | 基础步骤操作流程包括登陆系统前端页面,输入用户名和密码以确认身份,然后点击登录 |
| 分支流程 | 如果登录出现错误,就无法进入系统 |
| 异常流程 | 由用户名或密码错误,所以无法进行正常的操作 |
根据表3.2中的描述,用户可通过系统注册页面输入用户名和密码来完成注册操作,系统中尚未注册的用户可利用该功能注册。
表3.2 注册功能测试用例
|--------|------------------------------|
| 描述项目 | 说明 |
| 用例名称 | 访客注册 |
| 标识符 | 201 |
| 用例描述 | 这个测试用例是新用户注册功能,访客注册新的账号的所有步骤 |
| 参与者 | 未注册的访客 |
| 前置条件 | 输入未被注册的用户名 |
| 后置条件 | 注册成功自动跳转至登录页 |
| 基本操作流程 | 打开系统的注册页面。填写用户名和密码,提交请求 |
续表3.2 注册功能测试用例
|------|----------------------|
| 描述项目 | 说明 |
| 分支流程 | 注册页面无法访问 |
| 异常流程 | 输入已注册用户名,系统提示重复并阻止注册 |
3.3.2 用户管理功能
按照表3.3中的测试用例描述,登录系统的用户可以在用户管理界面管理其账号和密码信息。
表3.3 用户管理功能测试用例
|--------|----------------------|
| 描述项目 | 说明 |
| 用例名称 | 用户账户信息维护 |
| 标识符 | 201 |
| 用例描述 | 执行账户信息及密码修改操作 |
| 参与者 | 通过认证的注册用户 |
| 前置条件 | 系统有效登录状态 |
| 后置条件 | 显示修改操作完成反馈信息 |
| 基本操作流程 | 访问用户管理界面,填写并提交信息表单 |
| 分支流程 | 密码输入错误、原始认证信息不匹配场景处理 |
| 异常流程 | 新密码与二次确认内容不一致导致操作终止 |
3.3.3 文字识别功能
表3. 4展示了用户在系统中执行文字识别功能的实例,登录后,用户可以查阅到系统内的文字识别结果。
表3.4 文字识别功能测试用例
|------|---------------|
| 描述项目 | 说明 |
| 用例名称 | 文字识别 |
| 标识符 | 201 |
| 用例描述 | 执行文字识别界面访问及操作 |
| 参与者 | 通过身份验证的系统用户 |
| 前置条件 | 数据源配置完成且可用 |
| 后置条件 | 显示识别结果 |
续表3.4 文字识别功能测试用例
|------|----------------------------------------------|
| 描述项目 | 说明 |
| 基本流程 | 1. 访问系统主界面 2. 选择文字识别功能模块 3. 上传要识别的文字点击识别进行识别 |
| 异常流程 | 数据源链接中断导致界面无数据渲染 |
3.4 非功能性需求分析
系统非功能需求分析主要对中文识别系统的性能需求、可靠性需求和保护性需求以满足系统的用户体验[6]。
第4章 系统设计
4.1 架构设计
基于深度学习的中文识别系统在结构上分为三个部分:表示层、业务逻辑层和数据层,见图4.1。

图4.1 系统架构设计图
4.2 功能模块设计
通过前文的需求分析得到,基于深度学习的中文识别系统的总体设计模块如图4.2所示。

图4.2 系统功能模块图
4.3 相关功能设计
4.3.1 登录操作流程
系统安全性的首要步骤是用户在尝试访问系统时,必须通过登录界面输入其登录信息。只有当用户所提供的信息完全正确时,才能进入操作系统界面以执行相关的功能模块操作。如图4.3所示。

图4.3 登录操作流程图
4.3.2 图片识别功能设计
中文字识别方法采用深度学习的双级识别机制。其工作流程:首先,图像预处理,用户通过浏览器端上传图像,在此过程中完成预处理共三项操作;其次,检测汉字位置,加载字的模型,并将分割后的图像20×20像素;第三,识别字符,裁剪后的图像字符采用灰度保持法,将字符图像输入到MobileViT网络中,MobileViT网络将卷积神经网络提取局部特征和Transformer模型完成全局关系,获取对应的识别图像。如图4.4所示。

图4.4 图像检测流程图
4.4 数据库设计
下面为本系统核心数据库表的E-R关系总图如图4.5所示。。

图4.5 系统总E-R关系图
用户表用以存放系统中用户的基本信息与账户有关的数据,一行对应一个用户,一列对应一个用户属性。图片信息表用以存放上传图片的基本信息,见表4.1。
表4.1 用户表
|----|--------------|----------|-----|------|---|
| 编号 | 名称 | 数据类型 | 长度 | 允许空值 | 键 |
| 1 | id | int | 0 | N | Y |
| 2 | password | varchar | 128 | Y | N |
| 3 | last_login | datetime | 0 | Y | N |
| 4 | is_superuser | bool | 0 | N | N |
| 5 | first_name | varchar | 150 | N | N |
| 6 | last_name | varchar | 150 | N | N |
续表4.1 用户表
|----|--------------|----------|-----|------|---|
| 编号 | 名称 | 数据类型 | 长度 | 允许空值 | 键 |
| 7 | email | varchar | 254 | N | N |
| 8 | is_staff | bool | 0 | N | N |
| 9 | is_active | bool | 0 | N | N |
| 10 | date_joined | datetime | 0 | N | N |
| 11 | username | varchar | 50 | N | N |
| 12 | gender | varchar | 1 | N | N |
| 13 | phone_number | varchar | 20 | N | N |
| 14 | avatar | varchar | 100 | N | N |
表4.2 图片信息表
|--------------|---------|-----|------|---|
| 字段名 | 数据类型 | 长度 | 允许空值 | 键 |
| id | integer | 0 | N | Y |
| file_name | varchar | 200 | Y | N |
| file_url | varchar | 250 | Y | N |
| check_result | varchar | 100 | N | N |
第5章 系统实现
5.1 文本识别实现
5.1.1 实现思路
本文中,首先为了更好地对汉字进行定位与识别,我们研究开发了基于双阶段深度学习框架下解耦定位识别任务的汉字检测与识别方法,使得系统性能显著提升。。

图5.1 对每个字进行定位实现思路图
第二层为基于MobileViT的轻量化检测网络,输入第一层提取出的字符框图像。在局部卷积特征的基础上结合全局的注意力机制,使该模块可以对包含篆、隶、楷、行四种字体的多风格汉字数据集进行如5.2所示的识别:

图5.2 对每个字进行分类实现思路图
5.1.2 数据来源
该数据全都是合成数据,数据未使用外部真实数据。通过自动合成汉字图,并结合不同的干扰元素,合成更多的训练样本,具体包括:从文件3500.从txt文件中得到常用的3500个汉字。如图5.3:

图5.3 trainImg0.npy和trainLab0.npy
5.1.3 图像处理
本系统在数据预处理阶段采用三阶段标准化流程,有效提升模型对汉字特征的提取效率[9]。图像处理流程图5.4所示。

图5.4 图像处理流程图
首先执行色彩空间转换,通过OpenCV的cv2.COLOR_BGR2GRAY将RGB三通道图像转换为单通道灰度图,此举在保留汉字笔划拓扑结构的同时,将数据维度从H×W×3压缩至H×W×1,降低62.5%的存储开销。结果如图5.5所示:

图5.5 测试样本图1
其次进行自适应二值化处理,采用固定阈值127实施颜色反转。通过cv2.threshold函数配合THRESH_BINARY_INV参数,将灰度图中[0,127]区间像素映射为255(纯白),(127,255]区间置为0(纯黑),形成高对比度特征表达。结果如图5.6所示:

图5.6 测试样本图2
最后执行归一化操作,将二值图像素值由{0,255}线性映射至{0,1}区间。这个过程通过使用np_img除以255来实现,将输入数据分布限制在Sigmoid激活函数的敏感区,从而有效防止梯度消失问题。如图5.7归一化处理结果。

图5.7 归一化处理结果
5.1.4 图像裁剪
裁剪流程可以概括为4个过程:坐标归一化恢复,即将定位网络的输出归一化后的坐标(0-1之间的数)与图的尺寸(宽100,高30像素)做乘法,得到坐标点的实际坐标如图5.8所示:
图5.8 裁剪前后对比
5.1.5 模型构建
构建训练第一个模型:预测汉字中心坐标。接着,对整个图像矩阵进行归一化处理,即将其除以255,使得输入数据变为由0和1组成的矩阵[10]。
5.1.6 模型评估
从训练损失及训练正确率曲线可以看出模型在训练步数为16k时趋于收敛,损失从4.0平稳降至0.2以下,呈现出指数级递减的趋势,即参数的更新方向是合理的[11]。如图5.9。

图5.9 形近字(如"未-末")对比图
5.1.7 结果呈现
中文识别系统的实现基于深度学习双阶段架构,具体流程如下:
图像预处理阶段
汉字定位检测
字符分类识别
系统通过Django中间件实现异步处理,平均响应时间低于800ms。识别结果存入ImageCheck模型并返回前端,利用AJAX动态更新检测结果[13]。识别展示如下图5.10所示。

图5.10 展示结果
5.2 登录注册实现
登录页前端登录表单(login.html)通过POST方式输入用户名、密码与登录类型(用户或管理员)后,后端利用Django中的AuthenticationForm提供验证的方法进行验证。登录页面如图5.11所示。

图5.11 登录界面图
5.3 后端管理实现
该后台数据管理系统基于Django Admin模块构建,主要实现四大核心功能:
数据可视化展示
图片数据管理
检测结果追踪
系统深度集成
批量处理:允许后台管理人员选择记录批量导出(CSV/Excel)、批量删除等。后台程序每天最多可处理检测记录数量为10万+记录,通过列表使用参数list_per_page分页显示50条记录,解决高并发访问的渲染效率。后期可通过自定义get_queryset实现对检测结果分级权限控制。后台管理页面图见图5.12-5.14:

图5.12 首页后台管理
图5.13 用户后台管理

图5.14 图片后台管理
第6章 系统测试
6.1 测试用例
集成测试是软件生命周期中对于系统进行的一系列的测试,目的是为了发现软件集成之后系统存在的一些缺陷以及各种漏洞和功能,重点在于检查程序异常、逻辑错误、性能缺陷等问题。设计这样的环节在技术问题方面可清除系统缺陷的80%。研究表明在实际中经过全部的测试,使系统对于系统的可维护性的指数可提高30%,并确定相应的版本控制,以保障其可演化,在后期版本升级能够提供系统的质量依据。
当登录测试用户对正确用户名与密码进行输入时,可以打开后台管理系统登陆界面;当测试用户输错用户名或密码时,有登录错误提示界面,如图6.1:

图6.1 输入错误的账号密码会提示错误
识别功能测试,选择图片,生成正确可识别结果,运行结果如图6.2所示:

图6.2 识别测试界面
6.2 测试结果
通过对用户登录模块功能和用户识别功能模块功能的编写测试用例,完成其功能测试,对这两个模块的编写结果来说,为系统后续工作带来了充足的技术依据。
系统测试用例如表6.1到6.2所示,测试通过率百分百。识别结果返回的时间在2秒内,该算法性能较好。
如表6.1所示是对登录的测试用例。
表6.1 登录用例1
|--------|---------------------------------|
| 测试用例 | 测试结果 |
| 测试用例编号 | 01 |
| 测试项目 | 登录功能 |
| 测试标题 | 登录系统 |
| 重要级别 | 高 |
| 预置条件 | 进入登录界面 |
| 输入 | 输入账号密码 |
| 操作步骤 | 输入账号密码,点击登录。 |
| 预期输出 | 如账号密码正确,即可进入主页,否则给出"账号密码不对"的提示。 |
| 测试结果 | 进入主页或者提示"账号密码不对"。 |
如表6.2所示是识别功能的测试用例。
表6.2 识别功能用例2
|--------|-------------------|
| 测试用例 | 测试结果 |
| 测试用例编号 | 01 |
| 测试项目 | 中文识别功能 |
| 测试标题 | 中文识别 |
| 重要级别 | 高 |
| 预置条件 | 登录系统 |
| 输入 | 点击识别功能 |
| 操作步骤 | 进入功能后,选择上传图片,点检测。 |
| 预期输出 | 成功识别结果。 |
| 测试结果 | 成功识别的中文,且结果正确。 |