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
在這里簡單總結下對應服務的開發步驟:
文本識別
- 創建識別器 MLTextAnalyzer analyzer =
MLAnalyzerFactory.getInstance().getLocalTextAnalyzer(setting); - 創建fram對象,傳入圖像bitmap MLFrame frame = MLFrame.fromBitmap(bitmap);
- 把frame對象傳給識別器進行識別 Task
task = analyzer.asyncAnalyseFrame(frame); - 結果處理Task
task = analyzer.asyncAnalyseFrame(frame); task.addOnSuccessListener(new OnSuccessListener () { @Override public void onSuccess(MLText text) { // 識別成功。 } }).addOnFailureListener(new OnFailureListener() { @Override public void onFailure(Exception e) { // 識別失敗。 } });
身份證識別
- 啟動界面進行身份證識別 private void startCaptureActivity(MLCnIcrCapture.Callback callback, boolean isFront, boolean isRemote)
- 重寫callback回調函數,實現對識別結果的處理
private MLCnIcrCapture.Callback idCallback = new MLCnIcrCapture.Callback() { @Override public void onSuccess(MLCnIcrCaptureResult idCardResult){ // 識別成功處理。 } };
銀行卡識別
- 啟動界面進行銀行卡識別 private void startCaptureActivity(MLBcrCapture.Callback callback) {
- 重寫回調函數,實現對識別結果處理
private MLBcrCapture.Callback callback = new MLBcrCapture.Callback() { @Override public void onSuccess(MLBcrCaptureResult bankCardResult){ // 識別成功處理。 } };
通用卡證識別
- 啟動界面進行通用卡證識別 private void startCaptureActivity(Object object, MLGcrCapture.Callback callback)
- 重寫回調函數,實現對識別結果處理
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