1 前言

  查看华为开发者联盟网站的机器学习服务业务介绍(https://developer.huawei.com/consumer/cn/doc/development/HMS-Guides/ml-introduction-4

  可以看到华为HMS把机器学习服务分成了文本类、语言类、图片类、人脸人体类四大服务,后面新特性也在不断增加中,其中有一类是文本类服务,文本类服务里面又含了文本识别、文档识别、身份证识别、银行卡识别、通用卡证识别,这些子服务之间都有哪些差异和关联呢,可能很多小伙伴会傻傻分不清,今天小编重点剖析下文本类服务,来看下这几个子服务间的差异和关联。


2 应用场景差异

首先看下文本类服务包含的子服务内容和对应的场景差异

文本类服务SDK有设备端API和云侧API接口两种,

2.1 场景对比总结

通过以上对比表格我们可以看到,不同能力对应的应用场景是有所不同的:

  • 2.1.1 文本识别:更像是一个全科考生,上知天文下知地理,只要是文本,都可以识别。

一文搞懂文本识别、银行卡识别、通用卡证识别、身份证识别-LMLPHP
一文搞懂文本识别、银行卡识别、通用卡证识别、身份证识别-LMLPHP

  • 2.1.2 身份证识别、银行卡识别:更像是一个偏科生,其它不会,只会某一科,但这一科学的极好。
      针对身份证、银行卡提供了缺省的定制框,直接对准框就可以快速进行身份证、银行卡号的提取和识别。
    一文搞懂文本识别、银行卡识别、通用卡证识别、身份证识别-LMLPHP
    一文搞懂文本识别、银行卡识别、通用卡证识别、身份证识别-LMLPHP
  • 2.1.3 通用卡证:则介于以上两类中间,在某一领域有一定的造诣,横向广度和纵向深度都处于中间位置。
      可以对所有的卡证进行文本类识别,同时提供了卡证类的对准框,提示用户对准待识别的卡证。
    一文搞懂文本识别、银行卡识别、通用卡证识别、身份证识别-LMLPHP

2.2 该怎么选

  很简单,身份证、银行卡识别肯定选身份证识别服务、银行卡识别服务啦,其他卡证类的识别就用通用卡证识别,剩下的场景就用文本识别服务。


3 服务集成差异

3.1 编译依赖差异

  为了便于大家理解,先解释下如下几个概念:
一文搞懂文本识别、银行卡识别、通用卡证识别、身份证识别-LMLPHP

基础SDK
  相关服务对开发者呈现的接口,所有的API通过基础SDK对外开放。

插件
  就是前面场景对比总结中讲到的校准框,提供界面用于对图像帧的输入质量做校验,不满足要求的可以提示用户重新摆放。

模型包
  这个是华为HMS ML Kit各服务的核心所在,它包含通过机器学习平台输入大量样本进行学习并生成的推理模型文件,以及执行这些推理模型所依赖的轻量化推理框架,承载了所有的图像检测与分析,我面我会在技术差异一节展开分析。

下面小编通过一张表来总结下不同服务对应的编译依赖:

3.2 编译依赖总结

  通过以上编译依赖可以看出,所有的服务均需要集成对应基础SDK和模型包,但身份证识别、银行卡识别以及通用卡证识别都有对应的插件,也就是前面讲到的校准框。模型方面,身份证识别和银行卡识别都使用了专有的模型包,而通用卡证识别则使用了通用模型包。

3.3 开发差异

  先分别看下都是怎么集成的,详细步骤就不在细数了,大家可以直接到开发者联盟上查看对应服务的开发步骤
https://developer.huawei.com/consumer/cn/doc/development/HMS-Guides/ml-introduction-4

在这里简单总结下对应服务的开发步骤:

文本识别

  1. 创建识别器 MLTextAnalyzer analyzer =
    MLAnalyzerFactory.getInstance().getLocalTextAnalyzer(setting);
  2. 创建fram对象,传入图像bitmap MLFrame frame = MLFrame.fromBitmap(bitmap);
  3. 把frame对象传给识别器进行识别 Task task = analyzer.asyncAnalyseFrame(frame);
  4. 结果处理Task task = analyzer.asyncAnalyseFrame(frame); task.addOnSuccessListener(new OnSuccessListener() { @Override public void onSuccess(MLText text) { // 识别成功。 } }).addOnFailureListener(new OnFailureListener() { @Override public void onFailure(Exception e) { // 识别失败。 } });

身份证识别

  1. 启动界面进行身份证识别 private void startCaptureActivity(MLCnIcrCapture.Callback callback, boolean isFront, boolean isRemote)
  2. 重写callback回调函数,实现对识别结果的处理
    private MLCnIcrCapture.Callback idCallback = new MLCnIcrCapture.Callback() { @Override public void onSuccess(MLCnIcrCaptureResult idCardResult){ // 识别成功处理。 } };

银行卡识别

  1. 启动界面进行银行卡识别 private void startCaptureActivity(MLBcrCapture.Callback callback) {
  2. 重写回调函数,实现对识别结果处理
    private MLBcrCapture.Callback callback = new MLBcrCapture.Callback() { @Override public void onSuccess(MLBcrCaptureResult bankCardResult){ // 识别成功处理。 } };

通用卡证识别

  1. 启动界面进行通用卡证识别 private void startCaptureActivity(Object object, MLGcrCapture.Callback callback)
  2. 重写回调函数,实现对识别结果处理
    private MLGcrCapture.Callback callback = new MLGcrCapture.Callback() { @Override public int onResult(MLGcrCaptureResult cardResult){
    //识别成功处理 return MLGcrCaptureResult.CAPTURE_STOP;// 处理结束,退出识别。 }
    };

开发总结

  通过以上对比可以发现,除了文本识别不提供界面外,其处理逻辑大同小异,基本都是传要识别的图像给SDK,然后通过回调函数获得识别的结果,这里最核心的差异在于返回内容的结构化数据不同,为了便于理解,小编整理了表格出来:
返回内容总结:

  通过以上对比可以发现,身份证和银行卡返回的是直接处理好的识别内容,直接通过接口即可获取身份证号码、银行卡号这些信息,而不需要关心这些内容是如何提取出来的,而文本识别和通用卡证识别则是返回了识别到的全量信息,里面包含了块、行、字等一级级的文本内容,此时如果开发者想获取自己想要的信息,需要针对识别到的全量信息做提取,比如通过正则表达式匹配连续的x位数字识别为卡号,或者匹配识别到的某一关键字后面的内容。

通过以上分析我们可以得出开发难度对比:

开发难度对比总结


4 技术差异分析

  通过以上的差异分析,我们可以看到文本类服务既存在场景、服务集成上的差异,也存在某些关联,比如文本识别和通用卡证识别服务实际上用了相同的通用模型,下面小编从技术上来对以上的差异做一些分析和解释。前面通过编译依赖分析已经介绍过,文本类服务通常需要集成基础SDK和模型包,有的服务则需要集成插件用于生成校准框,那么模型包又是个什么东西呢?对机器学习有一定了解的小伙伴可能比较清楚,机器学习通常分为收集训练样本、特征抽取、数据建模、预测等几部分,模型实际上就是机器学习中通过训练样本、特征抽取等动作学习到的一个“映射函数”。在华为HMS ML Kit机器学习服务中,仅仅有这个映射函数还不行,还需要有个东西可以执行它,我们可以称之为推理框架,此外还有一些算法需要对图像进行前后处理,比如把图像帧转换为对应的特征向量。为了便于理解,我们统称以上所有内容为模型文件。为了使这些模型文件可以运行在手机上,还需要对这些模型文件进行优化处理,比如优化在手机终端上的运行速度,以及减小模型文件的大小等等。

差异和关联分析

  有了以上基础概念介绍,再来看下文本类服各服务间的差异和关联,为了方便理解,小编画了张图,如下所示:
一文搞懂文本识别、银行卡识别、通用卡证识别、身份证识别-LMLPHP

文本识别
  使用的是通用文本数据集进行的训练,只要是文本都可以识别,他的优点是适用范围广,灵活度高,只要是文字内容,均可以识别。

通用卡证识别
  和文本识别采用的数据集是相同的,因此模型文件也并无差别,只是增加了通用卡证插件,主要的作用是确保用户将卡证对准相机正中位置,另外对反光、模糊图像进行识别和过滤,不满足要求提示用户重新调整,这样就可以提高卡证的识别准确率。

身份证&银行卡识别
  身份证、银行卡识别服务,采用了身份证、银行卡的专有数据训练集,我们都知道诸如银行卡上的文字跟普通的印刷体问题有很大差别,而且存在凸起现象,如果使用通用模型的话,则很难达到非常高的准确率,采用银行卡、身份证专有数据集进行训练,可以让身份证、银行卡识别准确率更高,此外还针对身份证、银行卡做了针对性的识别前处理,比如可以实时动态检测图像质量和倾斜角度,可以生成对准框用于限制卡证的位置摆放,如果模糊、反光和未对准校准框则提示用户重新对准。


5 总结

通过以上分析,总结如下:

怎么样,看完这篇文章后,有什么感想,快来发表你的观点吧!

DemoGithub地址:https://github.com/HMS-MLKit/HUAWEI-HMS-MLKit-Sample


往期链接:Android | 带你零代码实现安卓扫码功能
内容来源:https://developer.huawei.com/consumer/cn/forum/topicview?tid=0201209905778120045&fid=18
原作者:AI_talking

05-09 19:41