脱机手写中文文本行识别系统——软件设计方案

一、项目背景

  脱机手写中文文本行是指,将手写体的中文纸质文档通过扫描或拍照的方式转化为数字图像,并进一步对该图像中的中文文本行进行识别。整个项目的要求可以分别从系统开发者和客户两种用户类型进行阐述:

  • 对系统开发者来说:

    1. 更换模型;

    2. 训练模型;

  • 对客户来说:

    1. 上传中文手写数字图像,得到检测识别结果;

    2. 在线使用手写板生成离线手写图像;


 二、项目设计方案

1. 软件架构

  本项目采用MVC架构,MVC即为Model-View-Controller(模型-视图-控制器),MVC中M、V和C所代表的含义如下:

  • Model(模型)代表一个存取数据的对象及其数据模型。
  • View(视图)代表模型包含的数据的表达方式,一般表达为可视化的界面接口。
  • Controller(控制器)作用于模型和视图上,控制数据流向模型对象,并在数据变化时更新视图。控制器可以使视图与模型分离开解耦合。

 2. 接口API

(1) 接口:locater.locate_text_lines_with_dbnet

   接口说明:定位出图像上的文本行;

   接口参数:图像路径;

   返回结果:定位后的图像,文本行图像,文本行图像的矩形框;

(2) 接口:recognizer.recognize_texts_with_img_paths

   接口说明:识别出文本行图片上的文字信息;

   接口参数:文本行图像路径;

   返回结果:string->识别结果;

(3) 接口:dataprepare.image_compose

   接口说明:将单字符图像拼接成文本行图像,一种扩大数据集的手段;

   接口参数:待拼接的图片个数,图片所在文件夹地址,图片格式,合成后的图片存放地址;

   返回结果:保存新图;

(4) 接口:dataprepare.image_expansion

   接口说明:进行数据增强,包括模糊、噪声、平移、拉伸等操作;

   接口参数:待增强的图片的路径,增强强度;

   返回结果:增强后的图片;

(5) 接口:GUI.start_GUI_Window

   接口说明:初始化系统界面配置,弹出欢迎界面;

   接口参数:sys.argv;

   返回结果:None;

(6) 接口:tools.accuracy_compute

   接口说明:计算模型的识别准确率;

   接口参数:识别结果,标签;

   返回结果:float->AR,float->CR(两种准确率计算方法)

(7) 接口:manager.model_manage

   接口说明:更换模型;

   接口参数:新模型或优化后模型的路径;

   返回结果:None;


三、软件系统概念原型的不同视图

1. 分解视图

  分解是构建软件架构模型的关键步骤,分解视图也是描述软件架构模型的关键视图,一般分解视图呈现为较为明晰的分解结构特点。分解视图用软件模块勾划出系统结构,往往会通过不同抽象层级的软件模块形成层次化的结构。

  • 分解的常见方法:

    1. 面向功能的分解方法;

    2. 面向特征的分解方法;

    3. 面向数据的分解方法;

    4. 面向并发的分解方法;

    5. 面向事件的分解方法;

    6. 面向对象的分解方法;

  本项目采用面向功能的分解方法,使用用例建模手段,画出面向功能的分解视图:

   (1) 首先画出系统开发者后台管理子系统的分解视图:

 

  (2) 然后画出客户使用识别子系统的分解视图:

 

  (3) 最终得到整个系统的分解视图:

2. 依赖视图

  依赖视图展现了软件模块之间的依赖关系。比如一个软件模块A调用了另一个软件模块B,那么我们说软件模块A直接依赖软件模块B。如果一个软件模块依赖另一个软件模块产生的数据,那么这两个软件模块也具有一定的依赖关系。

  依赖视图在项目计划中有比较典型的应用。比如它能帮助我们找到没有依赖关系的软件模块或子系统,以便独立开发和测试,同时进一步根据依赖关系确定开发和测试软件模块的先后次序。

  依赖视图在项目的变更和维护中也很有价值。比如它能有效帮助我们理清一个软件模块的变更对其他软件模块带来影响的范围。

  在本项目中,要想画出依赖视图,首先要明确项目有哪几个功能模块,然后理清各个功能模块之间的依赖关系,最后只需要把这些依赖关系画出来即可。

  (1) 首先画出系统的功能模块图:

 

  (2) 然后整理这些模块之间的依赖关系:

  ① 工具模块不依赖其他模块,它是为其他模块服务的;

  ② 图像预处理模块主要进行一些数据增强、尺寸归一化的操作,它依赖工具模块;

  ③ 文本行检测模块需要定位出一张手写中文图像中的所有文本行,需要预处理后的图片数据,所以它依赖图像预处理模块;

  ④ 要对检测出来的文本行进行识别,所以文本行识别模块依赖文本行检测模块。同时,识别模块还需要输出识别结果、输出准确率等功能,所以它还依赖功能模块;

  ⑤ GUI模块,GUI模块主要需要对文本行检测和文本行识别模块进行集成,所以它依赖这两个模块;

  ⑥ 后台管理模块的主要工作是更换模型及调整模型,所以检测模块和识别模块都依赖它,而它不依赖任何模块。

  (3) 根据上述分析画出依赖视图:

 

3. 执行视图

  执行视图展示了系统运行时的时序结构特点,比如流程图、时序图等。执行视图中的每一个执行实体,一般称为组件(Component),都是不同于其他组件的执行实体。如果有相同或相似的执行实体那么就把它们合并成一个。

   本项目采用流程图作为项目的执行视图:

   (1) 客户使用系统的流程图:

   (2) 系统开发者使用系统的流程图:

 4. 实现视图

  实现视图是描述软件架构与源文件之间的映射关系。比如软件架构的静态结构以包图或设计类图的方式来描述,但是这些包和类都是在哪些目录的哪些源文件中具体实现的呢?一般我们通过目录和源文件的命名来对应软件架构中的包、类等静态结构单元,这样典型的实现视图就可以由软件项目的源文件目录树来呈现。

  本项目的目录树如下:

 

 5. 工作分配视图

  工作分配视图将系统分解成可独立完成的工作任务,以便分配给各项目团队和成员。工作分配视图有利于跟踪不同项目团队和成员的工作任务的进度,也有利于在各项目团队和成员之间合理地分配和调整项目资源,甚至在项目计划阶段工作分配视图对于进度规划、项目评估和经费预算都能起到有益的作用。

  本项目的工作分配视图如下:


四、项目数据库设计

1. 数据库概念设计

  通过画出系统的实体-联系(E-R)图来完成数据库的概念设计:

2. 数据库逻辑设计 

  • 用户
序号 字段 字段类型 字段描述 备注
1 user_ID String 用户ID 主键、自增
2 user_name String 用户名  
3 account_num String 账号  
4 password  String  密码  
5 phone_num String 电话号码 要求11位
6 others String 其他信息  
7 user_class int 用户类别 两类:客户和管理员
  • 客户
序号 字段 字段类型 字段描述 备注
1 user_ID String 用户ID 外键
2 user_class int 用户类别  
  • 系统开发者
序号 字段 字段类型 字段描述 备注
1 user_ID String 用户ID 外键
2 user_class int 用户类别  
  • 文件
序号 字段 字段类型 字段描述 备注
1 file_ID String 文件ID 主键、自增
2 file_format String 文件格式  
3 subfile_num String 子文件数目  
4 subfile_name_list List 子文件名列表  
5 file_class int 文件类别 分为图片和标签
  • 图片
序号 字段 字段类型 字段描述 备注
1 pic_ID String 图片ID 指一批图片而不是一张;主键、自增
  • 标签
序号 字段 字段类型 字段描述 备注
1 label_ID String 标签ID 是与上述图片对应的一批标签;主键、自增
  • 工具
序号 字段 字段类型 字段描述 备注
1 tool_ID String 工具ID 为不同的用户打开不同的功能权限
2 user_ID String 用户ID 外键

  • 模型
序号 字段 字段类型 字段描述 备注
1 model_ID int 模型ID 为了便于找到以前的模型进行对比
2 model_class int 模型种类 两种:检测模型和识别模型
3 model_size float 模型大小 模型大小会影响系统响应时间
4 accuracy float 模型准确率 模型在测试集上的准确率

 


五、系统运行环境和技术选型说明

1. 运行环境

  • Windows10
  • MacOS10.0+

 2. 技术选型

  • python版本:3.6
  • Tensorflow版本:2.0.0+

  提供了许多方便的API,用来处理数据,搭建网络,训练模型以及评估模型。

  • OpenCV版本:3.4.2

  它轻量级而且高效——由一系列 C 函数和少量 C++ 类构成,同时提供了Python的接口,实现了图像处理和很多通用算法,在本项目中主要用于数据预处理。

  • PyQt版本:5.9.2

  PyQt是一个创建GUI应用程序的工具包,是Python编程语言和Qt库的成功融合。我们的GUI界面就是通过这个库搭建起来的。


六、概念原型的核心工作机制

  • 本项目概念原型的核心工作机制如下,从两方面阐述:

(1) 从客户角度:客户在系统首页登录系统,进入主界面后可以上传本地的一批中文手写图像,点击识别按钮后,系统会自动转换这批图片的格式、尺寸,即数据预处理,然后使用文本行检测模型对文本行进行定位,最后对这些图片进行识别。识别完成后会在界面上向客户展示识别结果,客户可以依次遍历每一张中文手写图片的识别结果,还可以点击纠错按钮看到本张图片中识别效果不好的一些文本行,再进行手动纠错。

(2) 从管理员角度:管理员可以登录系统进入后台管理页面,可以在页面中更换优化后的检测或识别模型。


参考文献:课堂PPT

 

posted @ 2020-12-28 09:32  小白YP  阅读(550)  评论(0)    收藏  举报