基於深度學習的銀行卡號識別

基於深度學習的銀行卡號識別

原文與代碼鏈接:https://github.com/ShawnHXH/BankCard-Recognizer

實現工具及平臺

Windows 10, Python 3.6(Anaconda),TensorFlow-gpu, Keras

實現功能與方法

  1. 數據集增強(Cython,SciPy,OpenCV)
  2. 卡號識別(CNN-BLSTM-CTC)
  3. 卡號定位 (EAST)
  4. 交互界面 (PyQt5)

使用方法

  1. 原文處下載源碼
  2. 下載訓練好的模型,CRNN 提取碼:6eqwEAST 提取碼:qiw5
  3. 卡號識別模型放置於crnn/model(建立model文件夾),卡號定位模型放置於east/model
  4. 使用PyCharm打開(或其他IDE),或者直接執行python demo.py
  5. 出現GUI後即可使用

功能介紹

數據集增強

這一部分像SciPy和OpenCV都提供了大部分函數的支持,但問題是若將這些對圖像的變化混雜到一起,可能會引起部分數據錯亂或失效。比如說OpenCV中的放射變換,如果使用此函數對圖像進行變換,會有圖像的空餘區域被黑色填充,而且這部分黑色區域使用同一個庫中的填充函數進行填充,效果也不盡人意。所以秉着寧缺毋濫的初衷,進行了部分函數的重寫。

起初重寫的部分函數是使用純Python實現,但與之而來的卻是運行時間上的問題。Python處理起密集型運算的效果的確不如C這類語言好,於是使用Python的C語言接口,使用Cython進行了重寫,可見於原文裏aug部分的ctoolkits.pyx。那麼效果上,速度有這驚人的提升,可以見下表,但是還是比不上像OpenCV這樣高度優化的庫。但是有提升就表示有效果!
重寫前後運行速度對比如下:

函數名 N (10^N次數) 重寫前/秒 重寫後/秒 速度增幅
add_noise 3 0.2326 0.0159 14.63
shear 3 6.9081 3.9274 1.75
fill 3 38.0633 0.0312 1219.97
resize 2 27.9830 0.0249 1123.81
resize(OpenCV) 2 0.0029 - 85.86

數據增強後效果如下:
aug

卡號識別

在這裏因爲給定的數據集都是每一個上有四個數字(有些爲空格),但是所識別的最終目標——銀行卡號有不定的長度。現在比較流行的解決方案是CRNN和CTC損失函數。於是我就這麼做吧,CNN部分參考自VGG網絡,RNN則使用的是雙向LSTM(簡稱BLSTM),使用GRU也可以實現,可以下來試試。

這個模型不好的地方是訓練。在沒有好GPU的情況下,速度不樂觀,更別提使用CPU了。使用源數據集一千多張圖像,每張數據增強至80張,這下來也要幾萬個圖像數據。像我的GTX 1050都要4-5個小時(說出來丟人….)。如果有好的顯卡,訓練下來時間不會很多。考慮到顯卡不是很理想,就不一邊訓練一邊做數據增強了,怕電腦熱化了。於是在訓練之前,將數據增強後的數據全部封裝到了.npz文件中,然後再直接從文件中讀取,方便許多,電腦也鬆口氣。npz文件的大小取決你每個數據增強的數量,如果是80張,就有4G的大小,50張差不多有2G。識別效果如下圖:
identification

訓練時也可根據自己硬件情況,更改在crnn/run.py中部分參數。模型的源碼和訓練方法可以參見原文的README和crnn部分。訓練數據集下載鏈接。CRNN訓練數據集 提取碼:1jax

卡號定位

這一部分是重中之重,考慮到自己還沒有能力去研究新的圖像字符定位算法,就參考了許多這類算法。現在比較成功的莫過於CTPN了,其次也有Faster-RCNN,EAST,Seg-Link等等。而偏偏選用EAST的原因可能是一見鍾情吧(名字好聽)。
此部分引用的是EAST的Keras實現,但此EAST並非原生的EAST,而是改進的AdvancedEAST(鏈接見原文Reference)。
east
這個模型特點之一就是方便訓練,直觀也簡練。訓練方法及更多原理參見原文部分。

特別值得提起的是數據集,是我自己從互聯網上搜羅來的,然後還進行了標註。過程比較痛苦。面臨的問題是,幾百張數據可能訓練不出好的模型,所以後期使用自動定位不成功的,可能原因之一就是數據集太小(我…盡力了…)。但是用於這樣的小系統開發,還是有一定的使用價值。

如果你有更多的數據的話,若想進行標註。懂的同學可以標註直接標註爲 ICDAR 2015的格式,不懂的同學則可以使用dataset/tagger.py簡陋的標註器來標註,標註方法:以目標區域左上角開始,逆時針的點擊物體的角點,直到最後一個點,可在數據同目錄的txt下看到形如x1,y1,x2,y2,x3,y3,x4,y4,###的值###表示忽略目標內容。如果成功標註完成,在east目錄下運行python preprocess.py得到形如以下形式的圖像,就代表成功了。
acc/gt
具體訓練方法和源碼參見原文。數據集點擊此處鏈接。EAST訓練數據集 提取碼:pqba

交互界面

使用了Qt對Python的接口PyQt5來完成,UI設計使用QtDesigner來完成。整體效果如下:(且不說美,起碼能看,中規中矩吧)
gui
除了讀取(Load)和識別(Identify)兩個按鈕外,還有複製(Copy)和一些調整視圖的按鈕,旋轉和縮放,基本夠用了。
把定位和識別功能都集成在了Identify按鈕上,點擊Load讀取照片後,直接點擊這個按鈕就好。效果如下:
auto
但是也想之前所述,因爲訓練數據的貧乏,導致部分測試數據無法定位。後期可通過增大訓練數據集解決。目前自動定位失敗主要集中在卡號和卡片背景顏色相近的情況,例如都偏暗,或者都偏亮。可以在定位之前,給測試數據加上若干預處理操作,如提高亮度,增加對比度等(那要如果把該有的功能都加上,那豈不是自己Homemade了一個Photoshop…)
error
如果自動識別失敗或定位效果不理想,可以啓動手動定位,使用方法是:在圖片顯示部分鼠標雙擊左鍵,即可激活矩形選框,再進行選擇就好了。(如果非要選擇不是銀行卡的部分,那也拿你沒辦法,你開心就好:)
下面是一些手動定位操作的GIF圖:m1
m2’

註明

  1. 引用的部分已在原文處進行了出處說明,這裏不再聲明;
  2. 若有疑問,請在留言或者在GitHub留下Issues;
  3. 部分訓練方法與使用方法已在原文說明,這裏不再贅述。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章