趙龍,李飛,王偉峰
(安徽科大國創(chuàng)云網(wǎng)科技有限公司,合肥230088)
隨著互聯(lián)網(wǎng)以及智能手機(jī)的飛速發(fā)展,無論是企業(yè)還是個(gè)人對文字識別的要求越來越多、越來越高。本文主要講述文字識別技術(shù)在身份證識別方面的應(yīng)用。身份證文字識別在更行各業(yè)有著廣泛的應(yīng)用:對于各類App,特別是通信和金融服務(wù)類的App基本都需要實(shí)名認(rèn)證才能進(jìn)行交易的以實(shí)現(xiàn)更過通過無紙化辦理業(yè)務(wù)的企業(yè)信息化,實(shí)名認(rèn)證有的是通過人臉認(rèn)證,也有很多是通過身份證識別來實(shí)名認(rèn)證。同時(shí),現(xiàn)在越來越多的車站、海關(guān)、酒店、公安部門等也需要對身份證信息進(jìn)行采集和登記來實(shí)名認(rèn)證。通過OCR(Optical Character Recognition)識別技術(shù),可以極大地提高實(shí)名認(rèn)證的效率,使得用戶有更好的體驗(yàn)。
身份證OCR文字識別主要是對身份證上的姓名、性別、地址、身份證號碼和有效期等信息進(jìn)行識別,將識別的結(jié)果轉(zhuǎn)成文本的格式。首先,就文字檢測方法而言,總體分為基于圖像分割的方法和基于回歸的方法?;诨貧w的方法主要是Faster R-CNN、SSD模型等。這種基于回歸方法的文本檢測方法不但性能不好、訓(xùn)練過程較長,而且對于拍攝效果不佳的歪曲形狀的文本不能很好地處理。PSENet屬于基于圖像分割的方法,其能夠檢測任意形狀的文字。尤其對于身份證這種文字位置歪曲的文本,PSENet能夠達(dá)到很好的效果。
本文采用PSENet文字檢測算法,結(jié)合文字識別技術(shù)CRNN進(jìn)行身份證圖片文字識別。本文首先對從CRM系統(tǒng)中提取的身份證圖片進(jìn)行旋轉(zhuǎn)、去水印等預(yù)處理,去除輸入圖片的噪音干擾,然后將處理后的結(jié)果傳入PSENet中進(jìn)行文字檢測,接著用CRNN進(jìn)行文字識別,最后對識別的結(jié)果進(jìn)行后處理,最終得到身份證文字識別的結(jié)果。

圖1
(1)身份證圖像旋轉(zhuǎn)
由于身份證圖片傾斜會(huì)影響檢測的效果,所以首先要對身份證圖片進(jìn)行旋轉(zhuǎn)矯正其至水平角度,經(jīng)過水平矯正后的身份證圖片識別效果更好。本文是利用人臉識別庫dlib庫[13]進(jìn)行矯正:首先是找到身份證圖片上的人臉,然后找到人的眼睛的特征點(diǎn),由于兩只眼睛在一條水平線上的身份證圖片一定是水平的,所以只需要計(jì)算兩只眼睛的傾斜的角度,然后根據(jù)眼睛傾斜的角度來確定旋轉(zhuǎn)的角度。
(2)身份證圖片水印去除
在身份證圖片的主對角線上打了“僅供****使用”的字樣,這八個(gè)字符遮擋了身份證中的部分信息,對后續(xù)模型識別造成干擾,所以本文首先對原始身份證圖片進(jìn)行去水印操作。本文采用SIFT(尺度不變特征檢測器)算法[14]和FLANN算法[15-16]對身份證圖片進(jìn)行去水印。SIFT算法具有良好的光照穩(wěn)定性,同時(shí),其還具有視角、旋轉(zhuǎn)、尺度、仿射的特性。首先要構(gòu)造要去除的水印的模板,然后通過CV2.SIFT()方法得到身份證圖片的特征信息點(diǎn)和水印模板的特征信息點(diǎn),根據(jù)里面特征信息點(diǎn)找出身份證和身份證模板的位置。最后,根據(jù)其位置可將水印去除。
對于身份證文字檢測,本實(shí)驗(yàn)采用文字檢測算法PSENet[1]進(jìn)行檢測。PSENet是在2018年Shape Robust Text Detection with Progressive Scale Expansion Network中提出的一種圖片文字檢測算法,PSENet在各項(xiàng)文字識別比賽中都得了不錯(cuò)的成績,其主要是用來解決其他文字檢測算法存在的文字檢測不準(zhǔn)確、文字檢測遺漏、文字間距離較近無法分開識別、彎曲類本文無法識別和文字距離較近識別錯(cuò)誤的問題。PSENet是一種漸進(jìn)式網(wǎng)絡(luò),其能有效對不同“稠密”程度的問題進(jìn)行準(zhǔn)確分割,把每一塊文本分成不同大小的區(qū)域,然后對這些小的區(qū)域進(jìn)行檢測,這種漸進(jìn)式的網(wǎng)絡(luò)能有效地解決這種問題,而且這種基于網(wǎng)絡(luò)分割的算法對于任意角度拍攝的身份證圖片都能準(zhǔn)確定位,同時(shí),對于相鄰文本實(shí)例也能較好的識別。
PSENet文字檢測的流程分為特征提取、特征融合、像素分類和文字后處理得到檢測結(jié)果,如下圖(圖片來源于PSENet)詳細(xì)實(shí)現(xiàn)流程如圖2。

圖2 PSENet實(shí)現(xiàn)流程
(1)首先,用ResNet提取4層特征P2,P3,P4,P5進(jìn)行提取,得到4層特征圖;
(2)將得到的特征圖進(jìn)行融合,得到特征圖F,通過下面方式進(jìn)行融合:

融合公式中,“||”是concatenation連接操作,分別采用2倍、4倍、8倍的方式進(jìn)行上采樣;
(3)將上一步得到的特征圖作為3×3的卷積的輸入,得到256個(gè)通道數(shù)的特征圖,再以此特征圖為1×1的卷積層中,得到Sn,Sn-1,…,S1,總共n個(gè)圖像分割的輸出結(jié)果;
(4)通過PSENet后處理算法得到文字檢測的結(jié)果。
本文采用liuheng92在GitHub上開源的tensor?flow_PSENet項(xiàng)目[3],該項(xiàng)目基于PSENet算法[1]進(jìn)行訓(xùn)練,并且采用PSENet提供的參數(shù)作為訓(xùn)練參數(shù),訓(xùn)練數(shù)據(jù)采用ICDAR 2015數(shù)據(jù)集[7]和ICDAR 2017數(shù)據(jù)集[7]。
如圖3-圖6是PSENet對身份證圖片檢測的結(jié)果(身份證圖片已進(jìn)行過打碼脫敏處理),PSENet對于身份證要素信息基本都能檢測到,第一張圖片里面的姓名、性別、民族、住址、出生、公民身份證號碼都得到準(zhǔn)確的檢測。
本文首先嘗試通過Tesseract[2,9]進(jìn)行文字識別,由于Tesseract是基于模板的文字識別算法,其對于身份證文字識別錯(cuò)誤率較高,特別是對于身份證號碼這類的數(shù)字識別效果不甚理想。CRNN[4]不僅能夠解決身份證地址不定長識別問題,還能結(jié)合CNN和RNN分別進(jìn)行特征提取和字符序列的推理任務(wù)。對于其他算法而言,CRNN有著明顯的優(yōu)點(diǎn):CNN在輸入網(wǎng)絡(luò)之前需要進(jìn)行序列PADDLE,而CRNN不需要,它能夠?qū)Σ煌L度的待識別序列進(jìn)行識別。同時(shí),由于CRNN參數(shù)不多,所以通過CRNN訓(xùn)練來的模型體積很小,這樣,訓(xùn)練好的模型部署在普通的CPU機(jī)器上即可得到很高的性能效果:模型對于身份證的識別效率得到很大的提高。CRNN在很多場景中的識別都得到了不錯(cuò)的效果,所以本文采用CRNN對PSENet檢測到的文字進(jìn)行識別。

圖3

圖4

圖5

圖6
CRNN算法是華中科技大學(xué)白翔老師在2015年在An End-to-End Trainable Neural Network for Imagebased Sequence Recognition and Its Application to Scene Text Recognition[6]提出的一種基于CNN、CTC、BiLSTM方法組合在一起的文字識別算法,其對于特定場景的文字識別效果較好。本文以身份證圖片文字識別為場景,通過CRNN訓(xùn)練識別模型對身份證上的姓名、性別、民族、出生日期、住址和身份證號碼要素進(jìn)行識別。
為了驗(yàn)證CRNN的效果,本文結(jié)合使用YOLOv3+CRNN[11]、CTPN+CRNN[12]、CTPN+DenseNet+CTC[12]組 合方法進(jìn)行對比。
CRNN識別身份證圖片文字分為以下3步:檢測文字特征提取、序列預(yù)測識別、輸出結(jié)果矯正處理。
(1)特征提取
為了加快訓(xùn)練過程中模型網(wǎng)絡(luò)的收斂性,首先,將圖片統(tǒng)一歸一化到[230,50]大小。通過CNN網(wǎng)絡(luò)進(jìn)行特征提取。圖片歸一化代碼如下:
import numpy as np
image =(image- np.min(image))/(np.max(image)- np.min(image))
(2)序列預(yù)測識別
由于身份證地址是不定長的序列,CRNN利用雙向LSTM很好地解決了這個(gè)問題。
(3)輸出結(jié)果矯正處理
對于識別的結(jié)果,通過一定的規(guī)則整合成結(jié)構(gòu)化的形式。對于身份證中文信息(人名、性別、地址、民族)中具有同樣讀音但識別錯(cuò)誤的問題,通過以下方式進(jìn)行處理:
①首先通過構(gòu)造正確文字(百家姓、中國各個(gè)省份地址等)和常見錯(cuò)誤文字的字典映射,然后結(jié)合Python的pypinyin工具包[8]組成三元組對返回的結(jié)果進(jìn)行更正,如圖7中的“男”字被識別成“果”字,圖8中的出生日期“1988年12越3日”被識別成“1988年12月38日”,這種日期的異??赏ㄟ^設(shè)定的規(guī)則進(jìn)行排查,圖9識別完全正確(由于身份證信息涉及到個(gè)人隱私,所以各個(gè)圖中的身份證是偽身份證號碼,不作為實(shí)際實(shí)驗(yàn)中的真實(shí)數(shù)據(jù))。
②對于身份證是否識別正確,通過身份證號碼各個(gè)部分和省份、各個(gè)市縣的對應(yīng)關(guān)系的組成的詞典進(jìn)行判斷糾正。
③對于識別出來的文字中存在歧義的問題的文字,本實(shí)驗(yàn)通過Word2Vec基于5000張身份證圖片的標(biāo)注結(jié)果訓(xùn)練的詞向量,通過這個(gè)詞向量來發(fā)現(xiàn)歧義字符或者單詞的近似替代。
(4)生成識別結(jié)果
如圖7-圖10是生成的結(jié)果。

圖7

圖8

圖9
本實(shí)驗(yàn)從CRM系統(tǒng)中抽取了5000張身份證圖片對模型進(jìn)行驗(yàn)證,計(jì)算出準(zhǔn)確率、召回率和F值。為了驗(yàn)證檢測方法的優(yōu)越性,以YOLOv3+CRNN、CPTN+Tesseract、Tesseract單獨(dú)檢測組合作為對比組,實(shí)驗(yàn)結(jié)果表明,PSENet和CRNN的組合對文字識別的效果更佳:PSENET+CRNN對文字識別的算法在準(zhǔn)確率、召回率、F值方面相對于其他的算法及組合都更勝一籌。

表1
本文主要以身份證要素識別為場景,用PSENet和CRNN結(jié)合的方式進(jìn)行文字識別。在識別之前對身份證圖片通過SIFT和FLANN算法進(jìn)行去水印、通過dlib人臉庫對身份證圖片角度進(jìn)行矯正等數(shù)據(jù)預(yù)處理操作。對于本文實(shí)驗(yàn)后續(xù)的優(yōu)化方向,主要從以下幾個(gè)方面進(jìn)行優(yōu)化。
(1)在CRNN的后續(xù)識別過程中加入attention機(jī)制,即網(wǎng)絡(luò)中通過GRU+CNN的方式,對GRU的輸出做Attention;
(2)增加對身份證圖像的預(yù)處理步驟,如身份證圖片腐蝕、灰度二值化、膨脹等預(yù)處理,優(yōu)化訓(xùn)練和測試圖片。