李尚林, 王魯達, 劉 東
(湘南學院軟件與通信工程學院,湖南 郴州 423000)
隨著移動互聯(lián)網(wǎng)技術(shù)的發(fā)展,移動支付已經(jīng)成為人們主流的支付方式。而使用移動支付的前提是需要人們綁定銀行卡,用戶逐個輸入銀行卡上的數(shù)字既費時費力,又容易出錯?,F(xiàn)代的移動設備普遍具有較高分辨率的攝像頭,通過攝像頭拍攝銀行卡,并使用光學識別技術(shù)自動識別銀行卡上的數(shù)字,能夠極大提高移動支付的用戶體驗。
近年來,光學字符識別(optical character recognition,OCR)已經(jīng)比較成熟,在規(guī)范的文本文檔掃描方面識別率已經(jīng)達到了99%以上。然而,在自然影像場景中對銀行卡識別的應用,仍然存在較大挑戰(zhàn)[1],主要表現(xiàn)為:①銀行卡普遍具有復雜的背景,給字符區(qū)域的識別和字符分割帶來較大影響;②銀行卡拍攝的角度導致的透視形變、不均勻的光照產(chǎn)生的數(shù)字顏色畸變和視覺特征退化,會進一步降低識別的準確率。
目前的文本檢測主要分為基于區(qū)域、邊緣及紋理的方法。下面分別對其進行討論。
基于區(qū)域的方法是利用文本字符普遍具有相似的顏色特征,且和背景顏色相比,具有較強的對比度。通過將具有高相似度的特征點聚集成連通區(qū)域,能夠提取出文本所在區(qū)域。較具代表性的工作有基于最大穩(wěn)定極值域(maximally stable extremal regions,MSER)的自適應的閾值分割法[2]、基于統(tǒng)計學模型的連通區(qū)域分析法[3],以及基于聚類和級聯(lián)分類器對字符對的空間特征進行學習而獲取連通區(qū)域分析模型[4]。通過利用字符筆畫寬度的一致性特征,EPSHTEIN等[5]提出的筆畫寬度變換算法(stroke width transform,SWT),不過該類算法在處理對比度較低的字符區(qū)域顯得較弱??傊趨^(qū)域的方法適用于文本區(qū)域的顏色、灰度等視覺特征比較一致,且對比度較高的情況。
基于邊緣的方法適用于字符前景和后景對比并不突出的場景。該類方法利用了字符文本具有較強烈而密集的梯度特征??墒褂眠吘墮z測算子,從梯度變換的特征中獲取字符區(qū)域。除了使用常規(guī)的Canny算子[5]以外,傅里葉-拉普拉斯濾波[6]、測字符的幾何結(jié)構(gòu)的梯度向量流(gradient vector flow,GVF)[7]等方法被提出,這類方法具有檢測速度快且易于實現(xiàn)等優(yōu)點。
基于紋理的方法將文本視作區(qū)別于背景的特殊紋理。通過滑窗的方式提取局部紋理特征并進行分類來預測局部區(qū)域紋理的所屬標簽?;趃abor[8],HOG[9],LBP[10]的特征被廣泛的用于各類自然場景的文字識別研究中。另一類研究聚焦于提取字符特殊的特征,從而與背景區(qū)分開來[11],不過這類方法局限于處理清晰規(guī)范的英文字母。
近年來,使用人工神經(jīng)網(wǎng)絡[12]自動獲取特征進行分類取得了較大進展,逐漸成為了模式識別和目標檢測的主要潮流。最具代表性的工作為最新的EAST[13]網(wǎng)絡,該方法在自然場景文本識別中能夠獲得較高的識別準確率。理論上,將主流的目標檢測網(wǎng)絡如Faster-RCNN[14],Yolo[15]等,用于自然場景的銀行卡數(shù)字檢測任務中亦是一種可行的方法,然而在實際應用中卻存如下問題:
(1) 相對于主流的自然場景文本環(huán)境如街道中的商標文字、圖片、視頻中的字幕等,很多銀行卡的數(shù)字和背景區(qū)分度極低,難度較大;
(2) 銀行卡數(shù)字相對整張卡片而言太小,該類小尺度目標檢測問題目前仍是難點[16];
(3) 容易發(fā)生漏檢,而銀行卡檢測任務對漏檢的容忍度較低;
(4) 目標檢測網(wǎng)絡需要大量的完整銀行卡數(shù)據(jù)作為訓練集,該類敏感數(shù)據(jù)的獲取、標定難度較大。
總之,使用目標檢測網(wǎng)絡,在數(shù)據(jù)獲取和識別等各個階段都存在較大的困難和挑戰(zhàn)。
對于車牌識別[17]、身份證識別[18]等任務而言,由于其背景相對干凈,字符規(guī)范,且與背景區(qū)分明顯,使用文獻[19]Tesseract類的解決方案能達到很高的準確率,其應用已經(jīng)相對成熟,而銀行卡由于品類繁多,字體不規(guī)范,且背景紛亂復雜,極端情況甚至肉眼識別都具有較大難度,這些因素給識別工作帶來了較大的挑戰(zhàn)。商用領域的解決方案會使用大量的銀行卡先驗經(jīng)驗,如不同銀行卡商家的模板,數(shù)字序列規(guī)則等,因此需要隨著新的廠商類型和新的卡片類型進行更新。本文算法盡可能避免使用這類先驗經(jīng)驗,使得方法具有易實現(xiàn)、通用性強、魯棒性高的特點。
基于卷積神經(jīng)網(wǎng)絡(convolution neural network,CNN)的銀行卡數(shù)字識別方法框架如圖1所示,本文將圍繞如下部分展開討論:
(1) 數(shù)字區(qū)域檢測。包括傾斜矯正和數(shù)字區(qū)域獲取。前者用于將自然拍攝的銀行卡圖像恢復成矯正后的俯瞰視圖,后者通過一系列圖像算法獲取目標銀行卡數(shù)字所在的區(qū)域。
(2) CNN訓練。包括訓練數(shù)據(jù)的增強和所使用CNN的具體模型結(jié)構(gòu)。
(3) 數(shù)字識別。使用CNN滑窗算法分割單個數(shù)字,以及如何使用平滑優(yōu)化算法獲得更加準確的數(shù)字序列。
圖1 銀行卡數(shù)字識別方法框架
當前市面上絕大多數(shù)銀行卡均符合國際ISO/IEC 7810中的ID-1標準,尺寸為85.60 mm×53.98 mm。移動設備的拍照識別程序通常都會利用該長寬比引導用戶拍攝銀行卡,因此,本文假設獲取到的銀行卡影像是完整的。
1.1.1 傾斜校正
由于拍攝位置的自由性,使用移動設備獲取的銀行卡圖像通常存在一定的角度傾斜,角度較大的圖像會嚴重影響后續(xù)的識別??紤]到算法的魯棒性,需要分2種情況考慮。
對于銀行卡邊緣完整的情況,可以考慮先獲取銀行卡邊緣,再對圖像進行投影校正。具體方法如下:
(1) 使用Canny算子來獲取邊緣;
(2) 使用霍夫變換來查找直線,同時過濾角度不合理的直線;
(3) 通過直線求交點運算,得到銀行卡輪廓的4個角點;(4) 對圖像使用投影變換,獲得矯正后的圖像。對于銀行卡邊緣不完整的情況,可以使用車牌識別領域中常用的Radon變換[20]進行處理。
綜上所述,銀行卡拍攝角度的矯正過程如圖 2所示。
1.1.2 數(shù)字區(qū)域獲取
目前主流的銀行卡上的數(shù)字區(qū)域可以分為噴涂式和按壓式2類。噴涂式的數(shù)字通常采用深色的顏色,使之與淺色的背景作區(qū)分,該類型銀行卡的數(shù)字區(qū)域的定位相對較為簡單;而按壓式銀行卡,其數(shù)字區(qū)域和卡片背景具有一致的顏色,只能通過檢測按壓區(qū)域的光線變化進行檢測。
對于噴涂銀行卡,其核心預處理是先做二值化,再做閉操作,最后重復多次膨脹和腐蝕連接相鄰的數(shù)字區(qū)域。考慮到銀行卡中的數(shù)字是水平排列的,因此形態(tài)學操作的卷積核大小設置為(x=20,y=5),使得數(shù)字區(qū)域能夠在水平方向上進行連接。
對于按壓銀行卡,其核心預處理是利用旋轉(zhuǎn)不變性的Laplace算子檢測數(shù)字區(qū)域邊緣凹凸不平產(chǎn)生的梯度變化。由于Laplace算子對噪聲敏感,因此必須先做歸一化處理和高斯模糊。邊緣檢測完成后,使用相同的形態(tài)學處理連接數(shù)字區(qū)域,最后進行最大類間方差(OTSU)算法進行二值化。
經(jīng)上述預處理可獲取到1個或多個目標數(shù)字區(qū)域,最后可以使用投影法,篩選得到最佳的數(shù)字區(qū)域。圖3為數(shù)字區(qū)域獲取過程示意圖。
圖2 投影校正過程
獲取到數(shù)字區(qū)域后,需對獨立的數(shù)字進行分割與識別。本文使用CNN分類器作為數(shù)字的分隔和識別任務的核心。
1.2.1 CNN模型
用于識別單個數(shù)字的 CNN網(wǎng)絡模型結(jié)構(gòu)如圖4所示。網(wǎng)絡共包括3個卷積層,3個Max pooling層,2個全連接層,1個Softmax輸出層??紤]到銀行卡數(shù)字和背景顏色的無關(guān)性,該模型的輸入大小為寬度w=30,高度h=46的單通道灰度圖,最終將輸出圖像分成11類,類別0到9為對應的數(shù)字標簽,類別10為非數(shù)字區(qū)域標簽。
1.2.2 數(shù)據(jù)增強
考慮到數(shù)字區(qū)域提取部分結(jié)果必然存在一定的誤差(如透視投影畸變、字符區(qū)域有少量像素被截取等),合理的數(shù)據(jù)增強是提升CNN識別準確率的關(guān)鍵因素之一。
(1) 數(shù)字標簽數(shù)據(jù)。數(shù)字標簽為0到9共10類,每個訓練圖片為一個完整的單個數(shù)字字符的圖像。這類圖片的增強方法包括:x方向平移像素k;y方向平移像素k;中心旋轉(zhuǎn)角度k。其中k∈[-2, 2]。
(2) 非數(shù)字區(qū)域標簽數(shù)據(jù)。該類標簽數(shù)據(jù)來源于:銀行卡背景、其他非數(shù)字字符、以及同時存在2個字符的情況。
圖3 數(shù)字區(qū)域獲取測((a)~(d)為噴涂銀行卡樣例;(e)~(h)為按壓銀行卡樣例)
圖4 CNN模型示意圖
圖5 數(shù)據(jù)增強
通過上述數(shù)據(jù)增強(圖5),每一類標簽的訓練數(shù)據(jù)大約為2 000,訓練圖片數(shù)據(jù)總量約為2萬。使用交叉驗證方法在該數(shù)據(jù)集上訓練的CNN能夠達到99.5%左右的準確率。值得說明的是,如果使用VGG或者ResNet等網(wǎng)絡模型替換圖4中提出的模型,雖然能夠在訓練集和驗證集上得到更高的準確率和更低的損失,然而在實際檢測過程中卻并不能獲取更高的識別準確率。通過大量實驗分析,其原因可能在于:真實的銀行卡測試數(shù)據(jù)和訓練集中的數(shù)據(jù)存在較大的差異,而更復雜的網(wǎng)絡對該訓練集容易產(chǎn)生過擬合。因此,綜合考慮到數(shù)據(jù)集、準確度、泛化能力、訓練成本等因素,在大量實驗和驗證后得到了圖4所示的網(wǎng)絡。
1.3.1 滑窗分割
使用訓練好的 CNN對數(shù)字區(qū)域進行數(shù)字分割(圖 6)。首先將數(shù)字區(qū)域的大小進行標準化,保證其高度與CNN輸入的高度h保持一致。對于給定寬度W的輸入數(shù)字區(qū)域,通過滑窗算法在橫坐標區(qū)間[0,W-w]上逐一將子區(qū)域輸入CNN,輸出為一個長度為W-w+1的輸出序列。將橫坐標值作為x坐標,對應的CNN輸出標簽值作為y坐標,輸出的函數(shù)曲線如圖6(b)所示。
圖6 數(shù)字分割示意圖
理論上,對于每個y值相同的連續(xù)區(qū)間[a,b],如果其值為數(shù)字標簽(即0到9),且區(qū)間長度大于ω,則可將該區(qū)間所代表的區(qū)域視作對應的有效數(shù)字,否則輸出無效。即
其中,ω的取值和數(shù)字區(qū)域長度W與單個數(shù)字寬度w相關(guān),建議不超過(W/w)/2。
由滑窗分類結(jié)果的輸出不難看出,對于圖6(a)按壓數(shù)字的銀行卡,背景與數(shù)字的區(qū)分難度較大,且背景紋理存在較強烈的干擾,即使用肉眼識別也有一定難度。
即便CNN能夠在訓練集上達到很高的識別準確率,在滑窗識別結(jié)果中(圖 6(b))仍然存在一定的識別錯誤。如果不對該結(jié)果做平滑處理,輸出的卡號與真實值會存在較大誤差。接下來,討論一種平滑優(yōu)化算法,以去除標簽序列中的異常值。
1.3.2 平滑優(yōu)化算法
為了使得卡號的輸出結(jié)果更加準確,需要對滑窗分割的輸出結(jié)果進行平滑優(yōu)化。平滑優(yōu)化建立在如下2個假設基礎之上:
(1)正常的分割區(qū)域(包括背景區(qū)域)的區(qū)間長度應該大于ω,異常的分割區(qū)域長度總是較低的;
(2)背景訓練數(shù)據(jù)決定了正常輸出的 2個數(shù)字之間總是存在背景區(qū)域。
根據(jù)假設 1,可以設計一種濾波平滑算法,將異常的輸出區(qū)間(在數(shù)字分割圖中表現(xiàn)為跳變)抹平。對于式(1)輸出的標簽序列 labels,進行平滑優(yōu)化的算法如下:
算法1.平滑優(yōu)化標簽序列
1 Count = 0,ω1= 3,ω2 = len(labels)/20/3
2 While(ω1 >ω2 or count > Max_Iter)
3 left, right, digits = Find_Min_Region(labels,ω1)
4 if left < 0 or right < 0:
5ω1 += 1
6 else
7 count += 1
8 if left == 0:
9 Filter_Right(labels, Left_x, left, right)
10 elif right == n-1:
11 Filter_Left(labels, Left_x, left, right)
12 else:
13 if labels[left-1]== 10:
14 Filter_Right(labels, Left_x, left, right)
15 else
16 Filter_Left(labels, Left_x, left, right)
區(qū)間長度閾值ω1被初始化為較小的數(shù)字 3,算法持續(xù)尋找低于該閾值的連續(xù)區(qū)間(第 3行),如果該異常區(qū)間出現(xiàn)在左邊界處,則該區(qū)間被平滑為右鄰域區(qū)間標簽值(8~9行);反之出現(xiàn)在右邊界處,則被平滑為左鄰域區(qū)間標簽值(10~11行)。其他情況則根據(jù)假設2進行考慮,如果該區(qū)間左領域區(qū)間為背景區(qū)域,則平滑為右鄰域區(qū)間標簽值(13~14行);其他情況則平滑為左鄰域區(qū)間標簽值(15~16行)。如果找不到待平滑的異常區(qū)間,則增加閾值ω1進行下一輪迭代查找,直到達到閾值ω2或超過迭代次數(shù)限制Max_Iter。
平滑過濾后的數(shù)字分割如圖6(c)所示,在該結(jié)果的基礎上使用式(1)即可輸出相對準確的銀行卡數(shù)字序列。
實驗平臺為Windows 7 64 bit操作系統(tǒng),硬件配置為Intel Core i7-4790 3.60 G CPU,16 G內(nèi)存和NVIDIA GTX 760圖形處理器,深度學習框架采用Tensorflow+Keras。部分識別的結(jié)果如圖 7所示,其中第1行為銀行卡影像,第2行為獲取到的數(shù)字區(qū)域,第3行為數(shù)字分割圖,第4行為輸出的銀行卡號。
由于銀行卡檢測領域沒有公開的數(shù)據(jù)集,本文的實驗在自己的數(shù)據(jù)集上測試,數(shù)據(jù)包含 40張銀行卡,其中10張噴涂型,30張按壓型。
實驗將數(shù)字區(qū)域檢測的準確率和數(shù)字識別的準確率分開進行對比。實驗結(jié)果見表1,可以看到EAST方法對噴涂型銀行卡的數(shù)字區(qū)域檢測效果較好,然而對于按壓性效果很差。本文方法處理2類銀行卡效果均較好。在數(shù)字識別部分,3種方法在按壓性銀行卡上效果均不理想,而增加了平滑優(yōu)化的本文方法,在2種類型的卡片上都能獲得較好的效果。
圖7 部分銀行卡檢測結(jié)果
表1 實驗結(jié)果(%)
本文提出了一種基于 CNN的銀行卡號碼識別方法,通過一系列預處理方法獲取數(shù)字所在區(qū)域,然后通過訓練一個 CNN分類器,使用滑窗方法將數(shù)字區(qū)域輸出為目標數(shù)字序列,最后使用平滑算法去除異常區(qū)域,輸出銀行卡數(shù)字序列。實驗結(jié)果證明了算法具有較好的準確率和一定的魯棒性。且本文的算法思想并不局限于銀行卡識別,同樣可以用于身份證、駕照等證件的識別領域。
值得提出的是,本文的算法依舊存在局限性,在處理含有雜亂復雜背景的銀行卡時,數(shù)字區(qū)域的查找、字符的分割的準確率均會下降。在工程應用中通常會采取增加銀行卡相關(guān)的先驗經(jīng)驗(如不同商家銀行卡的數(shù)字區(qū)域分布)、增加訓練樣本等方式提升識別準確率。