◆阮章媛 陳麗娟
(福州工商學院 福建 350700)
現如今,移動互聯網產業發展迅速,人們的物質生活水平有了顯著的進步,手機等移動設備被人們所廣泛使用,移動支付也慢慢成為當前最主要的支付方式之一。銀行卡號識別系統是移動支付系統非常重要的模塊之一,銀行卡號識別系統具有廣泛的應用范圍,可以快速有效解決繁雜的卡號錄入的問題,也可以快速處理銀行轉賬業務,因此銀行卡號識別系統在當今社會上具有很大的使用價值。
在銀行卡號識別系統中,以數據集處理為基礎,卡號能否準確提取直接決定了后續字符分割和識別的精度以及圖像處理與識別的質量與成敗。銀行卡號識別是從銀行卡片圖像中確定卡號所在區域并提取出卡號文本圖像,這其中的提取過程相當復雜,會因為卡片背景、拍攝視角、光線、卡片數字磨損等原因使卡號識別受到影響。想要在各種復雜的情況中快速且準確的識別卡號成為銀行卡號識別中的難點。
現在銀行卡號識別已經提出了很多方法,其中圖像處理過程中經常用到的算法有:圖像灰度化、二值化以及直方圖均衡化等。卡號區域主要有以下特征:顏色特征、位置特征、紋理特征等。本文綜合分析銀行卡的特征,提出了基于深度學習的銀行卡號識別技術。
基于深度學習的銀行卡識別系統主要分為五個部分,分別是:數據集處理、銀行卡卡號定位檢測、圖像預處理和字符分割、神經網絡訓練與字符識別以及GUI界面設計。
首先需要建立數據庫,將大量的銀行卡圖片的數據集存入數據庫中;接著經過銀行卡號特征提取實現銀行卡號的定位;然后運用圖像灰度化、二值化及垂直投影等技術對銀行卡圖像進行預處理以及字符分割;之后基于TensorFlow的框架,采用改進之后的LeNet-5神經網絡(用來識別數字的卷積網絡)對前面分割出的單個字符實現模型訓練,再采用OCR進行精確字符識別;最后使用PyQt3語言搭建GUI頁面。系統流程圖如下圖1所示:

圖1 銀行卡號識別系統流程圖
本文基于深度學習的銀行卡號識別系統的銀行卡號定位檢測模塊與字符識別模塊涉及銀行卡圖像數據庫、單個字符圖像數據庫及銀行名稱數據庫等。無論對于哪一種字符識別來說,都是數據庫越大,識別出的結果越精確。然而,由于銀行卡圖片以及銀行卡賬號涉及個人隱私問題,導致目前在各個領域均沒有公開的銀行卡圖片或是銀行賬號的數據庫,因此需手動創設一個銀行卡片相關的數據庫。
現如今,我國的銀行大致分為六類:中央銀行、政策性銀行、商業銀行、信用社、郵政儲蓄以及非銀行金融機構。銀行的種類繁多也導致了銀行卡片的多種多樣,不同銀行的卡片在背景以及卡號凹凸壓印上也有著不同的處理。因此,需要搜集大量不同銀行的銀行卡片圖像數據集來建立一個與銀行卡片相關的數據庫。
有了銀行卡片圖像數據集后,我們還需要整理單個字符的數據集,為后續字符識別神經網絡訓練階段做準備。需要通過大量的銀行卡片圖像整理出0、1、2、3、4、5、6、7、8、9十個數字的單個字符數據集。
我國銀行卡卡號文本的顏色以金、銀、黑為主。其中,不同銀行的卡片在卡號上也有不同的設計,例如卡號凹凸壓印、卡號文本含有空格數量以及卡號文本顏色與卡面是否相同等。
本文基于上述所說的銀行卡號特征,設計了一個基于深度學習的卷積神經網絡(CNN)來對銀行卡號實現特征提取定位,其網絡結構如圖2所示。

圖2 卷積神經網絡結構圖
首先介紹一下神經網絡,它是由多個神經元組成的。其對應的公式為:其中,該單元也可以被稱作是Logistic回歸模型。當將多個神經元聚集起來并含有分層結構時,就形成了標準的神經網絡模型。其對應的公式如下:

這種神經網絡結構圖,可以拓展到有2、3、4、5……個隱含層。
另外,本文主要提及的激活函數為sigmoid函數,其計算公式為:
CNN是局部連接網絡。相對于全連接網絡來說,CNN最大的特點就是:局部連接性和權值共享性。卷積層的計算方法就是根據公式: c o nv =σ(imgMat ○W+b) ,公式中“σ”表示激活函數;“imgMat”表示灰度圖像矩陣;“W”表示卷積核;“○ ”表示卷積操作;“b”表示偏置值。
這里,我們以一張交通銀行卡為例,具體介紹卷積層的計算過程。本文采用Sobel卷積核,其中G_x表示水平方向,G_y表示垂直方向。具體步驟如下:
(1)用Sobel卷積核的水平方向對銀行卡圖像進行卷積,根據前面給出的公式 im gMat○W計算卷積層。
(2)將前面卷積的結果中的每個數值均加上偏置值b,并將得到的結果中的每個數值都輸入到激活函數中。
(3)同樣地,用Sobel卷積核的豎直方向與銀行卡圖像進行卷積。
其他銀行卡圖像處理的原理基本與之相同。如圖3所示為銀行卡卡號定位,其中(a)是原始彩色銀行卡圖像,(b)銀行卡號定位區域的圖像。

圖3 銀行卡號定位
經過銀行卡圖像特征提取定位之后,得到的銀行卡圖像中大部分背景已經去除,但是該區域中不僅含有銀行卡卡號還包含其他背景干擾信息,因此對定位后的銀行卡號圖像必須進行字符分割和識別,而在字符識別前需對圖像進行處理以提高字符識別的速率以及成功率,因此涉及圖像預處理技術。
本文運用的圖像預處理相關算法有:圖像加權平均值灰度化、直方圖均衡化、圖像二值化、濾波處理及Canny邊緣檢測等。
經過一系列的銀行卡圖像處理后,我們已經清除了卡片背景干擾等雜質,得到的是僅有清晰的卡號的圖像。接著我們需要進行字符分割,本文采用Canny邊緣檢測和垂直投影分割技術,對圖像預處理后的銀行卡號字符串進行字符分割,將一串數字的銀行卡號分割成單個字符,為后續的字符識別提供0-9的清晰的單個字符圖像。
前面我們了解了數據集處理、圖像預處理以及字符分割的相關算法,這些也是銀行卡識別系統中不可或缺的部分。本節將涉及深度學習的部分,即如何進行神經網絡訓練以及單個字符的識別。本文基于TensorFlow的框架,采用改進之后的LeNet-5神經網絡對前面分割出的單個字符實現模型訓練,再采用OCR進行精確字符識別。
TensorFlow由兩個部分組成,分別是Tensor (張量)和Flow(流)。Tensor(張量)意味著N維數組,TensorFlow中所有數據均使用張量數據結構表示;Flow(流)意味著基于數據的計算和流動。TensorFlow是將復雜的數據結構傳送至人工智能神經網絡中進行分析和處理過程的系統。
卷積神經網絡訓練過程大致可以分為兩個步驟:第一步是數據從較的低層次向較高的層次傳播的過程,即前向傳播階段;第二步是當前向傳播所得的結果與預期結果相違背時,將誤差從較高的層次向較低的層次進行傳播訓練的過程,即反向傳播階段。
我們使用TensorFlow開發工具,采用改進之后的LeNet-5神經網絡,搭建此系統的實驗平臺,共收集樣本1084張的源數據集(各種數字、空格的組合),并且針對各種形式銀行卡逐一進行提取。其中我們成功識別了1032張銀行卡號,其余52張銀行卡由于背景紋理過于復雜,導致卡號提取不完全正確,對此我們會加以改進此系統,力求完美提取各種銀行卡號。
GUI是可視化的圖形用戶界面,是指采通過圖形的方式呈現的計算機操作用戶界面,即人機交互圖形化用戶操作界面設計。
PyQt是一個用于建立可視化界面的工具,是Python編程語言和Qt庫的完美結合。因為是基于Python這種腳本語言編程,所以語句更加容易理解,PyQt由Phil Thompson開發,實現了一個Python模塊集,并且擁有620多個類,將近6000個函數,是Python中一款功能強大的 GUI控件集。目前 PyQt官網提供了PyQt4 和PyQt5兩種版本,本文采用PyQt5進行GUI設計。
該銀行卡號識別系統可以實現可植入化,我們已經做出了一個可視化的界面,我們通過手機來展示該卡號識別系統的功能。
本GUI設計共分為兩大部分,分別是圖像獲取和識別結果,各按鈕功能如下:
拍照按鈕:通過拍照的方式獲取需要識別的銀行卡信息;
圖庫按鈕:從相冊中查找已存在的銀行卡片圖像并顯示;
銀行卡號:在空白處顯示識別出的銀行名稱以及銀行卡號;
相關信息:在空白處顯示客服電話以及對應銀行官方網站的網址。

圖5 顯示識別出的銀行卡號
本文主要介紹了基于深度學習的銀行卡號識別系統,分別從銀行卡號定位和銀行卡號識別兩方面進行了系統的分析,綜合運用了圖像處理中的:圖像灰度化處理、邊緣檢測、二值化等多種技術對銀行卡圖像進行分析和處理,充分利用銀行卡號位置和字符串長度等特征對銀行卡號進行提取。由于客觀條件和時間的限制,本文的研究還存在很多不足,有很多方面需要進一步提高。