成利敏,王 寧,甄景濤,段曉霞
(廊坊師范學院,河北 廊坊065000)
二代身份證作為證明我國公民身份的證件,身份證號碼包括持證者的出生年月、出生地等信息,是獨一無二的[1]。隨著大面積推廣使用實名制,很多行業(yè)都需要身份信息的驗證,錄入身份證號碼。傳統(tǒng)的通過身份證閱讀器比對或手工標記訓練人臉分類器的方式不能滿足更高的要求。
近年來,神經(jīng)網(wǎng)絡技術(shù)發(fā)展迅速,在圖像識別方面取得不錯的成績,尤其深度學習受到了研究者們的青睞,深度學習具有快速、準確率高等優(yōu)勢。卷 積 神 經(jīng) 網(wǎng) 絡[2](Convolutional Neural Networks,CNN)是深度學習的重要算法,CNN 通過卷積來模擬特征區(qū)分,并且通過卷積的權(quán)值共享及池化,來降低網(wǎng)絡參數(shù)的數(shù)量級,最后通過傳統(tǒng)神經(jīng)網(wǎng)絡完成分類等任務[3]。
本文利用CNN中的Keras框架來實現(xiàn)身份證號碼識別。
卷積神經(jīng)網(wǎng)絡是應用較為廣泛的一種神經(jīng)網(wǎng)絡,在圖像識別方面取得了令人滿意的效果。CNN是一個真正成功地采用多層次結(jié)構(gòu)網(wǎng)絡的深度學習方法,除了輸入輸出層外、一般還包括卷積層、激活函數(shù)、池化層、全連接層[2,4,5]。
(1)卷積層
卷積層是指卷積核與圖像做卷積操作,即卷積核滑動到圖像上所有位置,在每個位置上與圖像做模板卷積運算。每層卷積層可生成一組特征圖,其中第一層卷積層可能只能提取一些邊緣、線條等低階特征,而之后各卷積的網(wǎng)絡提取特征能力明顯高于第一層網(wǎng)絡,能夠提取第一層所不能提取的更復雜高階的特征[6]。
卷積層的計算式為:
式中為卷積核,表示卷積后第j個特征圖,blj為偏置參數(shù),Mj表示選擇輸入圖像的特征圖集合。
卷積核進行卷積計算[7]過程示例如圖1 所示。圖中Input Volume 是一個三維矩陣,采用兩個卷積核Filter W0 和Filter W1(每個卷積核都是3*3*3 的模板),卷積核與Input Volume矩陣分別進行模板卷積,偏置參數(shù)Bias b0=1 和Bias b1=0,得到輸出特征圖Output Volume(特征圖個數(shù)與卷積核個數(shù)對應)。Output Volume 中畫方框的-3 計算過程為(1-1-2+1)+(-2-2-2)+(2+1)+1=-3。
圖1 卷積核進行卷積計算過程示例
(2)激勵函數(shù)
由于樣本不一定是線性可分的,因此用激活函數(shù)來加入非線性因素,以克服線性模型的不足。在通常情況下,使用非線性卷積函數(shù)作為激活函數(shù),不同的非線性函數(shù)對網(wǎng)絡的參數(shù)有不同的影響[8]。在卷積神經(jīng)網(wǎng)絡中,常使用的激活函數(shù)有Sigmoid函數(shù)、ReLU函數(shù)、Tanh函數(shù)等。本文選擇了廣泛使用的ReLU 函數(shù)[9,10]。ReLU 函數(shù)是分段線性函數(shù),它的非線性很弱而且形式很簡單,且收斂速度遠快于Sigmoid,函數(shù)曲線如圖2所示。
圖2 ReLU函數(shù)
(3)池化層
池化層對提取到的特征進行采樣,使特征圖變小,降低網(wǎng)絡復雜度。池化層的運算一般有最大值池化、高斯池化、均值池化和可訓練池化。本文選擇最大值池化[10],如圖3 所示,采用一個2*2 的filter,stride=2,對4*4的原特征圖提取每個2*2區(qū)域中最大值作為主要特征,得到一個2*2的結(jié)果圖。
圖3 最大值池化
(4)全連接層
全連接層是經(jīng)過多個卷積、池化層后的一層。全連接層能夠?qū)η懊鎺讓拥臄?shù)據(jù)進行整合,用適合的函數(shù)提升自身性能。前一層的所有激活數(shù)據(jù)都是全連接層的輸入,全連接對輸入加權(quán)求和并通過激活函數(shù)得到相應輸出。
(5)輸出層
對所得信息用諸如邏輯回歸(soft max regression)的方法進行分類,需要注意選擇恰當?shù)膿p失函數(shù)。
Keras 是一個開放源碼的高級深度學習程序庫,它的設計參考了Torch,用Python 語言編寫,支持GPU 和CPU,是一個高度模塊化的神經(jīng)網(wǎng)絡庫。目前Keras 提供了Theano 與Tensor Flow 兩種后端引擎。
Keras 框架是用Python 語言編寫的高度模塊化的神經(jīng)網(wǎng)絡庫,支持GPU 和CPU。Keras 框架與Tensorflow 比較,Keras 提供了可以讓用戶更專注于模型設計并更快進行模型實驗的API,代碼易讀,搭建新的網(wǎng)絡結(jié)構(gòu)時能夠節(jié)約更多的時間[11]。
本文基于Keras 框架,以Tensor Flow 為后端,采用Python3.6進行程序設計,實現(xiàn)身份證號碼的識別與讀取。
為了更好地把身份證號碼區(qū)域分割出來,對待檢測身份證圖像進行了預處理[12]。調(diào)用CV2 模塊中cvtColor()、threshold()和dilate()函數(shù)實現(xiàn)灰度化、二值化、形態(tài)學處理。二值化處理中采用最大類間方差法(OSTU法)選擇最佳閾值。預處理效果如圖4 所示。根據(jù)形態(tài)學處理結(jié)果,找到身份證號碼所在區(qū)域,用矩形框標出,如圖5所示。
圖4 圖像預處理
圖5 標出身份證號碼區(qū)域
根據(jù)標出的矩形框,從二值化圖像中分割出身份證號碼區(qū)域,如圖6 所示。接著對身份證號碼區(qū)域圖像反轉(zhuǎn)、分割[12],得到單個的數(shù)字和字符,保存到文件夾num中,如圖7所示。字符分割過程中,首先調(diào)用findContours()查找輪廓,返回檢測出的每一個輪廓,循環(huán)取出每個輪廓;再調(diào)用contourArea()計算面積,篩選掉面積小于300 的輪廓;然后最小矩形四個點的坐標,并計算寬度和高度,最后去掉當前循環(huán)中篩選出的輪廓中較細和較扁的輪廓,選出合適的矩陣,進行字符分割。
圖6 身份證號碼區(qū)域分割
圖7 分割出的數(shù)字和字符
本文采用Keras 框架的Sequential 順序模型搭建17 層卷積神經(jīng)網(wǎng)絡[11],網(wǎng)絡結(jié)構(gòu)模型如圖8 所示。其中第1 和第2 個卷積層的卷積核個數(shù)都是64,第3和第4個卷積層的卷積核個數(shù)都是32,這四個卷積模板大小都是3*3;激勵層選擇ReLU 函數(shù);池化層選擇2*2 的最大池化方法;結(jié)構(gòu)中使用兩次Dropout 層,防止過擬合;最后進入11 分類的Softmax Classifier。
圖8 搭建的神經(jīng)網(wǎng)絡結(jié)構(gòu)模型
訓練前,對數(shù)據(jù)集進行處理,數(shù)據(jù)集的標簽以數(shù)字0-10 命名,其中10 代表字符X。先加載數(shù)據(jù)集,調(diào)用train_test_split()函數(shù)按照交叉驗證的原則劃分數(shù)據(jù)集,其中驗證集和測試集比例分別為0.3和0.5,再對類別標簽進行one-hot編碼,對圖像的像素值進行歸一化處理。
完成CNN網(wǎng)絡搭建后,進行樣本訓練。本文采用SGD+momentum 的優(yōu)化器進行訓練,設置batch_size=32,nb_epoch = 13,訓練中選用categorical_crossentropy 作為損失函數(shù)。對訓練集中的140個樣本訓練13次,訓練過程中準確度和損失函數(shù)的數(shù)據(jù)如表1 所示。隨著訓練次數(shù)的增加,損失函數(shù)由2.3747降到0.1247,訓練準確率由18.33%升高到98.33%,整體來看訓練準確率為99%。經(jīng)多次驗證,訓練準確率均在90%以上,所需時間短,訓練效果較好。
表1 訓練過程中準確度和損失函數(shù)
運行識別程序,先讀取保存在文件夾num 中分割好的字符;再調(diào)用訓練學習好的神經(jīng)網(wǎng)絡,對分割好的字符依次識別,識別過程中與數(shù)據(jù)庫中11類標簽的字符進行比對,返回結(jié)果result 是待識別字符屬于每個標簽的概率,選概率大的標簽作為字符識別值;最終顯示識別出的身份證號碼。
返回結(jié)果result 值及識別出的身份證號碼如圖9 所示。經(jīng)比較,與待檢測身份證原圖像中的身份證號碼一致,識別準確率較高。
圖9 部分result值及識別出的身份證號碼
本文在Keras框架上搭建了17層的卷積神經(jīng)網(wǎng)絡,利用該網(wǎng)絡對身份證圖像進行身份證號碼識別,操作簡單直觀,訓練和識別速度較快。對現(xiàn)有的120 張身份證圖像進行訓練識別,識別準確率為95.8%,錯誤識別的主要是數(shù)字4和8。為了進一步提高識別準確率,需要繼續(xù)改進網(wǎng)絡結(jié)構(gòu)和參數(shù),調(diào)整數(shù)據(jù)庫??傮w來說,基于Keras 框架的身份證號碼識別算法具有一定的應用價值。