开发者学堂课程【视觉AI应用开发课程:身份证识别系统搭建】学习笔记,与课程紧密连接,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/749/detail/13216
身份证识别系统搭建
内容介绍
一、身份证识别系统
一、身份证识别系统
1、系统界面
这是身份证识别系统的初始界面,需要上传人像面和上传国徽面。选定图片后点击“开始识别”。此时后台会将身份证的识别信息以及上传的身份证照片返回并展示。
2、项目结构
打开 src 源码包。这是项目是通过 spring-boot-starter 来创建的一个 spring boot 项目。 Application 是一个启动类, MainController是控制气层,负责模板的渲染以及路由等等, Ocrservice 是负责去调用视觉智能开放平台的 ocr 能力,其通过 SDK 调用。
在 resources 里。 indexd.html 是基于 templates 做的一个前端的一个模板,可以根据数据情况动态的渲染; practice 是包含了若干配置项的一个配置文件。
关于 pom 依赖。这里依赖了若干个 spring boot 的相关的依赖项,主要在于 spring-boot-starter 和 thymeleaf 的模板的依赖,以及 spring boot 单元测试的依赖。 comment 包用到了一些通用的函数和方法,视觉智能开放平台提供的 ocr 的一个 SDK ,运用 fastjson 是因为项目中用到了 json 的一个处理。
(1)如何获取视觉智能开放平台提供的 SDK
为了找到 ocr 的SDK ,首先进入视觉智能开放平台官网
在已上线的视觉方面的 AI 能力,点击文字识别,身份证识别,查看产品文档,主要来看 SDK 参考的部分。对于 Java 提供了两种 SDK ,第一种是通用的 SDK ,这个 SDK 要求调用 AI 算法时需要提供 OSS 的 URL ,即需要把一些图片上传到 OSS 里,再拿到该图片的 URL ,才能调用 SDK 。
新版的 Java 的 SDK 支持本地文件上传,在传入参数时不仅可以使用图片的 URL ,还可以使用本地文件,直接使用 ocr 进行各种识别,以调用 AI 能力。
要找到 ocr 的SDK ,如新版本引入的 POM 为<artifactId>ocr</artifactId>。
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>ocr</artifactId>
<version>${aliyun.ocr.version}</version>
</dependency>
说明:可以通过 http://mvnrepository.com/artifact/com.aliyun/SDK 包名称,查看不同服务 SDK 的版本,如 http://mvnrepository.com/artifact/com.aliyun/ocr 。
此时的 OCR 产品也通过 SDK 进行了若干次的升级。
此时的版本为1.0.3,没有坐标,也就是在代码里使用的没有坐标。
(2)如何使用视觉智能开放平台提供的 SDK
首先是基于 thymeleaf 的一个前端的模板。
最上面为标题,其下是两个提供上传文件的组件,以及一个按钮。
其次是代码,代码为一个标题,其下是一个表单,表单里有两个文件上传的按钮,分别是并列的上传人相面和上传国徽面。这里借用了 bootstrap 和 jquery 的能力来实现美化界面的作用。 div 里面实际展示了基于 bootstrap 绘制了一个文件上传的一个组件,通过代理了 file 类型的 input 框来实现美化的作用,相当于点击上一层,实际是把文件上传到 input 的组件,然后再把 input 的组件里面的内容传给放入表单,最后提交。下面的文件上传的按钮也是同样的道理。此外限定了若干种图片上传类型, jpg、png 以及 jepg 。
这里隐藏式的页面结构, input 框也有类型,其 display被设置为 now ,相当于这是原生的一个 input 框;上面是基于 bootstrap 绘制的一个 input 框,这是真正展示的一个样式,他有一个 onclick 的事件通过 i-face 的 ID ,通过这个 ID 其实就是找到了 input 框的组件,相当于 onclick 事件点到了 input 组件,也就相当于这是一个 input 组件的一个门面。
下面是一个提交按钮,这是表单的一个提交按钮,注意到这里有一个 alt 的 Message ,其作用在于当提示用户上传图片有问题、报错等,可以将其展示出来,这里用了 thymeleaf 的一些语法,当信息不为空的时候才展示出来,否则是不展示的。
再下面是上传完图片进行身份证识别、拿到真正的识别数据之后,进行的一个展示,可以看到对两张上传的图片进行了展示,使用 img 标签, faceImage 和 backImage 是后端返回的一个图片文件的地址,这里也同样使用了 thymeleaf 的语法,即这个图片不为空的时候才会展示出来。
这是展示身份证识别的文字结构,识别结果不为空才展示。正面照片有性别、姓名、性别、民族、出生日期、住址、身份证号码,背面主要信息有签发机关有效日期。
(3)控制气层
进入 MainController
用 Controller 以及 RequestMapping , spring boot 提供的education来给 MainController 加注解,另外这里面定义了若干个私有成员、私有变量。 uploadDirectory 定义了上传图片文件本已保存的地址, ocrService 提供了一层调用识别智能开放平台 ocr 能力的一层封装, faceImages 和 backImages 缓存了之前上传图片的一个路径地址, faceResults 和 backResults 是缓存之前的识别结果。这四个变量因为没有用到数据库,所以其实是在内存里面缓存了上传图片和识别结果的信息,这是一个构造方法。
saveFile 用于保存文件。
两个控制方法:一个是 index ,一个是 uploadFile 。
upload.path 在配置文件里面,这个配置文件在实际操作的时候可以设置成自己电脑上的一个目录。关于上传文件地址,地址配置的目录中,除了用户目录, viapi-demo 是项目的根目录, target、classes、static、images 是已给的,这样配的原因是因为 spring boot 会默认取 static 目录作为静态文件的地址,现在文件地址来自于 resources 目录下的 static 目录,如果把静态文件放在 static 目录下,就会根据这个相对路径去取该文件的地址,这是源码里面的目录,编译完成之后,它的目录结构是 target、classes、com、templates , com下面是代码的编译完成的 classes 文件, templates 是前端的模板文件, static 目录对应了 resources 的 static 目录,也就是静态文件地址。把这个文件地址配置到 classes 的原因是 spring boot 会默认来这里取静态文件的地址啊,因为这里没有做静态文件的代理,所以把文件的上传地址直接配置到这里,也就是上传文件也上传到 static 目录下,取这个文件的时候也从这里取,这样就方便进行文件的存储和读取的操作, images 是相对 static 的一个自定义的目录,这个目录下存放了图片类的数据。
Index 相当于页面初始进来的时候会通过这个方法来加载模板,前面的一段逻辑指在异常情况下这两个缓存的图片的数量不一样,可以把它都清除掉;下面的一段逻辑指如果之前有上传过图片并且成功识别了,那么把这些前一次上传以及识别的结果加载到首页,相当于刷新页面,之前上传以及识别的不会丢失,还会展示在页面上。
上传文件的控制方法:两个参数:一个是 face ,其类型是 MultipartFile ,也就是正面人像面的文件, back 是国徽面的文件,这个参数也是重定向的参数,如果这两张图片是空的,可直接重定向到首页,再通过 index 模板进入首页。此外添加 Message 提醒必须要上传一个文件,否则上传是没有作用的。
主要的逻辑:首先看上传目录是否存在,如果不存在的话,需要创建目录,如果人像面的图片不为空,那么把它保存到本地,保存图片的逻辑是通过 StringUtils 的公用方法来将文件的后缀名解出来,并生成一个 UUID 的随机的文件名,并且加上后缀,以防止上传图片时重复的文件名会将旧文件覆盖掉,再用 File copy 来将文件保存到本地,并且返回其文件名。
保存成功后调用 ocrSevise 的身份证识别的方法,输入文件的完整路径,并且确定是人像面的照片,这样就可以得到返回的识别结果,将已经上传的图片和识别的结果加入到缓存池里,这里加 images 是因为保存目录中有 images , spring boot 默认的访问地址是在 static 下,相当于 images 加上文件名就可以访问文件地址。
国徽面的处理大同小异,只是参数、保存的地方略有不同。其参数为 back 。
对于异常处理,如果有异常信息,首先打出来通过 errorMessage 进行捕捉,再将 errorMessage 加入到 Message 中,提醒用户出错以及错误原因,最后再回到首页,这样就把 faceImages 和 faceResults 以及 back 的相关的上传图片的信息以及结果都会渲染到这个页面上。
ocrSevise 的实现逻辑: ocrClient 是调用 ocr 能力的时候需通过需要一个 client 、一个 runtime 的参数, accessKeyID 和 accessKeySecret 是在开通视觉智能开放平台的视觉能力时,会用到自己阿里云账户的 KeyID 和 KeySecret ,需要把其配置到配置文件里。
ocrSevise 的初始化的方法是利用 spring boot 提供的 PostConstruct 标注来实现初始化,这里需要初始化若干个 Config 信息,通过该信息来初始化 ocrClient 和 runtime , runtime 是一个空对象,该对象在下面调用。
调用身份证识别的逻辑: RecognizeIDCard 有两个参数,String filePath 和 String side , filePath 是本地的文件路径, side 是标识身份证正反面的信息。
Request 的代码: Request 是在 Maven 包下,这里有很多的 ocr 的能力,这里只用到了身份证识别。 Request 有两个参数,一个叫 imageURLObject ,他接受的是 InputStream ;另外一个是 Side ,他接受的是 Stream ,他有两个值,一个叫 face 一个叫 bank ,这个可以在 vision 的官网看到。把两个参数分别复制,借助工具类直接去 new 一个 InputStream ,然后通过 filePath拿到 file ,把 side 参数传给 request ,通过 ocrClient 来调用身份证识别的方法,把 request 和 runtime 传给这个方法,就可以拿到一个 response 。 response 返回的数据叫 date ,他有两个 Result , 一个叫 frontResult ,一个叫 backResult ,也就是正反面的结果。如果是正面,就取正面结果,通过 JSON 返成 MAP 的结果,反面同理。将其返回给控制层,将结果加入其中进行展示。展示时,前端的代码有正反面信息的结果,为了简化这个流程用到了 Map 的结构进行返回,原本的 SDK 定义也有其自己的结构定义,其 Response 返回的信息与上述一致,分别为正面信息和反面信息,用到的字段也一致