原標題:證件全文本OCR技術,瞭解一下

1、什麼是OCR

光學字符識別(英語:Optical Character Recognition, OCR),是指對文本資料的圖像文件進行分析識別處理,獲取文字及版面信息的過程。

一般的識別過程包括:

圖像輸入:對於不同的圖像格式,有着不同的存儲格式,不同的壓縮方式,目前有OpenCV、CxImage等開源項目。

預處理:主要包括二值化,噪聲去除,傾斜校正等。

二值化:攝像頭拍攝的圖片,大多數是彩色圖像,彩色圖像所含信息量巨大,對於圖片的內容,我們可以簡單的分爲前景與背景,爲了讓計算機更快的、更好地識別文字,我們需要先對彩色圖進行處理,使圖片只剩下前景信息與背景信息,可以簡單的定義前景信息爲黑色,背景信息爲白色,這就是二值化圖。

噪聲去除:對於不同的文檔,我們對噪聲的定義可以不同,根據噪聲的特徵進行去噪,就叫做噪聲去除。

傾斜校正:由於一般用戶,在拍照文檔時,都比較隨意,因此拍照出來的圖片不可避免的產生傾斜,這就需要文字識別軟件進行校正。

版面分析:將文檔圖片分段落,分行的過程就叫做版面分析。由於實際文檔的多樣性和複雜性,目前還沒有一個固定的,最優的切割模型。

字符切割:由於拍照條件的限制,經常造成字符粘連,斷筆,因此極大限制了識別系統的性能。

字符識別:這一研究已經是很早的事情了,比較早有模板匹配,後來以特徵提取爲主,由於文字的位移,筆畫的粗細,斷筆,粘連,旋轉等因素的影響,極大影響特徵的提取的難度。

版面還原:人們希望識別後的文字,仍然像原文檔圖片那樣排列着,段落不變,位置不變,順序不變地輸出到Word文檔、PDF文檔等,這一過程就叫做版面還原。

後處理、校對:根據特定的語言上下文的關係,對識別結果進行校正,就是後處理。

目前的主流實現是CNN+RNN+CTC和CNN+RNN 基於 Attention的方法。

2、攜程證件OCR項目

2.1 項目目標

根據攜程的實際使用場景,使用OCR技術識別身份證、護照、火車票、簽證等證件的中文英文及數字文本信息。

2.2 主要進展及展望

2016年,實現客戶端身份證、護照英文數字的識別。

2017年,實現Offline場景身份證、護照、火車票等中文識別。

2018年,實現APP實時識別身份證、護照、火車票、駕駛證、行駛證、簽證等中英文文本。

2.3 大概的精度情況

2.3.1.數字英文

誤識率<0.5%【線上數據統計】

拒識率~5%

干擾因素包括:曝光、傾斜、遠照

2.3.2.中文

1:N有引導(指引導用戶將證件放於相機框中)

FAR= 1%【線上數據統計】

拒識率~20%

1:N+1 無引導

FAR= 3%【線上數據統計】

拒識率~30%

  • 曝光、圖像質量低計入FAR遮擋計入拒識考慮外籍證件考慮少數民族

3、關鍵知識

3.1 計算機視覺

3.1.1 什麼是計算機視覺

解讀w*h*3個0~255之間的數字中蘊含的、人類可理解的內容。

3.1.2 人類視覺的啓示

感受野:這個位置裏適當的刺激能夠引起該神經元反應的區域。

層級感受野:一個神經細胞看的更遠(視野更大)、能處理更負責的任務。

神經網絡從輸入到輸出,中間有多個隱藏的層。

3.1.3 HSV和灰度圖

HSV是一種將RGB色彩模型中的點在圓柱座標系中的表示法。這兩種表示法試圖做到比RGB基於笛卡爾座標系的幾何結構更加直觀。

  • 色相(H)是色彩的基本屬性,就是平常所說的顏色名稱,如紅色、黃色等。飽和度(S)是指色彩的純度,越高色彩越純,低則逐漸變灰,取0-100%的數值。明度(V),亮度(L),取0-100%。

HSV模型通常用於計算機圖形應用中。在用戶必須選擇一個顏色應用於特定圖形元素各種應用環境中,經常使用HSV 色輪。在其中,色相表示爲圓環;可以使用一個獨立的三角形來表示飽和度和明度。典型的,這個三角形的垂直軸指示飽和度,而水平軸表示明度。在這種方式下,選擇顏色可以首先在圓環中選擇色相,在從三角形中選擇想要的飽和度和明度。

圖像的灰度化:在計算機領域中,灰度(Grayscale)數字圖像是每個像素只有一個採樣顏色的圖像。這類圖像通常顯示爲從最暗黑色到最亮的白色的灰度,儘管理論上這個採樣可以是任何顏色的不同深淺,甚至可以是不同亮度上的不同顏色。

灰度圖像與黑白圖像不同,在計算機圖像領域中黑白圖像只有黑白兩種顏色,灰度圖像在黑色與白色之間還有許多級的顏色深度。但是,在數字圖像領域之外,“黑白圖像”也表示“灰度圖像”,例如灰度的照片通常叫做“黑白照片”。在一些關於數字圖像的文章中單色圖像等同於灰度圖像,在另外一些文章中又等同於黑白圖像。

3.2 基於卷積神經網絡的深度學習模型

3.3 二值化和池化

二值化(英語:Thresholding)是圖像分割的一種最簡單的方法。二值化可以把灰度圖像轉換成二值圖像。把大於某個臨界灰度值的像素灰度設爲灰度極大值,把小於這個值的像素灰度設爲灰度極小值,從而實現二值化。

根據閾值選取的不同,二值化的算法分爲固定閾值和自適應閾值。比較常用的二值化方法則有:雙峯法、P參數法、迭代法和OTSU法等。

4、證件OCR的架構及實現

4.1 架構圖

4.2 應用場景

4.3 拒識檢測

以下圖爲例,當用戶將我們待識別區域(即姓名位置)遮擋時,我們會執行拒識處理。

同理如下圖,待識別區域發生明顯曝光時,我們也會加入拒識處理。

拒識處理使用直方圖均衡等技術。

直方圖均衡化是圖像處理領域中利用圖像直方圖對對比度進行調整的方法。

這種方法通常用來增加許多圖像的全局對比度,尤其是當圖像的有用數據的對比度相當接近的時候。通過這種方法,亮度可以更好地在直方圖上分佈。這樣就可以用於增強局部的對比度而不影響整體的對比度,直方圖均衡化通過有效地擴展常用的亮度來實現這種功能。

這種方法對於背景和前景都太亮或者太暗的圖像非常有用,尤其是可以帶來X光圖像中更好的骨骼結構顯示以及曝光過度或者曝光不足照片中更好的細節。

一個主要優勢是它是個相當直觀的技術並且是可逆操作,如果已知均衡化函數,那麼就可以恢復原始的直方圖,並且計算量也不大。一個缺點是它對處理的數據不加選擇,它可能會增加背景噪聲的對比度並且降低有用信號的對比度。

拒識處理在客戶端或頁面前端完成,沒有前端的場景則在後端完成。拒識處理還使用二分搜索算法通過大量樣本判斷目標圖片是否拒識。

defbinary_search(arr,start,end,hkey):
ifstart > end:
return-1
mid= start + (end - start) / 2
ifarr[mid] > hkey:
returnbinary_search(arr, start, mid - 1, hkey)
ifarr[mid] < hkey:
returnbinary_search(arr, mid + 1, end, hkey)
returnmid

線上版本拒識的精度在98%-99%之間,拒錯率在20%以下。

4.4 文本檢測

文本檢測分爲有引導和無引導兩類,有引導的文本檢測,我們使用先驗知識(比如人臉,證件邊緣等)和大量樣本深度學習目標函數定位待識別區域。

而無引導的情況,則完全使用基於Attention的整行識別技術做範文本處理。

人臉識別部分,借鑑了山世光老師的開源項目seetaface/SeetaFaceEngine,並針對我們證件場景做了一些定製開發。

4.5 文本識別

文本識別部分我們使用灰度投影在切割無關信息(比如少數民族的拼音、外籍護照的發音註釋等)、二值化歸一化/下采樣池化等技術做比較識別。並且引入了HOG、LBP、Haar等特徵的權重機制。

int* v = NULL;//垂直投影
int* h = NULL;//水平投影
CvScalar s,t;//投影時矩陣的元素
IplImage* pBinaryImg = NULL;//二值化後圖像
IplImage* pVerticImg = NULL;//垂直投影圖像
IplImage* pHorizImg = NULL;//水平投影圖像
int x,y;//圖像像素座標
v=new int[pBinaryImg->width];
h=new int[pBinaryImg->height];
for(i=0;i<pBinaryImg->width;i++)
v[i]=0;
for(i=0;i<pBinaryImg->height;i++)
h[i]=0;
for( x=0;x<pBinaryImg->width;x++)
{
for(y=0;y<pBinaryImg->height;y++)
{
s=cvGet2D(pBinaryImg,y,x); //t=cvGet2D(paint,y,x);
if(s.val[0]==0)
v[x]++; //cvSet2D(paint,y,x,t);
}
}
for( y=0;y<pBinaryImg->height;y++)
{
for( x=0;x<pBinaryImg->width;x++)
{
s=cvGet2D(pBinaryImg,y,x); //t=cvGet2D(paint,y,x);
if(s.val[0]==0)
h[y]++;
}
}
pVerticImg = cvCreateImage( cvGetSize(pBinaryImg),8,1 );
pHorizImg = cvCreateImage( cvGetSize(pBinaryImg),8, 1);
cvZero(pVerticImg);
cvZero(pHorizImg);
for(x=0;x<pBinaryImg->width;x++)
{
for(y=0;y<v[x];y++)
{
t=cvGet2D(pVerticImg,y,x); //s=cvGet2D(paint,y,x); //t=cvGet2D(paint,y,x);
t.val[0]=255;
cvSet2D(pVerticImg,y,x,t);
}
}
for(y=0;y<pBinaryImg->height;y++)
{
for(x=0;x<h[y];x++)
{
t=cvGet2D(pHorizImg,y,x); //s=cvGet2D(paint,y,x); //t=cvGet2D(paint,y,x);
t.val[0]=255;
cvSet2D(pHorizImg,y,x,t);
}
}

4.5.1 HOG特徵

方向梯度直方圖(Histogram of Oriented Gradient, HOG)特徵是一種在計算機視覺和圖像處理中用來進行物體檢測的特徵描述子。它通過計算和統計圖像局部區域的梯度方向直方圖來構成特徵。Hog特徵結合 SVM分類器已經被廣泛應用於圖像識別中,尤其在行人檢測中獲得了極大的成功。需要提醒的是,HOG+SVM進行行人檢測的方法是法國研究人員Dalal 在2005的CVPR上提出的,而如今雖然有很多行人檢測算法不斷提出,但基本都是以HOG+SVM的思路爲主。

4.5.2 LBP特徵

LBP(Local Binary Pattern,局部二值模式)是一種用來描述圖像局部紋理特徵的算子;具有旋轉不變性和灰度不變性等顯著的優點。它是首先由T. Ojala, M.Pietikäinen, 和D. Harwood 在1994年提出,用於紋理特徵提取。而且,提取的特徵是圖像的局部的紋理特徵。

4.5.3 Haar特徵

Haar-like特徵最早是由Papageorgiou等應用於人臉表示,Viola和Jones在此基礎上,使用3種類型4種形式的特徵。

Haar特徵分爲三類:邊緣特徵、線性特徵、中心特徵和對角線特徵,組合成特徵模板。特徵模板內有白色和黑色兩種矩形,並定義該模板的特徵值爲白色矩形像素和減去黑色矩形像素和。Haar特徵值反映了圖像的灰度變化情況。例如:臉部的一些特徵能由矩形特徵簡單的描述,如:眼睛要比臉頰顏色要深,鼻樑兩側比鼻樑顏色要深,嘴巴比周圍顏色要深等。但矩形特徵只對一些簡單的圖形結構,如邊緣、線段較敏感,所以只能描述特定走向(水平、垂直、對角)的結構。

4.6 一些後處理的思路

在識別主體邏輯外,我們根據實際場景加入了一些後處理邏輯。

比如身份證號驗證、護照號驗證、漢字權重驗證、中文姓氏庫驗證、中文發音驗證等。

5. 參考資料

1)https://zh.wikipedia.org/wiki/(2018)

2)Learning2See_VAI_Progrss&Trends - 山世光

3)Gradient-Based Learning Applied toDocument Recognition in Proceedings of the IEEE, 1998

4)ImageNetClassification with Deep Convolutional Neural Networks

5)Noteson Convolutional Neural Networks

6)Practical Recommendations for Gradient-BasedTraining of Deep Architectures

7)Stochastic Pooling for Regularization of DeepConvolutional Neural Networks

8)Maxout Networks

【注】文中所列代碼並非項目實際代碼,都爲說明算法需要的開源代碼。

相關文章