软件系统分析与设计——基于深度学习的脱机中文手写文本行识别系统
1. 项目介绍
本文针对工程实践项目--脱机中文手写文本行系统进行软件系统分析与设计,总结了项目设计方案中所蕴含的软件结构特点,并用不同视图描述了软件系统的概念原型。
本项目中的脱机手写文本行识别系统主要有以下功能:
对于管理员:
- 管理员登录
- 用户管理
- 模型选择
- 模型优化
对于用户:
- 注册、登录、注销账户
- 上传手写中文图片并得到识别结果
- 对识别结果给予评价反馈
2. 软件结构特点
2.1 架构风格
本项目采用MVC架构,MVC架构用一种业务逻辑、数据、用户界面分离的方法组织代码,将业务逻辑聚集到一个部件里面,在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑。
MVC架构将整个软件系统划分为模型(Model)、视图(View)、控制器(Controller)三个部分。
- 视图是用户看到并与之交互的界面。视图向用户显示相关的数据,并能接收用户的输入数据,但是它并不进行任何实际的业务处理。
- 控制器:控制器接受用户的输入并调用模型和视图去完成用户的需求。 该部分是用户界面与 Model 的接口。一方面它解释来自于视图的输入,将其解释成为系统 能够理解的对象,同时它也识别用户动作,并将其解释为对模型特定方法的调用;另一方面, 它处理来自于模型的事件和模型逻辑执行的结果,调用适当的视图为用户提供反馈。
- 模型(Model):模型是应用程序的主体部分。模型表示业务数据和业务逻辑。一个模型能为多个视图提供数据。

对应到文本行识别系统,相应的功能如下:视图是用户界面,用以向用户显示上传图片的入口、用户上传图片的识别结果等;控制器接受用户输入的图片,并调用文本行识别模型(属于Model)识别出结果,并更新视图,将结果反馈给用户。用户如果对识别结果不满意,还可以反馈消息,进而进行二次识别。
2.2 设计模式
设计模式是软件设计中常见问题的典型解决方案。 它们就像能根据需求进行调整的预制蓝图, 可用于解决代码中反复出现的设计问题。
设计模式与方法或库的使用方式不同, 你很难直接在自己的程序中套用某个设计模式。 模式并不是一段特定的代码, 而是解决特定问题的一般性概念。 你可以根据模式来实现符合自己程序实际所需的解决方案。
根据模式主要是用于类上还是主要于对象上来划分的话,可分为类模式和对象模式两种类型。根据设计模式可以完成的任务类型来划分的话,可以分为创建者模式、结构型模式和行为型模式。
常用的设计模式有:单例模式、原型模式、中介者模式、代理模式、适配器模式、模板方法模式等。
本项目中未用到设计模式。
2.3 接口API
get_dataset(config):获取数据集
get_attresnet(config):选择模型
get_device():选择运行环境,cpu or cuda
get_optimizer(config,model):为模型选择优化器,本项目中列出SGD,adam,RMSprop
register():注册账户
login():用户登录
logout():用户登出
upload():上传图片
confirm():确认上传
delete():删除已上传图片
response():反馈对识别结果的满意程度
3 软件系统概念原型的不同视图
软件架构模型是在高层抽象上对系统中关键要素的描述,并且表现出抽象的结构层次。构建软件架构模型的基本方法就是在不同的层次上分解系统并抽象出其中的关键要素。而在此基础上进一步描述关键要素之间的关系,就是软件架构模型中的某种关键视图。
软件架构模型是通过一组关键视图来描述的,同一个软件架构,由于选取的视角不同可以得到不同的视图,这样一组关键视图搭配起来可以完整地描述一个逻辑自洽的软件架构模型。一般来说,我们常用的几种视图有分解视图、依赖视图、泛化视图、执行视图、实现视图等。
3.1 分解视图
分解视图是描述软件架构模型的关键视图。分解视图用软件模块勾划出系统结构,往往会通过不同抽象层级的软件模块形成层次化的结构。

3.2 依赖视图
依赖视图展现了软件模块之间的依赖关系。比如一个软件模块A调用了一个软件模块B,那么我们说软件模块A直接依赖软件模块B。
依赖视图在项目计划中有比较典型的应用。比如它能帮助我们找到没有依赖关系的软件模块或子系统,一边独立开发和测试,同时进一步根据依赖关系确定开发和测试模块的先后顺序。

3.3 泛化视图
泛化视图展现了软件模块之间一般化或具体化的关系。泛化视图有助于描述软件的抽象层次,从而便于软件的扩展和维护。比如通过对象组合或继承很容易形成新的软件模块与原有的软件架构兼容。

3.4 执行视图
执行视图展示了系统运行时的时序结构特点,比如流程图,时序图等。在设计与实现过程中,我们一般将执行视图转换为伪代码之后,再进一步转换为实现代码。

3.5 实现视图
实现视图时描述软件架构与源文件之间的映射关系。一般我们通过目录和源文件的命名来对应软件架构中的包、类我等静态结构单元,这样典型的实现视图金可以由软件项目的源文件目录树来呈现。
本项目的实现视图如下:


3.6 工作分配视图
工作分配视图将系统分解成可独立完成的工作任务,一边分配给各项目团队和人员。工作分配视图有利于跟踪不同项目团队和人员的工作任务的进度,也有利于在各项目团队和成员之间合理地分配和调整项目资源。
| 成员 | 负责模块 |
| A | 文本行识别模块、GUI模块、项目调研 |
| B |
文本行识别模块、模型创新优化 |
| C | 文本行识别模块、工具类模块、数据集模块 |
4. 数据库设计
普通用户:
| 字段 | 字段类型 | 字段描述 | 是否可为NULL(Y/N) |
| user_id | string | 用户id | N |
| user_name | string | 用户名 | Y |
| password | string | 密码 | N |
| other_info | string | 其他信息 | Y |
管理员:
| 字段 | 字段类型 | 字段描述 | 是否可为NULL(Y/N) |
| user_id | string | 用户id | N |
| password | string | 密码 | N |
图片:
| 字段 | 字段类型 | 字段描述 | 是否可为NULL(Y/N) | 备注 |
| pic_id | string | 图片id | N | |
| pic_path | string | 图片路径 | N | |
| pic_label | string | 图片标签 | N | 识别结果 |
5. 软件系统开发环境
编程语言:python 3
主要框架:Pytorch, OpenCV
IDE:PyCharm
第三方库:Yaml,easydict,numpy,scipy,tensorboardX,matplotlib,difflib等
6. 概念原型的核心工作机制
普通用户角度:
用户客户使用自己的id和密码登录系统(若是首次登录则会进入注册账户界面),进入主界面后上传需要进行识别的中文手写文本行图片,点击识别按钮后,系统会图片进行适当处理,然后对文本行进行定位及识别。识别完成后会在界面上向客户展示识别结果。而后由客户决定是否继续上传图片进行识别,否则退出系统。
管理员角度:
管理员使用自己的id和密码登录系统,根据需要选择是否要训练模型、进行模型超参数优化及选择更换模型等。
7. 总结
通过此次博客我学习到了不同软件架构的风格和策略,同时明白了怎样对一个完整的软件系统进行分析,即通过分析不同角度视图之间的映射关系和重叠部分,从而深刻理解软件架构内在的一致性和完整性,虽仍有许多不足之处,但收获颇多。
参考文献:
https://gitee.com/mengning997/se/tree/master/ppt
https://blog.csdn.net/hu19930613/article/details/82751433

浙公网安备 33010602011771号