總結下最近做的一個項目,只提供一些技術方案,不涉及具體業務和具體實現。
背景
自動識別圖片中電話號碼,也可以推廣到識別字符串,英文等。
---識別--->
“18811610168”
當然,背景會有干擾(自然環境),字體也更多變。
要求:全對識別,人工修正的成本過高,如果有一位識別錯誤,人工修正還不如重新輸入方便(人工輸入可以支持語音識別的)。保證85%以上的數據是可以全對識別的,最好返回全對識別的概率。當然對於電話號碼業務,根據識別的文本結果再加上電話的一些規則,后判斷程序也可以有效地判斷哪些是高概率識別錯誤的。
方案
目標檢測、ocr識別已經是被學術界玩透的技術了。神經網路是目前的大熱,而且效果極佳。識別方案有以下三種:
方案一:作為傳統ocr來解
檢測圖片中的數字位置,然后對數字region過分類器識別。傳統方法:Sliding Windows、Selective Search等尋找候選區域;Boosting分類器、SVM等都可以用於識別。深度學習的方案效果更好,比如:Faster RCNN、YOLO等。
它們的實質都是:檢測字符的位置,識別字符的類別(內容)。
識別結果主要受檢測准確度和識別精度的影響。在檢測完全正確的情況下,自左向右識別各個字符,然后串聯識別結果。如果檢測完全正確,識別分類器的loss=0.01,每個字符的正確識別的概率p=0.99。11位電話全對的概率約為0.895,loss值=-ln(0.895)=0.111。
但是,檢測可能出錯。另外,圖片中的電話可能是傾斜的,后期串聯結果也會比較繁瑣,比如。
方案二:循環神經網絡RNN
方案一沒有考慮電話號碼的序列特性,如果將圖片分割為時序信號,送入RNN/LSTM/BLSTM等網絡,識別性能會大幅提升。
問題是圖片的分割不准確怎么辦?其實這里的分割並不是嚴格的,解決方案是,將圖片按行分割成n個,比如電話號碼分割成21個小圖片,然后20個圖片送入RNN網絡得到20個序列化的輸出。由於一個字符可能在相鄰兩個小圖上出現(各一半),最終的識別結果很可能是“1_88_8_1_1_66_10_16_8”。最后再經過一個CTC網絡融合得到“18811610168”。
方案三:循環卷積網路RCN
方案二是把圖片原圖分割后送入RNN網絡,RNN做特征提取和分類識別。級聯RNN的訓練是不容易收斂的,而且特征的提取工作是CNN的強項。重新設計網絡,可以使用cnn提取圖片的特征,然后將feature Map分割成n個,送入RNN做識別,最終通過CTC得到識別結果。
這樣的好處是,輸入數據不用做預處理,切割可以通過網絡中矩陣的轉置實現;網絡實現了End-to-End;輸出是完整字符串,識別准確率高,loss值約為0.02,全對正確率約為0.98。
參考:
1. Long-term Recurrent Convolutional Networks for Visual Recognition and Description
2.Connectionist Temporal Classification: Labelling Unsegmented Sequence Data with Recurrent Neural Networks