一文搞懂文本識別、銀行卡識別、通用卡證識別、身份證識別

1 前言

  查看華爲開發者聯盟網站的機器學習服務業務介紹(https://developer.huawei.com/consumer/cn/doc/development/HMS-Guides/ml-introduction-4android

  能夠看到華爲HMS把機器學習服務分紅了文本類、語言類、圖片類、人臉人體類四大服務,後面新特性也在不斷增長中,其中有一類是文本類服務,文本類服務裏面又含了文本識別、文檔識別、身份證識別、銀行卡識別、通用卡證識別,這些子服務之間都有哪些差別和關聯呢,可能不少小夥伴會傻傻分不清,今天小編重點剖析下文本類服務,來看下這幾個子服務間的差別和關聯。git


2 應用場景差別

首先看下文本類服務包含的子服務內容和對應的場景差別github

服務 場景差別 說明
文本識別 稀疏的文本,收據、名片 支持的識別範圍和場景"廣",啥都能識別,只要是拉丁字符、日韓、中英的文字均可以識別。
文檔識別 含有文檔的密集文本圖片,好比文章、合同等 須要識別出帶段落格式的文本信息,此處須要藉助雲端的運算能力,有更加普遍的語言種類支持能力。
身份證識別 中國大陸二代身份證識別 支持的識別範圍和場景很」專「,只識別大陸身份證,準確率高。
銀行卡識別 全球常見的銀行卡(銀聯、運通、萬事達、Visa、JCB)卡號等關鍵信息識別 支持的識別範圍和場景很」專「,只識別銀行卡,準確率高。
通用卡證識別 任意固定板式的卡證,好比會員卡、通行證、工卡等 支持和識別範圍和場景介於文本識別和身份證、銀行卡識別之間,只要是卡證均可以進行識別。

文本類服務SDK有設備端API和雲側API接口兩種,正則表達式

設備端的API只在設備端進行處理和分析,使用的是設備自身CPU、GPU等器件的算力,雲端的API則須要把數據送到雲端,利用雲端的服務器資源進行處理和分析,以上服務除了文檔識別因爲計算量較大須要在雲端進行處理外,其餘服務均有設備端API,本次爲了簡化分析的範圍,咱們只講設備端API服務部分。

2.1 場景對比總結

經過以上對比表格咱們能夠看到,不一樣能力對應的應用場景是有所不一樣的:算法

  • 2.1.1 文本識別:更像是一個全科考生,上知天文下知地理,只要是文本,均可以識別。

文本識別使用場景
文本識別服務自己不提供界面,界面由開發者實現

  • 2.1.2 身份證識別、銀行卡識別:更像是一個偏科生,其它不會,只會某一科,但這一科學的極好。

  針對身份證、銀行卡提供了缺省的定製框,直接對準框就能夠快速進行身份證、銀行卡號的提取和識別。
 銀行卡識別校準界面
在這裏插入圖片描述segmentfault

  • 2.1.3 通用卡證:則介於以上兩類中間,在某一領域有必定的造詣,橫向廣度和縱向深度都處於中間位置。

  能夠對全部的卡證進行文本類識別,同時提供了卡證類的對準框,提示用戶對準待識別的卡證。
通用卡證識別校準界面服務器

2.2 該怎麼選

  很簡單,身份證、銀行卡識別確定選身份證識別服務、銀行卡識別服務啦,其餘卡證類的識別就用通用卡證識別,剩下的場景就用文本識別服務。框架


3 服務集成差別

3.1 編譯依賴差別

  爲了便於你們理解,先解釋下以下幾個概念:
在這裏插入圖片描述機器學習

基礎SDK
  相關服務對開發者呈現的接口,全部的API經過基礎SDK對外開放。async

插件
  就是前面場景對比總結中講到的校準框,提供界面用於對圖像幀的輸入質量作校驗,不知足要求的能夠提示用戶從新擺放。

模型包
  這個是華爲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 表示圖像檢測出的文本信息。包含兩個屬性:一、getStringValue():圖像中檢測到的全部文本內容;二、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 總結

經過以上分析,總結以下:

維度 總結說明
場景 一、文本識別適用範圍更普遍,適合任何須要識別文字文本的場景二、身份證&銀行卡識別適用於專門的身份證銀行卡識別場景,能夠提供超高的識別準確率三、通用卡證能夠適用於全部卡證類的識別場景,而且可以提供相對較高的識別準確率。
服務集成 一、文本類各服務識別內容後返回的結構化數據不一樣,銀行卡、身份證返回的是通過處理後的結構化數據(如卡號、有效期),可供開發者直接獲取使用,通用文本和通用卡證則是返回識別到的全部內容,須要開發者經過必定後處理代碼作有效信息提取。二、銀行卡、身份證相對通用卡證和文本識別集成開發更加簡單 三、文本類各服務須要集成不一樣的SDK和模型文件
技術差別 一、文本識別和通用卡證識別,使用的是通用模型文件,是經過通用文本數據集進行訓練生成的 二、銀行卡、身份證使用的是專有模型文件,是經過專有的銀行卡、身份證數據集訓練生成的

怎麼樣,看完這篇文章後,有什麼感想,快來發表你的觀點吧!

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

相關文章
相關標籤/搜索