中国知网查重 高校在线论文查重入口

立即检测
  • 58 元/篇
    系统说明: 知网职称论文检测AMLC/SMLC是杂志社专用系统,针对投稿论文、评审论文、学校、单位职称论文的学术不端重复率检测系统。
  • 298 元/篇
    系统说明: 知网本科论文检测PMLC是最权威的大学生毕业论文检测系统,含“大学生论文联合对比库”,国内95%以上高校使用。检测结果和学校一致!
  • 498 元/篇
    系统说明: 此系统不支持验证!可用作研究生初稿检测,相比知网VIP5.3缺少“学术论文联合对比库”,检测结果有5%左右的误差!(论文中若参考往届研究生论文,重复率误差会较大)
  • 128 元/篇
    系统说明: 大分解论文检测系统,对于想检测学术不端文献检测系统,而又价格便宜的同学可以选择,限每篇2.9万字符,结果与大学生PMLC、硕博VIP定稿系统有出入!
  • 68 元/篇
    系统说明: 知网论文小分解检测系统,适合中国知网初稿查重,数据库和定稿查重不同。结果与本科PMLC,研究生VIP5.3有出入,限每篇1.4万字符!
  • 3 元/千字
    系统说明: 学术家论文重复率检测系统,支持学位论文、毕业论文、投稿论文、职称评审论文,提供全文对照,word标红报告,性价比超高!
论文在线分享-文字图像识别与翻译APP的实现
时间:2021-05-20 14:47:46

  本文介绍了OCR(Optical Character Recognition,光学字符识别)技术的发展历程,分析了这项技术的优缺点。通过参照已经在市场上使用很久的移动端翻译软件有道词典的功能和流程,对移动端扫描翻译软件进行了详细的需求分析。本文主要对前端的交互界面和后端的识别功能进行了功能性需求分析,对该程序的可靠性,安全性,交互性进行了非功能性分析。

  本文通过java相关技术、python相关技术、android相关技术、tensorflow框架、springboot框架来完成了该软件的前端交互界面与后端分析模块。前端交互界面主要包括了搜索框搜索功能和相机的调用。后端分析模块由两个神经网络组成,分别是CTPN用于分析文字所在位置与CNN神经网络来识别图片中文字。前后端通过自己建立的局域网接口进行连接。本文通过系统流程图介绍了各模块之间的功能设计与模块之间的关系。

  该系统使用Androidstudio、intellij idea、intellij pycharm、tomcat等开发工具,完成了移动端界面与后端人工智能模型的主要功能和交互界面的实现。本文展示了软件实际应用时的主页面效果图,介绍了CNN与CTPN模型,网络交互功能与交互界面的实现过程。

  随着全球化的不断加深普通人民的生活也产生了许多的变化,更多其他国家的语言与文字出现在了我们的生活中。从几十年前如果不是专业学者普通人民根本不认识英语字母更不用说看懂英文能用英语交流,到今天英语作为一门基础课程被加入小学生的教学目标中,英语在我们的生活中占据了一个越来越大的比例。但是英语作为一门非母语的语音我们总是很难认识英语的所有单词,所以词典成为了一种十分重要的工具。

  但是虽然词典经过许多专业人员的编写与修改十分准确在个人使用上缺非常的繁琐,费时,效率十分的低下。在十几年前电子词典作为词典的代替在市场上广受欢迎,一大批不同厂家的电子词典以各种外形代替者普通词典的地位。但是随着互联网技术与移动设备技术的发展,在网速还没有特别快的时候先出现了金山公司的金山词霸(一款安装在本地的翻译软件),随着网速的增加和网络的普及又产生了一批翻译网站比如百度翻译,爱词霸,有道词典等等,之后随着智能移动设备的普及翻译软件也终于代替了词典出现在人们的生活中,现在的人们只要打开手机就可以直接打开词典进行词汇的翻译。

  1956年人工智能最早诞生于达特茅斯会议上,第一次进入人们的视线时人工智能就叫做AI,第一个神经网络Perceptron在1957年被罗森布拉特发明,1970年受限于计算机的计算能力,AI进入第一寒冬,1980XCON专家系统出现,1990到1991年人工智能计算机DARPA没能实现,AI进入第二次低谷的原因是归咎于政府的缩减投入政策,1997年IBM的DeepBlue战胜国际象棋冠军,2006Hinton提出“深度学习”神经网络,2011年苹果公司的Siri正式投入使用,2013年深度学习算法在语音和视觉识别上的准确率产生重大突破达到了99%和95%的准确率,2016年围棋冠军李世石被由Deepmind团队设计的AlphaGo使用深度学习算法的人工智能机器人战胜了。

  近年来,随着人工智能技术的不断发展。人工智能技术在民用以及商用领域运用的更加广泛。现在智能家居、智能家电层出不穷。人脸识别技术甚至可以个人支付验证功能上实现应用。这些都展现了现在人工智能技术的准确性和普及性。现在人工智能运用的如此广泛的主要原因有:

  移动互联网的普及。从2010年移动互联网的爆发式成长至今基本上人人都用上了大屏幕的智能手机,而现在的智能手机比起十年前的台式计算机其算力甚至是台式计算机的数倍。网络基础设施的发展也是不可同日而语的,5G信号的覆盖使得数据的传输速度不再成为算力的壁垒。

  算法的发展与工程化应用的成熟。机器学习与深度学习算法作为人工智能领域最重要的技术近年来随着各种框架的产生与优化这两种算法在语义与逻辑上能被更容易的理解。而且框架与模型的存在使得商业企业运用人工智能技术的门槛降低,这使得仅用最低限度的工程能力与少量的数学知识就可以在商用场景中使用到人工智能技术,这也是人工智能技术高速普及的重要条件之一

  资本的推进。在PC互联网发展接近尾声的时候,资本的投入使互联网发展得以继续。移动互联网的发展到现在也接近了尾声,所以资本需要新的经济增长点进行投资,而人工智能技术正是这个点。人工智能技术得以应用可以带来更高的效率。百度提出了ALL in AI的发展策略

  经历了技术驱动与数据驱动的阶段,人工智能技术现在已经进入了场景驱动的阶段,在各个行业中不同的场景中解决不同场景下的问题。此类行界事件应用也能对人工智能算法的优化有所脾益,形成正反馈。目前人工智能主要应用在制造、金融、零售、交通、加密、医疗、物流等行业中。

  1.2项目研究现状及意义

  在实际生活中需要进行人工视觉识别的场所很多,比如说车牌识别,文字提取等方面。比如在我们的日常生活中经常会遇到在文件或者是书本上有不认识的英语词汇,通过翻阅词典的方式查询首先需要一本词典其次查询步骤还十分繁琐。所以OCR识别技术是非常必要的。

  这篇论文的主要目的是讨论OCR技术在移动互联网媒体环境下在移动客户端环境下是否可以正常的运行,并讨论OCR技术是否有移动化开发的价值。

  本文的现实意义是实现一个能够给个人用户使用的移动端翻译APP且APP具有OCR文字识别功能,能够在简单自然环境下获取文字并加以翻译。能够更好的丰富移动端设备的功能并且减轻学习所需的开销。实现以轻量化APP完成复杂问题的目的。

  本文的理论意义是实现CNN与CTPN深度学习网络模型的训练,并加以优化。

  1.3国内外研究现状

  1929年科学家德国的Tausheck首先提出了光学字符识别的技术的概念,在这之后许许多多的美国科学家也开始受他的影响长生了文字识别的想法。现在这一技术已经由计算机实现。

  世界上第一个被正式投入使用的OCR软件是1957开发的ERA(Electric Reading Automation)软件。ERA的功能是对字符进行扫描识别,ERA的识别功能通过窥视孔的原理对字符进行逐个的扫描,扫描的速度约为120个每秒

  世界上的OCR发展历程可以被分为三个阶段:

  第一代OCR产品的出现,NCR公司、Farrington公司、IBM公司分别研制出了自己的OCR软件。时间是本世纪60年代初期。

  第二代OCR产品的出现,第二代产品的是基于手写体字符的识别。第二代产品的发展过程中OCR产品的功能产生了质的突破,前期的OCR第二代产品基本上只限于手写体数字的识别并没有太大的使用意义,而后期的OCR第二代产品就已经基本上实现了对其他文字的识别,第二代的时间大概是在60年代中期到70年代初期。

  第三代OCR产品主要解决的技术问题就是对于质量较差的文档及大字符集的识别时间大概是在80年代末期。

  我国的OCR技术方面的研究起步较晚,对数字、英文字母与符号的识别在70年代才刚刚开始进行研究,对汉字的研究更是从70年代末期才开始。直到1986年汉字识别的研究才得到一个实质性的成果。

  中文OCR技术经历了90年的发展至今经历了3个阶段:

  印刷体单子识别,支持国际一级汉字3755字、繁体5401字,简繁体由用户指明,识别率在百分之95左右。

  印刷体多字识别,支持国际一级汉字3755字、繁体5401字,简繁体由用户指明识别率在百分之95左右。

  多字体大字符集简繁体混排、中英文混排识别,支持国际二级汉字6763字、繁体5401字、香港常用字等1万多字,识别字体扩充到常见的十多种字体,识别率在99%左右。

  第二章相关技术基础

  2.1后端开发技术

  2.1.1 java相关技术

  Java作为一门由SUN公司设计并推出的一门高级编程语言,同时它也是一门跨平台的可读性高的编程语言。程序通过JAVA语言进行设计编写具有在任何拥有JAVA环境的设备下运行的能力,实现了真正的跨平台编程跨平台运行.

  Java是一门简单的面向对象编程语言,Java语言具有健壮性与安全性的特性,且可以进行分布式的编程实现,并且在各平台独立运行。其编程得到的程序具备极强的可移植性,且在运行时可以采用多线程并行运行,程序也具备动态的特点。

  具有这些种种优点的JAVA语言当之无愧的成为了行业中最受欢迎的移动互联网,移动开发,网站网页开发编程语言之一。

  Java是作为一种面向对象的编程语言,Class是java程序的基本单元,class中又包含function与property。class可以创建复数个object。Class中的function与property通过实例化的object调用,function包括为class内变量赋值,调用其他function等。

  2.1.2 python相关技术

  Python是一门诞生于20世纪九十年代初期的编程语言,作为由Guido van Rossum开发的解释性脚本计算机程序设计语言,Python已经在各个平台被广泛应用。

  Python作为高度集成的脚本语言具有极强的解释性(每行代码都有其特定的意义),编译性(代码的编译简单且快速),互动性(代码的可读性极高能被人类更加容易的理解)。这门语言被设计之初是用来解决编译自动化脚本SHELL脚本的工作。而随着技术的更新换代,python的版本也在不断的更替新的功能被添加在Python中。这门语言不断地成长到现在越来越多的被单独运用于独立的开发一些大型的项目。Python语言的成功与JAVA语言有一些相似之处,他们都是具有极强可以执行的语言,python也可以在任何拥有python的硬件环境下运行。现在的python作为一种强大的易懂的脚本语言在科学运算,网络爬虫等工程下都能看到它的身影。

  Python也是最适合初学计算机编程的人的一门语言,因为其语法简单(是函数式的语言与面向对象语言的结合)不需要进行过多的声明,且拥有大量的第三方库,这两个优点使这门语言能够帮助初学者快速掌握开发思路并以更短的周期更少量的代码完成程序的开发。

  2.1.3 Tensorflow框架

  TensorFlow是一个深度学习的开源框架,TensorFLow使用计算图来表达模型并进行数字hide计算。计算图是由各种集成在库中的函数组成的,每一个函数在程序中都代表着一个节点,而每个节点的功能都是一个复杂的数学运算(如卷积,池化等),函数之间的通过变量来进行传值,在数学模型上可以把这种传值理解为图的边,传输的数据则为节点的张量。这种灵活的结构使tensorflow模型可以轻易的通过一个API将复杂的计算工作直接部署到个人计算机,大型服务器或者移动设备(Tensorflow lite)的CPU或者GPU中。最初由谷歌大脑团队所属人员开发的Tensorflow框架是以做深度学习运算和神经网络模型的研究为目的的。但是其框架的灵活性使它获得了很好的通用性,所以现在这个模型还被用在了许多其他的领域。Tensorflow的工作流程如下:

  Tensorflow使用计算图graph来存储计算用的数学模型。

  在被称之为会话的Session的上下文Context中执行图。

  将训练数据存入tensor中作为数据

  通过变量(variable)来维护运行的状态

  通过feed等函数在Session中进行模型的训练

  在tensorflow中,构建模型流程比较程式化,有构建图表(Build Graph)和评估(evaluate)两部分,其中构建图表又分为:推理(Inference)、损失(Loss)、训练(train)。

  2.1.4 Springboot框架

  SpringBoot框架是一种集成化的网络网站开发框架,由Pivotal团队设计开发的SpringBoot框架能够有效的简化Spring类型的程序的环境搭建过程和开发过程,能有效的节省网络开发的初期成本。Springboot框架使用一种高度集成的方式进行配置,使用者只需要对XML文件进行一下更改而不需要进行其他样板化的配置过程从而减少了时间的损耗。

  SpringBoot框架依托于Java语言在Java平台上进行开发,作为开源的框架SpringBootT提供了具有反转特性的容器。Java应用中对于Springboot框架的广泛使用使他在没有模型限制的情况下成为了EnterpriseJavaBeans模型的后继者。具有反转特性的容器使Springboot框架能够为网站的开发提供一系列新的完成思路,比如利用控制反转的核心特性来进行对象的生命周期容器化来进行管理,其核心思想是通过依赖注入来控制容器的反转特性从而进行容器的生命周期管理。同时Springboot还具有根据面向切片编程思想设计的声明式事务管理功能,多种持久化技术管理的整合访问接口,以及大量的WEB框架。

  Springboot框架所具有的IOC控制反转特性能够让用Springboot框架编辑的程序获得更加方便的维护和测试通道,IOC提供了一种通过JAVA所特有的机制对JAVA内的对象反射性的统一的配置和管理的相应办法。Springboot框架有用一种特殊的对象配置方法,Springboot框架通过特有容器管理对象的生命周期并可以通过它扫描XML配置文件和在类上用特定标识符( )来注释的注解来进行配置,以这种方式创建的对象开发者可以通过与正常对象类似的通过依赖的方式对对象进行查找注入从而实现对对象的操作。

  AOP面向切片编程框架是Springboot框架的一大特点,SpringAOP框架使用代理运行模式,可以在运行的同时进行配置设置。AOP框架的模块化主要是针对模块之间的交叉点,Spring框架提供的SpringAOP框架为一种轻量级的AOP框架,只能提供AOP的基本特性,但是足以满足基础的编程需求。并且SpringAOP还可以与AspectJ进行集成,通过与该框架的集成即可以满足大部分对于AOP框架的开发需求。AOP框架使Spring框架下的事务管理,远程访问功能可以通过使用SpringAOP的技术得以实现。

  2.1.5 JavaWeb相关技术

  Javaweb技术主要包括三大核心技术servlet,filter,listenner。

  Servlet的主要作用是接受由客户端发送到服务器端的请求信息,之后对收到的请求产生响应并将其内容传给服务器,相应内容动态生成,通常取决于客户端的请求。

  Fliter的主要作用是实现javax servlet Filter接口的三个方法init,doFilter,destory。Filter在启动服务器时加载。随web应用启动该而启动。不像Servlet,它不能产生请求或者响应,它只是修改对某一资源的请求,或者修改对某一资源的响应。或者成为请求的预处理,响应的后处理

  Listener的主要作用是处理针对对象的操作,Listenner也是随web应用的启动而启动,只初始化一次,随web应用的停止而销毁。主要作用是:做一些初始化的内容添加工作、设置一些基本的内容、比如一些参数或者是一些固定的对象等等。

  2.2前端开发技术

  android相关技术

  基于Linux内核开发的安卓系统(不包含GNU组建)是一个自由的且源代码开放的开源移动操作刺痛,安卓操作系统主要被广泛的适用于智能手机,智能平板,智能电视等智能移动设备与智能家具中。安卓操作系统由美国的谷歌公司联合开放手机联盟合作领导开发,使用java语言作为操作系统内核开发的安卓操作系统主要的系统架构和其他的操作系统相似,采用了分层的设计架构,以架构图的角度来看安卓具有四个设计层,以从高到低的角度来进行排序分别是,应用程序层,应用框架程序层,系统运行库层和系统核心linux系统层。

  2.3开发工具

  1.IDEA

  被JetBrains开发出来的全世界业界公认为最好的JAVA语言程序开发工作环境程序IDEA全程位Intellij idea,是一种java语言的高度集成程序开发环境

  IDEA在业界被公认为最好的理由有很多。比如说IDEA拥有智能生成代码,代码自动提示的功能,能够有效的提升程序编写的速度也给刚刚接触行业的初学者提供了学习的便利。IDEA的重构功能能够使开发者在进行代码开发维护时能够快速的更改整个项目,比如对项目中某个变量进行更改删除,或者是对某个文件进行更改删除,只要该变量或文件被引用IDEA都能自动的进行安全的项目重构。IDEA对其他类型的项目支持也是做的十分的出色,比如JavaEE的支持,XML语言的全提示支持,JSP的完全支持。并且IDEA的快速配置也十分的使用比如直接在IDE内可以进行Springboot框架的配置,直接自动配置MAVEN仓库等功能,IDEA同时也支持各类版本工具,代码分析等功能。

  2.Pycharm

  同样由JetBrains开发出来的被全世界广泛应用的Python语言程序开发工作环境程序Pycharm全称Intellij Pycharm是一种Python语言的集成程序开发环境。

  Pycharm具有类似于其他一般IDE的功能比如说对程序的单步调试,对各种关键词和函数进行颜色提示的语法高亮。Pycharm还有自己的特色功能比如,在编译前提前显示错误位置与给出修改办法,且能通过快捷键进行自动修改和对引用包的引用,对整个项目的文件进行整合显示的工程文件管理,以及在对项目文件进行index目录编辑后的代码自动跳转功能,在编程时对函数与关键字以及函数内参数等内容进行提示的智能提示功能,以及快速生成代码的代码协助功能。Pycharm还具有对Django项目进行直接编辑测试开发的功能。

  值得一提的是Pycharm的pip管理工具。Pycharm的pip工具简洁明了。使用Pycharm内的批评工具不需要手动输入指令,Pycharmpip可以进行完全的可视化操作。且其对于库的支持能满足绝大多数的开发需求,从目录中直接进行搜索能够直接得到多版本多环境的开发库,且对于国内的用户来说下载速度也比直接使用PIP的速度快。

  3.Android Studio

  由谷歌设计推出的以Intellij IDEA作为内核的AndroidStudio是一个Android的集成开发环境程序,蕾西与Eclipse ADT,AndroidStudio主要的功能是针对安卓项目的开发与调试,提供了相关功能的工具。

  Android Studio主要提供的功能在基于IDEA的JAVA编辑模块功能上二外的提供了基于Gradle的构建支持,Gradle架构的功能是提供对Android程序的转出功能提供服务,并可以快速的通过R变量等特殊说明标识符对Android程序进行快速的重构,例如对程序中各种Activity进行快速的配置。还提供了Android的模板以及可视化的布局编辑器,Android的可视化编辑是通过拖拽等方式将需要的模块可视化的放入一个布局中,之后自动在对应的界面说明xml对其进行代码的显示,开发者则通过对xml中的参数与变量的修改来进一步细化优化界面的布局,并在Activity中通过对对应xml中的控件的nameid通过R变量进行绑定来实现其功能。

  2.4深度学习及其算法介绍

  深度学习(Deep Learning)是机器学习领域弓更深一层的研究方向,相对于机器学习深度学习更接近于人们所理解的人工智能。

  深度学习的核心思想是学习样本数据中的规律使网络实现对特定特征的分类能力。

  本课题中对文字的扫描需要的正是这种能力,所以本项目选择使用深度学习网络进行完成。

  首先对文字进行扫描需要两个步骤,一是确定文字所在的位置,二是对文字进行扫描分析来确定其内容所以在本课题中我选择了分别用两个深度学习神经网络来实现这个目标,CTPN与CNN。

  2.4.1 CTPN算法介绍

  CTPN全称Connectionist Text Proposal Network,是一个基于Faster R-CNN改进得到的网络。其主要功能识别文本在图片中的位置。这个网络的主要思想是开发了一种anchor回归机制。这个回归机制能够联合预测每个文本的垂直位置和文本与非文本的权值得分,以更好地确定文字位置提升定位的精度。CTPN的主要工作流程是先检测小文本框通过多个小尺度文本框来确定文字的精确位置,之后通过RNN网络进行文本框的链接使识别结果变成一个整体而不是因为单个字符之间的空隙而分割开的个体。之后将文本框细化将多个文本框的值进行加权计算得到一个大文本框的值作为模型输出的结果。

  图2.1 CTPN网络结构图

  2.4.2 CNN算法介绍

  CNN全称Convolutional Neural Networks,该网络的主要内核是卷积运算且该网络具有深度结构,卷积神经网络是一种高效识别的神经网络算法,这种算法是深度学习的代表算法之一。

  CNN最早由是本学者福岛邦彦提出的neocognitron模型衍生过来的该网络可以被称之为CNN的鼻祖。之后在1987年TDNN作为第一个历史意义上真正的CNN问世。

  CNN主要的用途是识别二维图形,CNN能识别同一图像的位移,缩放以及扭曲的结果。CNN通过特征检验层来获得训练数据并进行训练,所以在训练CNN模型时可以避免显示的特征抽取,通过特征检验层来进行隐士的学习获得训练数据中的特征权值。而且CNN网络还具有并行学习的能力,其原因是因为CNN的统一特征权值组中映射面的神经元的权值是相同的,并行学习的能力是卷积神经网络的重要优势之一。

  本课题中使用的CNN模型是AlexNet。AlexNet是在2012由Alex等人在ImageNet大赛上设计并夺冠的图像识别卷积神经网络模型,其特点有相对深的网络结构,使用了层叠卷积层(conv+conv+pool)的方式来提取图像的特征,使用了损失函数与数据增强来抑制过拟合,使用了Relu作为模型的激活函数。AlexNet包括8个带有权重的层,前5层为卷积层,后3层为全连接层。卷积层的功能是进行卷积运算。该层首先通过一个小矩阵对图像进行遍历在遍历同时取得局部特征生成feature map其数量由卷积核(filter)的数量决定。池化层的功能是对得到的feature map中的数据进行数据精炼,这里使用的是maxpooling。该层通过小矩阵遍历feature map对矩阵中值取最大值形成新的map,这一过程能够增加权值的精准度与缩小feature map的尺寸。Relu激活函数的效果是保留大于0值,小于零的部分变为零使用该函数作为归一化函数解决梯度消失的问题。全连接层的功能类似于一个分类器起到了一个将学习到的特征值映射到样本标记空间的作用。全连接层的工作形式是将之前得到的所有参数进行连接得到一个高维结果。

  图2.2 AlexNet网络结构图

  第三章文字图像识别与翻译APP需求分析

  文字图像识别APP的主要功能是给用户提供一个移动端的APP,该APP能够让用户通过直接输入和拍照扫描的方式进行对英文单词的查询翻译。由于设备的限制我将该项目分为移动端和服务器端两个部分进行设计。

  3.1移动端

  3.1.1移动端系统功能

  交互界面的设计目的是为了让普通用户能直接的,清晰的,明确的理解程序的作用,通过简介的提示让用户能通过简单的步骤便捷的完成自己的任务。本项目的交互页面的主要作用是为用户提供一个显式的后台功能调用的接口,使用户可以直接调用设计的文字图像识别深度学习模型,并直接将模型的分析结果显示在主界面上。

  3.1.2移动端设计思路

  为了实现本项目的交互界面设计目的我将交互界面以功能为划分界限划分为两个模块分别为翻译模块与拍照模块。

  翻译模块包括主要功能搜索,翻译功能是基于有道词典的API进行设计的,通过多线程实现翻译和显示的功能。

  拍照模块主要功能是获取与调用手机的摄像头权限,通过摄像头拍摄所需查询的词汇的照片并存储在手机内存中。

  使用过程设计为:用户首先通过手动输入或者拍照功能分析得到需要查询的词汇存入一个String类型变量中。之后点击查询按钮(如果使用拍照功能则不需要点击),等待获得数据,数据显示在结果界面。

  3.1.3移动端实现方法

  移动端通过Android studio进行开发。移动端程序包括前端与后端两部分,前端的界面主要是通过Android studio自带的可视化界面设计工具进行拖拽操作与对生成界面的XML配置文件进行配置来完成前端界面的设计与显示,界面分为三个界面分别为主界面(如图3.1),拍摄界面(如图3.2),结果界面(如图3.3)。界面之间的关系如图3.4所示。

  图3.1主界面图3.2拍摄界面图3.3结果界面

  图3.4界面关系图

  后端操作包括对网络的访问请求与内存的操作

  网络请求包括对有道API的HTTP请求对服务器的HTTP请求,和建设FTP服务器接口

  Http请求的要点是要建立新的线程等待http请求的返回值使程序在等待时可以进行操作。Http请求的内容是将从搜索模块数据框中读取的数据加入url中向有道API进行请求。

  FTP服务器的主要目的是快速的将图片从客户端送入服务器端,所以需要移动端打开FTP端口,并向服务器端发送HTTP报文请求链接与数据的传送,将图片通过FTP通道中发送到服务器端进行分析并等待返回值。这些工作主要是通过OKhttp与FTPServer第三方jar包来使用。

  内存操作主要是动态申请手机内存的存取权限将摄像头的图像存储到手机中

  3.2服务器端

  3.2.1服务器端系统功能

  服务器端的设计目的是解决人工智能深度学习模型在移动端算力不足的情况下无法正常部署的问题,所以服务器端的主要任务是对图片进行分析并得到结果。

  本项目服务器端的主要功能是接受通过移动端拍照获取的图片,对图片进行预处理与分析,将结果返回移动端。

  3.2.2服务器端设计思路

  服务器端的设计思想是接口设计简洁,通过简单的请求解决问题并返回简单的结果。这里的简单指的是不需要进行复杂的配置,不需要对数据进行复杂的打包与解包操作。

  以解决网络需求与模型部署需求为目的我将服务器端设计为总共包括两个模块的结构。一个网络模块,另一个是图片数据分析模块。

  网络模块的主要功能是对客户端的请求进行接收,对客户端的图片数据进行访问。其主要工作方式是搭建HTTP接口持续的接收请求,并在接收到请求后对服务器的FTP端口进行访问从其中得到指定目录中的指定名称的文件并存入本地。并在得到分析结果后将结果通过http接口送回客户端。该模块的需求是速度要尽可能的快,要对数据传输中可能出现的错误进行预防。

  分析模块的主要功能是对从网络模块接收到的图片文件进行处理分析。其主要处理方式主要是通过深度学习神经网络模型进行对结果进行预测,将得到的结果送入网络模块,期望的结果为图片中的文字。

  我将分析模块的以准确度为目的识别功能又细分为四个功能模块,图像预处理模块,图像中文字定位模块,图像中文字切割模块,与图像中文字识别模块,这四个模块按照图中顺序执行(图3.5),将从移动端得到的图片进行多部处理从而得到一个可靠性较高的结果。

  图3.5分析模块内部功能关系图

  服务器端的整体关系如图3.6。

  图3.6服务器模块整体关系

  3.2.3服务器端实现方法

  服务器端实现主要是通过JAVA语言环境下的Springboot框架来搭建本地服务器接口,通过FTPClient进行对FTP端口的请求两个功能构成网络模块,通过pytho语言的tensorflow框架来进行对深度学习神经网络来进行实现。服务器端的具体实现方法的具体内容放在了本论文的第五章模型的部署与可视化的实现中。

  3.3文字图像识别APP的相关图表

  3.3.1文字图像识别APP的数据流图

  该APP的数据流图分为三层。0层数据流图的目的是体现数据的起点和终点还有数据的罗技关系。

  图3.7.1 0层数据流程图

  第二层1层数据流图是对0层数据流图的一个补充,它对0层中的每个部分进行了更加细致的分割,能够体现信息的主要流动方向。

  图3.7.2 1层数据流程图

  第三层2层数据流图是对1从数据流图中每一个小步骤的再次补充将每一个对数据的操作细化能体现所有数据的转化过程。

  图3.7.3 2层数据流程图

  3.3.2文字图像识别APP的状态转换图

  该APP的状态转换图如下(图3.8)状态转换图的主要目的是建立系统的行为模型,能体现系统在每一个操作时的状态,该状态下的变量与活动,能够显示该系统的状态间的关系。

  图3.9状态转换图

  3.3.3文字图像识别APP的IPO图

  IPO图能够明确的显示每个输入对应的处理以及获得的输出

  图3.9 IPO图

  3.4文字图像识别APP的相关环境配置

  本项目的开发设备为台式个人电脑与安卓智能手机。

  台式机参数如下:

  操作系统:Windows10企业版版本1803

  RAM:32GB

  处理器:I7-6700K 4.00 GHz

  Python版本:3.6

  JAVA版本:1.8.0

  SDK版本:29.0.3

  PyCharm版本:2019.1.1(Professional Edition)

  IDEA版本:2019.3.3(Professional Edition)

  Android Studio:3.5.2

  移动端参数如下:

  操作系统:Android 10(MIUI 11.0.8)

  处理器:骁龙865

  RAM:12GB

  本项目的环境搭建主要是通过Pycharm、IDEA、Android Studio三个IDE来进行的,Python方面通过从Pycharm自带服务器上通过PIP指令进行第三方库的下载,JAVA则是通过IDEA连接spring.io通过IDE的自动配置功能完成Springboot框架与MAVEN仓库的配置。Android Studio是基于IDEA开发的IDE配置方法也与IDEA类似,在新建项目时完成Gradle与MAVEN仓库的配置。

  JAVA环境的第三方包(库):POM.XML 4.0版本,commons—net 3.6版本,Spring boot 2.3.0版本,framework。

  Python环境的第三方包(库):pillow 5.0.0版本,pip 20.0.2版本,tensorflow 1.13.1版本,numpy 1.16.5版本。

  Android Studio的第三方包(库):okhttp3 3.10.0版本,google.code.gson 2.8.5版本。

  第四章CNN与CTPN模型的训练

  4.1模型训练数据的获取

  对于图像学习深度学习网络来说训练数据的获取一直是一个难点,国内没有好的资源站且图像的训练集占用空间量极大获得一个训练集的成本极高。且受到设备条件的影响图像学习深度学习网络的模型训练速度相对慢,在有限的时间内难以进行多个模型的筛选比较,所以一完成模型为目的的前提下我选择了轻量级的训练集Emnist来训练AlexNet并选择自己生成训练集来训练CTPN。

  4.1.1 EMNIST训练集简介

  说到EMNIST首先要提到NIST全称为NIST Speical Database 19,该数据集包含了80多万张图片。这些图片是收集了超过500人的手写字母和数字,并对其内容进行了黑白扫描做成的。其内容可以以不同的分类方法分成5类。

  By_page:包含未经过处理的整页字符的黑白扫描

  By_Author:包含以书写者作为分类依据得到的每一个人的字符

  By_Field:包含以字符与数字作为分类标准的字符

  By_Class:包含按类别分类的字符,类别包括数字10类,字符小写26类,大写26类共计62类

  By_Merge:因为有的因为字母,大小写手写体基本很难分辨,所有这里将这些字母大小写合并,又构成一个新的分类,被合并的有15类,所以共计47类。

  由于NIST的体量过大,且数据集的存储方式以及数据分类构成都难以直接使用产生了MNIST数据集而EMNIST是在MNIST上衍生出来的Extended MNIST

  4.1.2 CTPN训练集的生成

  CTPN需要的数据集为文字图片,文字图片的内容为英文单词,每个单词的位置需要不同。所以我选择使用python库中自带的PIL库的封装函数来生成图片作为CTPN的训练用数据集。数据集的生成步骤如下,首先建立一个TXT文件作为生成图片的内容。TXT文件的内容可以随意添加以空格分隔的英文词汇(长度不宜太长,过长的词汇会增加训练难度)。之后通过ramdom函数生成随机数,将TXT文件中的单词读入一个list中之后根据随机数来随机获取TXT中文字。之后再次生成随机数(需要4个随机数)来确定文字的坐标。之后使用PIL中包含的库函数读取.font格式的文字文件将读取的文字“画”在图片中随机定位出的位置并保存。并将生成的位置坐标保存为对应图片的label文件作为训练的预期结果。为了提升训练的效果,在生成文字前加入背景底噪使数据集的训练素材具备区分度。

  图4.1CTPN中生成的训练集图片

  4.2模型训练与测试

  卷积神经网络的基本训练过程是先输入样本进行计算,然后得到输出的结果,再将输出的结果与理想的结果对比并计算出误差,再计算每个权重的梯度,并用梯度下降法更新权重。

  4.2.1模型的训练

  CTPN模型是在tensorflow框架下在以python语言编辑运行的。训练这一操作基本被tensorflow框架直接集成为函数train。

  首先建立计算图graph编辑模型。定义图的输入输出层并命名。该模型使用的是通过placeholder在计算图中占据位置然后在运算时通过feed_dict函数送入数据的方式进行训练。

  之后建立一个Session开始进行训练,在Session中运行tf.train进行训练。

  在训练过程中使用Saver来对模型进行保存,训练过程中需要不断地进行保存以防止训练过程非正常中断后数据丢失。训练过程的重启是通过Saver.restore函数来对权值以及训练步数进行读取。Saver保存的结果包括:meta图后缀名为.meta包含了完整的tensorflow图,比如所有的变量,运算,集合等。Checkpoint文件这是一个二进制文件保存模型的权重等变量的取值后缀名为.ckpt后期的版本变为.data和.index

  图4.2 CNN的训练过程

  图4.3 CNN模型的训练结果

  CNN的模型训练方法与CTPN大同小异

  4.2.2模型的测试

  测试的过程分为两部第一步是机器测试,通过将数据集分割得到的测试集测试。通过Saver.restore来读取模型。之后建立Session,在session.run中添加参数并获得结果并与理想结果比较通过函数计算得到准确度,run中的参数为在计算图定义中所设定的输出层的name与测试用的图feed_dict。及其测试所得的数据是通过将测试结果与预期结果进行比较,比较使用的函数是tensorflow框架中的tensorflow.equal其功能是比较两个tensor中的值是否相同并返回一个结果的tensor。返回的结果tensor中的值全部为布尔值,将返回的tensor通过tensorflow.cast进行转换(参数为float32)再送入另一个tensor函数reduce_mean中对整个tensor进行降维平均就能得到最后的准确率。

  图4.4 CTPN模型机器测试过程中产生的图片

  图4.5 CTPN模型机器测试过程中所返回的loss值

  第二步是人工测试,本课题的目标是对照片进行识别所以通过手机拍摄照片作为测试素材观察其结果。通过手机拍摄的图片相对于数据集中的图片需要一个额外的步骤。先将图片保存于本地,通过PIL库中的函数convert将其转换为灰度图片,灰度图片的特点是对于每个像素只有一个参数来表示其颜色。之后定义灰度的界限threshold,大于这个值为黑色,小于这个值为白色。然后通过PIL中的函数Point对图片进行二值化处理并再使用convert函数将其转化为RGBA图片。这个图片预处理的过程主要目的是让模型能更准确的识别文字的位置。CNN模型的测试素材为CTPN模型的结果所得到的图片进行分割得到的单个字符图片。

  第五章CNN与CTPN模型部署与可视化

  5.1模型的部署

  该课题的目标是实现一个移动端的文字识别翻译APP。如果将模型部署在移动端APP上对于移动端的算力是一个相当大的考验,我认为一般的手机不足以支持这种计算,所以我选择将APP分为客户端和服务器端,将模型部署在服务器端。

  5.1.1服务器端的具体实现

  服务器端主要的功能是为移动端的APP提供数据交换的服务,所以我在这里选择使用Springboot框架来搭建一个服务器端的交互后台。数据的主要交互方式是通过使用http协议中的http请求来进行的。Http请求是指客户端到服务端请求消息。Http请求的过程是由客户端编写一个http报文然后由服务器端进行报文的处理并返回数据。

  Springboot框架中使用已经封装好的PostMapping和RequestParam类来进行报文的处理,报文的编写在安卓端进行。通过框架处理后获得图片然后通过runtime实现JAVA运行Python脚本,最后再将结果发送给客户端。Springboot框架中的第三方库的依赖是通过配置pom.xml文件来进行下载配置的。

  服务器的另一个功能是对客户端的图片进行读取,读取的方式是通过FTP端口,在这里我选用的是FTPClient第三方JAR包。通过FTPClient类内方法connect先与安卓端的服务器进行连接,通过login、setfiletype、setConnectTimeout等函数确定传输的等待时间、传输的格式等,最后通过类内函数changeWorkingDirectory、retrieveFile等函数实现切换工作路径与读取文件的功能。

  图5.1服务器端的第三方依赖

  在服务器端收到了来自客户端的HTTP请求后首先会在Spring boot框架中得到相应。框架会调用URL中申请的指定路径下的方法(在我的项目里URL为Http://192.168.0.2:2020/get/py,该URL中/get与/py指向了Spring boot框架中的两个 RequestMapping参数从而确定方法的路径)在该方法内部调用了使用FTLClient编写的FTPUlit类,在类内对FTP链接的参数如Username等内容进行定义。然后进行FTP链接对移动端的图片进行读取,最后通过RUNtime先调用CTPN模型将获得的图片中文字的部分进行截取,再通过Opencv与pillow对图像进行分割,最后通过CNN进行单个文字的识别并返回字符串。再将返回的字符串加入URL所调用的函数的ruturn参数中,通过该参数将服务器中分析得到的最终结果通过HTTP接口返回至移动端。

  图5.2 CNN模型与CTPN模型的协作工作过程

  5.1.2客户端的具体实现

  客户端的主要功能是拍照和文字的翻译。

  安卓端的报文使用java中的net包与io包中的类来进行编辑。http报文编辑的重点有内容类型的设定,需要设置边界表示(边界表示可以为任意字符串可通过函数进行随机生成),设定编码(我在这里设置为“UTF-8”),对于输入输出流的权限进行设定,选择是否使用缓存区,对请求的方式进行设定(分为GET和POST,我这里使用的是GET方式因为图片的传输通过FTP来进行),所有报头的固定内容设计完成后将需要传输的数据加入报文中,最后添加一个文件结束标志作为报文的结尾HTTP请求报文完成。之后通过OKHTTP的类内函数Builder与其他参数函数url、get、connecttimeout等将报文的信息转换为端口的设置实现对端口的初始化。之后建立Call对象通过重写Call对象的enqueue方法来实现收到数据后合成Message类对象并向handler发送来实现数据的接收。

  安卓端的FTP服务器是通过第三方包FTPserver实现的,实现方法是通过调用包内类BaseUser来进行用户名、密码、端口的配置。然后通过start函数启动FTP服务。

  图5.3客户端的第三方JAR包

  5.2移动端可视化的实现

  文字的翻译功能主要通过向有道词典的API发送HTTP请求完成,向有道词典API发送的HTTP请求中包括内容有有道词典的URL,API的KEY值,传输数据的种类,和所需要的传输的数据。将所有的这些内容写进一个String类型的变量中。创建一个call对象进行请求,然后对call的enqueue方法进行重写,enqueue方法中包含方法OnFailure和OnResponse(两个方法都继承IOException来获取错误)来返回Call的状态是否成功,成功是触发OnResponse。OnResponse方法中首先从response.body中获取相应数据之后将相应数据封装成json对象,从jaon对象转为java对象再创建一个message包过java对象然后将message发送给handler。当handler获取到信息时再进行进一波的操作。通过这种方法创建子进程来获取Http请求的信息能让程序更流畅的运行而无需在等待时停止所有操作。

  图像的拍照功能主要是通过Android的封装类Camera以及io包来实现的,首先编写一个拍照界面的XML文件,界面中包括一个surface类型的控件用来显示手机摄像头的内容。之后再界面初始化的OnCreate类中对Surface控件进行绑定,在surface的surfaceCreated类中进行对相机的操作。首先调用Camera类中的open方法来打开相机,之后通过Camera类中的Parameters参数与getParameters方法来给相机设置参数,然后用setPictureFormat方法来保存格式,最后使用SetPreviewDisplay方法来展示到SurfaceView中startPreview开启预览。

  还有一个需要注意的点是在8.1以上的安卓版本中所有的关于内存的权限声明在AndroidManifest.XML只进行静态声明是无法对内存进行操作的,需要在MainActiviy的创建函数OnCreate中调用requestMyPermissions方法进行权限的动态申请,存取的权限每次运行都需要进行,不过在大多数版本中都可以勾选选项使该程序再被删除前不需要再次手动进行确认,但是requestMyPermission方法必须要在Oncreate方法中存在。