5

1 前言

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

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


2 应用场景差异

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

服务 场景差异 说明
文本识别 稀疏的文本,收据、名片 支持的识别范围和场景"广",啥都能识别,只要是拉丁字符、日韩、中英的文字都可以识别。
文档识别 含有文档的密集文本图片,比如文章、合同等 需要识别出带段落格式的文本信息,此处需要借助云端的运算能力,有更加广泛的语言种类支持能力。
身份证识别 中国大陆二代身份证识别 支持的识别范围和场景很”专“,只识别大陆身份证,准确率高。
银行卡识别 全球常见的银行卡(银联、运通、万事达、Visa、JCB)卡号等关键信息识别 支持的识别范围和场景很”专“,只识别银行卡,准确率高。
通用卡证识别 任意固定板式的卡证,比如会员卡、通行证、工卡等 支持和识别范围和场景介于文本识别和身份证、银行卡识别之间,只要是卡证都可以进行识别。

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

设备端的API只在设备端进行处理和分析,使用的是设备自身CPU、GPU等器件的算力,云端的API则需要把数据送到云端,利用云端的服务器资源进行处理和分析,以上服务除了文档识别由于计算量较大需要在云端进行处理外,其他服务均有设备端API,本次为了简化分析的范围,我们只讲设备端API服务部分。

2.1 场景对比总结

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

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

文本识别使用场景
文本识别服务本身不提供界面,界面由开发者实现

  • 2.1.2 身份证识别、银行卡识别:更像是一个偏科生,其它不会,只会某一科,但这一科学的极好。

  针对身份证、银行卡提供了缺省的定制框,直接对准框就可以快速进行身份证、银行卡号的提取和识别。
 银行卡识别校准界面
在这里插入图片描述

  • 2.1.3 通用卡证:则介于以上两类中间,在某一领域有一定的造诣,横向广度和纵向深度都处于中间位置。

  可以对所有的卡证进行文本类识别,同时提供了卡证类的对准框,提示用户对准待识别的卡证。
通用卡证识别校准界面

2.2 该怎么选

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


3 服务集成差异

3.1 编译依赖差异

  为了便于大家理解,先解释下如下几个概念:
在这里插入图片描述

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

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

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

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

服务 编译依赖 示例代码(版本号以官方最新发布为准)
文本识别 基础SDK+通用模型包(可选拉丁、日韩、中英) // 引入基础SDK implementation 'com.huawei.hms:ml-computer-vision-ocr:1.0.3.300' // 引入拉丁语文字识别模型包 implementation 'com.huawei.hms:ml-computer-vision-ocr-latin-model:1.0.3.315' // 引入日韩语文字识别模型包 implementation 'com.huawei.hms:ml-computer-vision-ocr-jk-model:1.0.3.300' // 引入中英文文字识别模型包implementation 'com.huawei.hms:ml-computer-vision-ocr-cn-model:1.0.3.300'
身份证识别 基础SDK+插件(身份证)+专有模型包(身份证) // 引入基础SDK implementation 'com.huawei.hms:ml-computer-vision-icr:1.0.3.300' // 引入身份证识别plugin包 implementation 'com.huawei.hms:ml-computer-card-icr-cn-plugin:1.0.3.315' // 引入身份证识别模型包 implementation 'com.huawei.hms:ml-computer-card-icr-cn-model:1.0.3.315'
银行卡识别 基础SDK+插件(银行卡)+专有模型包(银行卡) // 引入基础SDK implementation 'com.huawei.hms:ml-computer-vision-bcr:1.0.3.303' // 引入银行卡识别plugin包 implementation 'com.huawei.hms:ml-computer-card-bcr-plugin:1.0.3.300' // 引入银行卡识别模型包 implementation 'com.huawei.hms:ml-computer-card-bcr-model:1.0.3.300'
通用卡证识别 基础SDK+插件(通用卡证)+通用模型包(拉丁) // 引入基础SDK implementation 'com.huawei.hms:ml-computer-vision-ocr:1.0.3.300' // 引入拉丁语文字识别模型包 implementation 'com.huawei.hms:ml-computer-vision-ocr-latin-model:1.0.3.315' // 引入银行卡识别plugin包 implementation 'com.huawei.hms:ml-computer-card-gcr-plugin:1.0.3.300'

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<MLText> task = analyzer.asyncAnalyseFrame(frame);
  4. 结果处理Task<MLText> task = analyzer.asyncAnalyseFrame(frame); task.addOnSuccessListener(new OnSuccessListener<MLText>() { @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,然后通过回调函数获得识别的结果,这里最核心的差异在于返回内容的结构化数据不同,为了便于理解,小编整理了表格出来:
返回内容总结:

服务 返回内容 返回内容说明
文本识别 MLText text 表示图像检测出的文本信息。包含两个属性:1、getStringValue():图像中检测到的所有文本内容;2、getBlocks():图像中检测到的所有文本区块,包含文本内容、文本区块边界和语种等信息。 每个文本块又包含了很多行getContents(),以及行的文本内容getStringValue()、边界getBorder()和语种getLanguageList()等信息,行内又包含了很多个字word,以及字的内容、边界和语种信息
身份证识别 MLCnIcrCaptureResult idCardResult public Bitmap cardBitmap 身份证图片public String idNum 身份证号码public String name 姓名public String sex 性别public String validDate 有效期限
银行卡识别 MLBcrCaptureResult bankCardResult public String getNumber() 获取银行卡号。public android.graphics.Bitmap getNumberBitmap() 获取校正后的银行卡号图片。public android.graphics.Bitmap getOriginalBitmap() 获取原始送检的未经校正的银行卡图片。
通用卡证识别 MLGcrCaptureResult cardResult public static final intCAPTURE_CONTINUE 对识别结果不满意,要求继续检测。public static final int CAPTURE_STOP 退出检测并销毁插件页面。public Bitmap cardBitmap 送检的通用卡证图片。public MLText text 通用卡证识别结果。和上面的文本识别并无区别

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

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

开发难度对比总结

服务 开发难度 开发说明
文本识别 简单 需要开发者获取图片传给SDK,需要对识别后的结果进行信息提取,提取出自己想要的内容
通用卡证识别 很简单 直接通过接口即可启动图像获取界面,需要对识别后的结果进行信息提取,提取出自己想要的内容
身份证识别 极简单 直接通过接口即可启动图像获取界面,直接通过接口获取已经提取好的文字内容,无需后处理
银行卡识别 极简单 直接通过接口即可启动图像获取界面,直接通过接口获取已经提取好的文字内容,无需后处理

4 技术差异分析

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

差异和关联分析

  有了以上基础概念介绍,再来看下文本类服各服务间的差异和关联,为了方便理解,小编画了张图,如下所示:
 文本类服务集成模式解析图

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

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

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


5 总结

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

维度 总结说明
场景 1、文本识别适用范围更广泛,适合任何需要识别文字文本的场景2、身份证&银行卡识别适用于专门的身份证银行卡识别场景,可以提供超高的识别准确率3、通用卡证可以适用于所有卡证类的识别场景,并且能够提供相对较高的识别准确率。
服务集成 1、文本类各服务识别内容后返回的结构化数据不同,银行卡、身份证返回的是经过处理后的结构化数据(如卡号、有效期),可供开发者直接获取使用,通用文本和通用卡证则是返回识别到的所有内容,需要开发者通过一定后处理代码做有效信息提取。2、银行卡、身份证相对通用卡证和文本识别集成开发更加简单 3、文本类各服务需要集成不同的SDK和模型文件
技术差异 1、文本识别和通用卡证识别,使用的是通用模型文件,是通过通用文本数据集进行训练生成的 2、银行卡、身份证使用的是专有模型文件,是通过专有的银行卡、身份证数据集训练生成的

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

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


华为开发者论坛
352 声望56 粉丝

华为开发者论坛是一个为开发者提供信息传播、开发交流、技术分享的交流空间。开发者可以在此获取技术干货、华为源码开放、HMS最新活动等信息,欢迎大家来交流分享!