本章内容出自《5天入门视觉AI》电子书。
身份证识别系统搭建
在进行实践之前,我们先看一下最终的效果,如下图所示,该系统是一个简单的身份证识别系统。
用户上传身份证人像面和国徽面之后,点击开始识别,就可以得到身份证正反面的内容了。
一、项目简介
下图是这个项目的文件结构,它是通过spring-boot-starter创建的一个spring-boot项目。
项目中主要文件的介绍如下:
- Application:Spring-Boot的一个启动类;
- MainController:控制器层,负责模版的渲染、路由等功能;
- OcrService:负责通过SDK调用视觉智能开放平台的OCR能力;
- index.html:基于thymeleaf的前端模版;
- application.properties:包含若干配置项的配置文件;
- pom.xml:pom依赖。
二、如何获取视觉智能开放平台提供的SDK?
进入到视觉智能开放平台的官网https://vision.aliyun.com/ 后往下拉,我们可以发现平台已经开放了包括人脸识别、文字识别、商品理解等在内的多项视觉AI能力,点击文字识别菜单,可以找到身份证识别项,然后我们点击进入,之后点击文档链接查看具体文档。
在文档页面,我们点击SDK参考,可以看到有两个Java的SDK说明,两个SDK的区别主要是新的JavaSDK支持本地上传图片,也就是说通过这个新的SDK可以直接把本地的图片交给视觉智能开放平台来进行OCR识别、人脸识别等任务。
点击Java(支持本地上传)进入相应的说明页,我们可以看出其中有很多SDK,我们需要找到需要的OCR SDK。如下图所示,我们可以通过https://mvnrepository.com/artifact/com.aliyun/ocr 来找到我们所需要的相应版本的SDK,然后获取我们需要的Maven坐标。
在获取了Maven坐标之后,如下图所示,我们可以通过在pom.xml文件中添加Maven依赖安装java SDK,这样便成功获取到了视觉智能开放平台提供的SDK。
三、项目实现逻辑
(一)前端
前端的实现是基于thymeleaf做的一个模版,其页面如下图所示,包括一个标题、2个表单、2个上传文件的组件以及一个开始识别的按钮。
下图所示是相应的标题、表单和按钮的实现代码。这里我们用到了bootstrap和jquery来进行页面的美化,我们用代理的方式来实现美化,相当于我们点击“上传人像面”的组件时候,会把表达上传到input组件中,再把input中的内容传给form表单,“上传国徽面”也是如此。在input组件中,我们限制了可以上传图片的类型,最前面还设置了一个alert,在用户上传的图片出现问题的时候会进行提示或者报错。
下图是在用户上传正确的图片并提交之后的相关代码逻辑,主要分为两部分:一是对上传的图片进行展示,二是对OCR识别出的信息进行展示,包括姓名、性别、民族、出生日期等信息。
(二)控制层
控制层主要包括如下几部分:
- 定义的若干个私有成员;
- MainCntroller;
- saveFile;
- index;
- uploadFile。
(1)私有成员
私有成员变量如下图所示,包括上传图片文件本地保存地址(uploadDirectory)、调用视觉智能开放平台能力的封装(ocrService)、上传图片的缓存路径地址(faceImage、backImage)、识别结果的缓存(faceResults、backResults)。
(2)MainController
MainController构造方法的代码如下图所示,其中file.upload.path变量是在配置文件中的,是本机的一个上传文件的目录地址,大家可以在实践的时候根据自己的情况进行设置。这里有个小技巧,这里配置的目录地址其实是项目target目录下的一个子目录,这是因为springboot会默认取target下的static目录作为静态文件的地址,如果我们这么设置的话,上传和读取文件对应的是同一目录,可以更方便的进行文件的读取和存储操作。
(3)saveFile
saveFile是一个私有方法,用来保存文件,其代码如下图所示。
(4)index
index是一个控制方法,是一开始进入页面时候用来加载模版的。首先是判断faceImage和backImage缓存是否一样,如果不一样,就全部清除掉;其次就是将已经上传的结果进行展示,起到一个重新刷新页面也不会丢失识别结果的作用。
(5)uploadFile
uploadFile也是一个控制方法,有三个参数,一个正面的人像面的文件,一个背面的国徽面的文件,还有一个用来重定向的参数。首先,判断两张图片是否是空的,如果是空的,将会重定向到index,相当于重新进入首页,并且会有一个message来提示用户必须要上传一个文件,否则是无效的;接下来判断上传目录是否存在,如果不存在就递归的进行创建;然后如果人像面的文件不为空,将其保存到本地,紧接着调用视觉智能开放平台的能力去进行识别,在拿到结果之后将上传的图片和识别结果加入到缓存池中,国徽面的处理方式也类似;最后几行代码是异常的处理,并且会告知用户是哪种报错。
(三)OcrService
CcrService的实现代码如下所示。首先,是4个私有变量,ocrClient、runtime、accessKeyId和accessKeySecret,其中accessKeyId和accessKeySecret要在配置文件中进行配置;其次是一个初始化方法,初始化Client和runtime;接下来是真正调用视觉智能开放平台身份证识别的方法,具体来说,在设置好request之后,我们将request和runtime作为参数传递给ocrClient来调用身份证识别的方法,之后我们得到相应的response,也就是识别的结果,之后我们将结果处理成哈希Map返回给控制层。
控制层拿到返回的结果之后,结合前端的优化进行结果的展示,至此,我们便完成了一个身份证识别系统的构建。