本文主要是针对一个离线手写签名真伪鉴别系统的分析与总结,主要阐述项目的完整设计方案和一些软件结构特点,并采用不同的视图来描述项目的软件系统概念原型。
工程实践项目介绍:工程实践项目是一个离线对手写签名真伪进行鉴别的项目,因为目前对于手写签名的检测,大都采用人为鉴别的方式,这种检测方式准确率不高且效率低下,因此实现一个手写签名鉴别系统变得日益重要,能够提高效率和准确性,减少因为仿造签名带来的损失。
因为本项目最终采用Django框架进行展示,而Django框架遵循Web开发的MVC(分别是模型:Model、视图:View、控制器:Controller)架构,如下图所示:
在基于MVC模型设计的网页中,用户访问网站先通过Controller,再有Controller响应用户操作以返回View视图或者给Model传递指令,再有Model与数据库交互。
Django修改了传统的MVC设计模式,将视图分成负责动态逻辑处理的View模块和负责静态的页面展现的Template模块两部分,同时Model负责将表操作转变为类操作,即将关系型数据库表抽象成面向对象的Python类,从而避免了复杂的SQL语句编写。简而言之,MTV模式在本质上和MVC模式没有太大差别。
除了上面提到的三层之外,还需要一个网址分发器,它的作用是将一个个页面请求分发给相对应的不同的视图函数处理,然后View函数再调用相应的模型类和动态网页完成请求,具体的MTV的响应模式如下图所示:
更详细一点的对响应的过程进行描述即:首先,网络服务器(中间件)接收一个网页请求。然后Django在URLconf中找到相应的View函数来处理这个网页请求,然后View函数调用相应的数据模型来访问数据,调用相应的Template来显示用户页面,最后View函数在处理后向网络服务器返回一个HTTP响应,网络服务器将该响应发送给客户端。
MTV设计模式的最大的优点是所有组件并不是紧密相连关系密切的。在这种情况下,每个Django开发的网络应用程序都有一个自身的明确的目的,并且可以在不影响其他部分的情况下独立地进行更改。例如,开发人员在不影响程序底层实现的情况下更改应用程序中的URL;设计人员可以在不修改Python代码的情况下更改HTML页面的样式;数据库管理员可以重命名数据表,并且只需要更改模型,而不需要从大量文件中进行搜索和替换。
此外,因为该项目系统所使用到的各类接口API如下:
# Create your views here.
# 主页函数
def index(request):
# 登录函数
def login(request):
# 注册函数
def register(request):
# 登出函数
def logout(request):
# 密码加密函数 用户登录密码加密
def hash_code(s, salt=‘mysite‘):
# 签名鉴别函数(数据库内先前存有真签名)
def identify(request):
# 签名鉴别结果展示函数
def identify_result(request):
# 签名判断函数(上传两张签名,判别异同)
def judge(request):
# 签名判断结果展示函数
def judge_result(request):
分解是构建软件架构模型的关键步骤,分解视图也是描述软件架构模型的关键视图,一般分解视图呈现为较为明晰的分解结构(breakdown structure)特点。分解视图用软件模块勾画出系统结构,往往会通过不同抽象层级的软件模块形成层次化的结构。分解视图主要由子系统、包、类、组件和库等组成。
因此可以画出本项目的分解视图:
依赖视图展现了软件模块之间的依赖关系。比如一个软件模块A调用了另一个软件模块B,那么我们说软件模块A直接依赖软件模块B。如果一个软件模块依赖另一个软件模块产生的数据,那么这两个软件模块也具有一定的依赖关系。依赖视图在项目计划中有比较典型的应用。比如它能帮助我们找到没有依赖关系的软件模块或子系统,以便独立开发和测试,同时进一步根据依赖关系确定开发和测试软件模块的先后次序。依赖视图在项目的变更和维护中也很有价值,比如它能有效帮助我们理清一个软件模块的变更对其他软件模块带来影响范围。
由此可以画出本项目的依赖视图:
泛化视图展现了软件模块之间的一般化或具体化的关系,典型的例子就是面向对象分析和设计方法中类之间的继承关系。值得注意的是,采用对象组合替代继承关系,并不会改变类之间的泛化特征。因此泛化是指软件模块之间的一般化或具体化的关系,不能局限于继承概念的应用。而且泛化视图有助于描述软件的抽象层次,从而便于软件的扩展和维护。比如通过对象组合或继承很容易形成新的软件模块与原有的软件架构兼容。
而本项目的泛化视图如下:
执行视图展示了系统运行时的时序结构特点,比如流程图、时序图等。执行视图中的每一个执行实体,一般称为组件,都是不同于其他组件的执行实体。如果有相同或相似的执行实体那么就把他们合并成一个。执行实体可以最终分解到软件的基本元素和软件的基本结构,因而与软件代码具有比较直接的映射关系。在设计与实现过程中,我们一般将执行视图转换为伪代码之后,再进一步转换为实现代码。
本项目的执行视图如下所示:
实现视图是描述软件架构和源文件之间的映射关系。比如软件架构的静态结构以包图或设计类图的方式来描述,但是这些包和类都是在哪些目录的哪些源文件中具体实现的呢?一般我们通过目录和源文件的命名来对应软件架构中的包、类等静态结构单元,这样典型的实现视图可以由软件项目的源文件目录树来呈现。实现视图有助于码农在海量源代码文件中找到具体的某个软件单元的实现。实现视图与软件架构的静态结构之间映射关系越是对应的一致性高,越是有利于软件的维护,因此实现视图是一种非常关键的架构视图。
此项目的实现视图如下:
部署视图是将执行实体和计算机资源建立映射关系。这里的执行实体的粒度要与所部署的计算机资源相匹配,比如以进程作为执行实体,那么对应的计算机资源就是主机,这时应该描述进程对应主机所组成的网络拓扑结构,这样可以清晰地呈现进程间的网络通信和部署环境的网络结构特点。当然也可以用细粒度的执行实体对应处理器、存储器等。部署视图有助于设计人员分析一个设计的质量属性,比如软件处理网络高并发的能力、软件对处理器的计算需求等。
此项目的部署视图如下:
工作分配视图将系统分解成可独立完成的工作任务,以便分配给各项目团队和成员。工作分配视图有利于跟踪不同项目团队和成员的工作任务的进度,也有利于在项目团队和成员之间合理地分配和调整项目资源,甚至在项目计划阶段,工作分配视图对于进度规划、项目评估和经费预算都能起到有益的作用。
本项目的工作分配视图如下:
本系统使用SQLite作为数据库,SQLite数据库属于轻量级数据库,是一个符合ACID的关系数据库管理系统。SQLite是一个零配置的数据库引擎,即通常不需要配置,而这意味着工作人员不需要在系统中配置它,省时省力不少。
而具体的数据库设计如下:
用户信息表:
属性名 | 类型 | 是否可取空(Y/N) | 注释 |
---|---|---|---|
name | CharField | N | 用户名(主键) |
password | CharField | N | 用户密码 |
EmailField | N | 用户邮箱 | |
has_confirmed | BooleanField | N | 判别用户是否已注册 |
鉴别真伪图片模型表:
属性名 | 类型 | 是否可取空(Y/N) | 注释 |
---|---|---|---|
Title | CharField | N | 图片标题(主键) |
Image | ImageField | N | 图片内容 |
判断图片模型表:
属性名 | 类型 | 是否可取空(Y/N) | 注释 |
---|---|---|---|
TestImg_title | CharField | N | 测试图片标题(主键) |
TestImg_image | ImageField | N | 测试图片内容 |
ReferenceImg_title | CharField | N | 参考图片标题(主键) |
ReferenceImg_image | ImageField | N | 参考图片内容 |
本项目主要采用Pytorch深度学习框架实现签名真伪鉴别算法模型,展示网页主要使用Django来开发。前端部分采用HTML、CSS、Bootstrap等技术实现用户界面的开发;后台服务器端基于python语言进行开发,核心部分采用Pytorch框架,对数据库的管理主要选择Django内置的ORM,以及轻量级SQLite数据库。
前端开发平台:PyCharm
? 后台开发平台:PyCharm
? 数据库:SQLite
概念的定义即人对能代表某种事物或发展过程的特点及意义所形成的思维结论。因此我们可以得出概念原型的定义,其是一种虚拟的、理想化的软件产品形式,更加直观的来说,概念原型等于数据模型加上用例。而通过前文的分析我们可以总结出本项目的概念原型,同时对此概念模型的工作过程进行分析。
整个概念模型的工作过程为:用户登录系统后,若先前已经在数据库上传过真实签名,则直接选择签名鉴别功能,将待检测签名图片传入系统,系统则会判断检测的签名是否为真签名;若之前未在数据库内上传过真实签名,则选择签名判断功能,将待检测的签名图片与参考签名图片同时上传,系统则会判别这两张图片是否为一人所写。而对于管理员来说,可以登录后台管理系统,进行用户信息的更改以及签名真伪鉴别算法的模型的更改。
### 7、总结
本篇博客主要对基于本人的工程实践项目----签名真伪鉴别进行了软件系统设计方案的分析,总结了项目设计方案中所蕴含的软件结构特点,比如设计模式、软件架构风格与策略等;并采用不同的视图来描述项目的软件系统概念原型,比如分解视图、依赖视图、泛化视图、执行视图、实现视图、部署视图、工作分配视图,使得我加深了对软件系统设计方案的理解,为以后进行软件系统的设计打下了基础。
主要参考文献为:软件科学基础概念.PPT
原文:https://www.cnblogs.com/sly0824/p/14203057.html