阿里妹導讀:隨著深度學習,尤其是CNN和RNN等技術的飛速發展,文字識別技術(OCR)近幾年得到了迅速的提升。與此同時,在智慧化終端的大趨勢下,本地化智慧識別憑藉更高效快捷的體驗以及高度的隱私保護和零流量消耗等優勢備受矚目和親睞,越來越多的應用演算法開始傾向終端化完成,OCR也不例外。接下來,螞蟻金服的演算法專家亦弦為我們剖析這個輕量而精準的移動端OCR引擎——xNN-OCR。
背景及概述
移動端OCR的優勢
受演算法效率和演算法模型大小的限制和約束,目前大部分的OCR端上應用都是上傳圖片到服務端識別再將識別結果回傳到客戶端。雖然滿足了部分業務需求,但一方面,對一些實效性要求較高的業務場景來說使用者體驗無疑是一個巨大的損失,尤其是弱網環境下。另一方面,在面臨大促業務併發請求量過大的情況下,服務端不得不採用降級方案,而如果端上也具備識別能力的話,便可以極大地減少服務端的壓力。此外,涉及到身份證、銀行卡等重要私人證件採用OCR進行資訊提取的時候,端上“識完即焚”這種方式,對這種敏感資料和隱私保護來說是天然的堡壘。因此,具備終端OCR識別能力有著極其重要的業務價值和意義。
移動端OCR的難點
OCR採用深度學習技術使得識別精度在特定的場景下面有了一定的保障,但模型大小和速度問題在端上依然是一大難題。目前大部分的後臺OCR模型通常幾十M或者上百M,可能比整個App安裝包都要大,是不可能直接放到移動端的,而如果走實時下載的辦法,模型過大也會造成下載失敗率高、等待時間長、App佔用空間大、流量消耗大等問題。另外,現在很多OCR演算法在雲端GPU上執行尚且需要幾十到上百毫秒,要在手機CPU上保持較高的執行效率是一個極大的挑戰。
我們做了什麼?——xNN-OCR
xNN-OCR是專門針對移動端本地識別研發的的高精度、高效率、輕體量文字識別引擎,目前支援場景數字、場景英文、場景漢字以及特殊符號的識別。xNN-OCR針對移動端開發和優化了一套基於深度學習的文字檢測和文字行識別演算法框架,結合xNN的網路壓縮和加速能力,檢測和識別模型可以壓縮到數百K級別,在中端及以上手機CPU上達到實時(最高15FPS),可結合“掃一掃”的模式在視訊流中做到所見即所得。
移動端OCR識別技術
移動端OCR技術主要分為二個方面,一是OCR演算法框架的研究和優化,主要目標是探索高精度且輕量級的檢測和識別框架,確保在壓縮之前模型的大小和速度在一個適當的範圍以內,二是利用xNN對模型進行剪枝和量化壓縮到實際應用需要的大小。下圖是我們以銀行卡檢測和識別模型為例子展示整個壓縮流程精度和模型的變化,其他OCR場景識別均是類似流程。
銀行卡檢測/識別模型壓縮
輕量級OCR演算法框架的探索
目前大部分的移動端OCR技術都是以傳統演算法為主,在複雜自然場景下識別率相對較低,而基於深度學習的方案可以很好的解決這一類問題,識別率和穩定性遠超傳統演算法。目前主流的深度學習OCR主要分為文字行檢測和行識別兩大塊,下面我們分別介紹下:
★ 文字行檢測
在檢測方面,我們將物體檢測的Region-CNN框架與FCN的影象分割框架融合在一起,保留了FCN的簡單框架以適應端上對模型尺寸和預測時間的要求,同時又在模型中加入了目標檢測的位置迴歸模組,實現了對任意形狀文字的檢測能力。在基於FCN的整體框架中,為了在精簡模型的同時不降低檢測效果,我們採用了各種模型精簡結構(例如Separable Convolution、Group Convolution + Channel Shuffle等,如下圖),模型的尺寸雖然不斷減小,精度並未隨之下降,在滿足端上對模型的苛刻限制的同時取得了較好的檢測效果。
Separable Convolution
Group Convolution + Channel Shuffle
★ 文字行識別
在識別方面,我們在CRNN(CNN+LSTM+CTC)框架基礎上進行了優化改進,在Densenet的基礎上結合Multiscale Feature、Channel-wise Attention等技術設計出了一套專門用於移動端文字行識別的輕量級CNN網路,同時對LSTM內部引數採用Project技術、全連線層採用SVD、BTD等降維技術進一步減少引數數量(如下圖),在ICDAR2013資料集(NOFINETUNE)上,模型大小下降約50%的前提下識別率高出CRNN近4個點,這一改進優化點為上端打下了強有力的基礎。
Channel-wise Attention
LSTM Projection
★ xNN模型壓縮
目前我們的OCR演算法模型都是基於tensorflow開發的,xNN已經增加了對TFLite模型的支援,並且在效能上已經遠超TFLite。xNN對於我們OCR演算法的模型壓縮比在10-20倍之間,不同的場景稍微有些區別,與此同時,壓縮後模型的精度基本保持不變。由於OCR是一個較複雜的識別任務,演算法模型通常都非常大,並且目前大部分的後臺OCR演算法都是在GPU上執行,要想在端上執行,除了需要在演算法層次上做很多優化外,更需要xNN強大的模型壓縮和加速能力。
移動端OCR應用
OCR技術是資訊提取和場景理解極其重要的技術手段之一,應用領域非常廣泛。目前移動端本地OCR應用從技術角度可以分為2大類,一類是印刷體文字識別,主要是針對字型變化不大、背景單一的場景,例如身份證識別、名片識別、車牌識別等等,另一類是場景類文字識別,主要是針對字型變化大且背景複雜的場景,例如銀行卡識別、燃氣表/水錶識別、門頭名識別、場景英文識別(AR翻譯)等等,這兩類場景中後者識別難度較大,面臨的挑戰性更多。我們將xNN-OCR用於這些場景並根據場景的特點做了各種優化,取得了一系列的成果,特別是在複雜環境下面識別依然可以保持高效和精準,具體的資料如下表。下面簡介了幾個比較重要和常見的應用場景。
OCR部分業務場景資料指標
銀行卡識別:銀行卡識別是金融類行業非常重要的一項技術,是場景數字類識別的一個典型代表。目前大部分銀行卡識別均是採用端上識別的方案,因為端上識別不僅能帶來更好更快的體驗,同時由於不需要資料上傳也能一定程度保護使用者的隱私資料。基於xNN-OCR開發的銀行卡識別在中端手機上耗時<300ms,大部分銀行卡都是秒識別。此外,在面對複雜背景以及複雜環境干擾的時候,xNN-OCR在識別速度和精度上均展現了非常明顯的優勢。
燃氣表識別:通過OCR識別燃氣表讀數是目前燃氣自助抄表中的一項關鍵性技術,相比於傳統上門抄表,一方面可以節省很大的人力物力,避免上門抄錶帶來的麻煩,另外一方面也可以減少漏抄、誤抄等問題。目前已經有很多燃氣公司已經開始應用這一項技術,但實際應用過程中,由於燃氣表的位置有時候比較隱蔽,拍攝角度和光照難以控制,通常一般的使用者拍照上傳到後臺識別的圖片質量都比較差,識別率偏低。xNN-OCR在端上完成整套識別流程,通過識別反饋引導使用者拍攝,可較大程度的提升識別率,在與一家燃氣公司的合作中,我們測試識別率可以達到93%+,模型尺寸可保持在500k以內,識別成功耗時<1s。
車牌/VIN碼識別:車牌/VIN碼識別是傳統印刷體類文字應用的一個經典場景,在移動警務、車輛維修定損等日常場景中起著非常重要的作用。由於車牌/VIN碼識別在實際應用中可能同時需要,為了避免互動流程上的繁瑣以及端上2套演算法模型過大,xNN-OCR將車牌和VIN碼這2個場景識別合二為一,模型尺寸依然<500k,在中端手機上識別成功耗時<1s,並且對光照、模糊、拍攝角度等干擾因素不敏感,同時由於端上可以反覆識別尋求置信度最高的結果作為最終結果,所以相對於後臺識別“一錘子買賣”而言,在識別精度上會更勝一籌。
身份證識別:身份證識別也是金融類行業非常重要的一項技術,在實名認證、安全稽核等場景起著非常重要的作用,但由於中文漢字字型檔較大,導致模型較大,目前大部分的身份證識別均採用的是服務端識別,但由於端側質量難以控制,往往會導致體驗和精度上面難以均衡。xNN-OCR在大字型檔中文識別方面也作出了一些突破,整體模型小於1M,在端側用單字識別信度控制識別精度,避免了對圖片質量判斷的依賴,通過多幀融合提升識別效率,單次識別中端手機上<600ms,識別成功<2s。
展望
xNN-OCR目前在端上已經能較好的識別場景數字、英文以及部分漢字,無論是模型大小、速度、準確度均已達到工業應用的水平,並且全面超過基於傳統演算法識別的OCR端上應用,在多個實際應用專案中對比得以驗證。另外,我們在端上全量7000多類漢字識別上也做出了一些成果,在不久的將來會分享出來,歡迎有興趣的同學來一起研究和探討。
我們堅信,隨著深度學習的移動端化逐步增強和移動硬體裝置的逐步升級,終端智慧化的應用與業務將會越來越多,未來xNN-OCR必將會給OCR相關的業務帶來更深遠的影響和更高的價值。