張寧靜,袁書培,吳海龍
(南華大學計算機學院,衡陽 421000)
關(guān)于光學字符識別(optical character recogni?tion,OCR),是指將圖像上的文字轉(zhuǎn)化為計算機可編輯的文字內(nèi)容。近年來,OCR檢測與識別因其在諸多領(lǐng)域存在著較大的實際引用,使其逐漸成為計算機視覺領(lǐng)域的重要任務(wù)。尤其是在金融領(lǐng)域的應(yīng)用則更加廣泛,對于上市公司發(fā)布的公告、財報、研報等不可編輯的PDF金融文檔,需要做結(jié)構(gòu)化處理并抽取還原,提取關(guān)鍵信息供需要的用戶參考。OCR檢測識別技術(shù)主要有兩個核心子任務(wù)——OCR文字檢測和OCR文字識別。
在深度學習技術(shù)得到發(fā)展并大力推廣之前,傳統(tǒng)的文字檢測方法通常主要依賴于從輸入圖像中提取手工設(shè)計的特征向量。連接組件分析標簽[1-2]和滑動窗口[3]等方法被廣泛用于該任務(wù)。目前,隨著深度學習技術(shù)的發(fā)展,OCR檢測識別技術(shù)都得到了顯著的改善。不同于傳統(tǒng)的OCR檢測技術(shù)框架[4],現(xiàn)有的OCR檢測模型主要有基于分割的檢測模型和基于回歸的檢測模型的兩大類模型。依賴于深度學習的OCR文字檢測一般用到的模 型 算 法 主 要 有CTPN[5]、RRD[6]、DB[7]、EAST[8]、SegLink[9]、PixelLink[10],等。
傳統(tǒng)的OCR識別過程主要分為兩步:單字切割和分類。而目前基于深度學習的文字識別主要是端到端的文字識別,即不需要顯式進行文字切割,而是將直接文字識別轉(zhuǎn)化為序列學習問題?,F(xiàn)今基于深度學習的端到端OCR技術(shù)有兩大主流技術(shù):CRNN OCR[11]和Attention OCR[12]。其主要區(qū)別在于翻譯層的不同。這兩大主流技術(shù)在其特征學習階段都采用了CNN+RNN的網(wǎng)絡(luò)結(jié)構(gòu),CRNN OCR在對齊時采取的方式是CTC算法,而Attention OCR采取的方式則是Attention機制。
本文以百度PaddlePaddle平臺(以下簡稱飛槳)為對比對象,在飛槳提供的兩款場景文字識別服務(wù)(Attention、CRNN-CTC)中均未包含有金融債券文本識別的情景分類,同時使用通用場景識別的模型經(jīng)過我們實驗,其結(jié)果也不讓人滿意。
本文的工作主要有重新搭配算法與模型并訓練出適用于金融債券文本信息場景的模型,使其可以針對金融債券文本信息提供精準的結(jié)構(gòu)化識別;考慮債券的非定性特征,如多印章、數(shù)字密集、標點符號的精準識別,以及環(huán)境因素,比如非掃描條件、有折痕、有污點等情況下系統(tǒng)的容錯性及適配性。
我們通過對于金融文檔、金融圖表的相關(guān)調(diào)研,經(jīng)過對數(shù)據(jù)集的對比分析與篩選,我們將中文版的金融債券圖表數(shù)據(jù)集的數(shù)據(jù)源確定為了中國債券信息網(wǎng)。
針對檢測問題,從金融債券的實際業(yè)務(wù)場景出發(fā),我們收集了四大種類的債券集(三線、無線、有框、長文本),同時從網(wǎng)上以及手工處理收集了1000余張圖片。將其按照類別進行劃分并進行手工標注,以此來擴充數(shù)據(jù)集。用以解決神經(jīng)網(wǎng)絡(luò)擬合是數(shù)據(jù)過少,預(yù)測精度不高的問題。
圖1 文本檢測數(shù)據(jù)擴容
而增對文本識別問題,我們首先使用了YCG09的chinese_ocr數(shù)據(jù)集,數(shù)據(jù)集包括100萬的數(shù)據(jù)集,含漢字、英文字母、數(shù)字和標點共5990個字符,同時我們又手工擴充了2萬張的數(shù)字標注,以期其在數(shù)字分隔符號上取得更好的效果,使用paddle提供的字典ppocr_keys_v1,共計6623個字符。
圖2 文本識別數(shù)據(jù)擴容
通過對業(yè)務(wù)場景和數(shù)據(jù)進行分析研究還發(fā)現(xiàn),在債券文本多印章的場景下,被印章覆蓋住的數(shù)據(jù)難以準確地識別出來,并且多印章出現(xiàn)的概率也不小。這可能會導致檢測模型在實際業(yè)務(wù)場景下效果不佳,所以我們以手工合成以及網(wǎng)絡(luò)搜索的方式增加了一些印章密集的情況,來對數(shù)據(jù)集進行增強,這可以很好地提高模型對被覆蓋文本的的檢測效果。
圖3 數(shù)據(jù)增強-多印章示例
除了使用以上的方式,針對識別模型,我們還使用了PaddleOCR提供的數(shù)據(jù)增強方式,還使用了顏色空間轉(zhuǎn)換(cvtColor)、模糊(blur)、抖動(jitter)、噪聲(gasuss noise)、隨機切割(random crop)、透視(perspective)、顏色反轉(zhuǎn)(reverse)等數(shù)據(jù)增強手段。在訓練過程中每種擾動方式以50%的概率被選擇。
整體債券圖表數(shù)據(jù)集我們將其分為4部分,其中第一數(shù)據(jù)集為預(yù)訓練練數(shù)據(jù)集(約占10%,100張),用于同時初步訓練多個算法模型,然后對比選擇出最適合的算法模型;第二數(shù)據(jù)集為模型優(yōu)化訓練數(shù)據(jù)集(約占60%,600張),用于進行集中訓練并優(yōu)化模型,最后的成果模型;第三數(shù)據(jù)集為定量測試數(shù)據(jù)集(約占25%,250張),用于對模型進行定量測試,檢測模型的訓練效果;第四數(shù)據(jù)集(約占5%,50張),則用于進行定性多場景測試實驗。測試模型在不同條件下的極端情況。各部分數(shù)據(jù)集我們又根據(jù)債券圖標的類型對其進行了二次劃分,其中包括有框表、三線表、無框表(分別占比4∶3∶3)
除了以上的債券圖表數(shù)據(jù)集,為了訓練識別模型,我們又引入了100000種文字數(shù)據(jù)集用于模型對于文字的識別訓練以保證5000種文字的訓練效果。
對于訓練集,我們在進行分類后又借助PPOCRLabel進行了半自動人工標注[13]。
圖4 PPOCRLabel界面
考慮到我們的系統(tǒng)檢測識別目標是中文債券圖標,是針對以簡體中文、數(shù)字為主,及少量英文的文字進行檢測識別,且部署在移動端。經(jīng)過分析,我們初步選取了DB,EAST網(wǎng)絡(luò)框架作為預(yù)訓練的OCR檢測模型框架和CRNN+CTC模型框架作為預(yù)訓練的OCR識別模型框架。借助模型預(yù)篩選數(shù)據(jù)集,我們分別就檢測和識別中同類型的模型進行統(tǒng)一的預(yù)訓練,結(jié)果表1—表2所示。
表1 OCR檢測模型
表2 OCR識別模型
通過對篩選出了性能較優(yōu)的模型DB_mv3及CRNN_mv3分別作為檢測和識別模型算法,隨后對他們進行了完整及系統(tǒng)的優(yōu)化。
本文的債券圖表檢測模型主要以DBNet模型為大體框架,本系統(tǒng)以基于輕量級主干網(wǎng)絡(luò)Mo?bileNetV3 Large[14]作為backbone,同時添加目標檢測中常用的特征增強方案FPN[15]結(jié)構(gòu)作為neck,類似于U-Net結(jié)構(gòu),最后添加了三層卷積作為head。
圖5 DBNet模型結(jié)構(gòu)
2.2.1 使用MobileNetV3 Large作為FPN網(wǎng)絡(luò)體系中的卷積神經(jīng)網(wǎng)絡(luò)
我們在backbone部分主要搭建MobileNetV3 Large主體結(jié)構(gòu)代碼,其中需要注意的是,因為后邊需要采用FPN結(jié)構(gòu),所以相比于原始的網(wǎng)絡(luò)結(jié)構(gòu),這里搭建過程中獲得了四個分支的輸出,用于后續(xù)FPN結(jié)構(gòu)。
if model_name=="large":
cfg=[
#k,exp,c,se,nl,s,
[3,16,16,False,′relu′,1],
[3,64,24,False,′relu′,2],
[3,72,24,False,′relu′,1],
#獲得這一層的輸出:c2
[5,72,40,True,′relu′,2],
[5,120,40,True,′relu′,1],
[5,120,40,True,′relu′,1],
#獲得這一層的輸出:c3
[3,240,80,False,′hardswish′,2],
[3,200,80,False,′hardswish′,1],
[3,184,80,False,′hardswish′,1],
[3,184,80,False,′hardswish′,1],
[3,480,112,True,′hardswish′,1],
[3,672,112,True,′hardswish′,1],
#獲得這一層的輸出:c4
[5,672,160,True,′hardswish′,2],
[5,960,160,True,′hardswish′,1],
[5,960,160,True,′hardswish′,1],
#獲得這一層的輸出:c5
]
cls_ch_squeeze=960
具體連接結(jié)構(gòu)如圖6所示。
圖6 MobileNetV3 Large在FPN網(wǎng)絡(luò)體系中的應(yīng)用
2.2.2 用普通卷積替代了可變形卷積(deformable convolution)
在DBNet中的backbone里一般會默認將3×3 conv替換成可變形卷積,以此可以使得卷積操作的位置會在監(jiān)督信息的指導下進行選擇,可以較好地適應(yīng)目標的各種尺寸,提供更加豐富的感受野,這對于極端比例的文本檢測效果有益,但是同時也帶來大量復雜的計算量的弊端。而針對我們的檢測目標是文本框,文本框的比例通常較為正常,因此,此處我們選擇保留普通卷積,以減少不必要的計算量。
2.2.3 DBNet算法的特點:可微分二值化處理(differentiable Binarization)
標準二值化處理:
一般使用分割網(wǎng)絡(luò)(segmentation network)產(chǎn)生的概率圖(probability map P),將P轉(zhuǎn)化為一個二值圖P,當像素為1的時候,認定其為有效的文本區(qū)域,同時二值處理過程:
但是標準的二值處理是不可微的,這樣分割網(wǎng)絡(luò)不可以在訓練過程中優(yōu)化,故在DBNet算法中采用了可微分二值化:
其中:?是近似二值圖,T是自適應(yīng)閾值圖,k是膨脹因子。
一般習慣性設(shè)置k=50,帶有自適應(yīng)閾值的可微分二值化不僅有助于把文字區(qū)域與背景區(qū)分開,而且還能把相近的實例分離開來。
2.2.4 Loss損失函數(shù)
損失函數(shù)是通過概率圖損失L s-二值圖損失L b-閾值圖L t構(gòu)成的帶有權(quán)重的損失。
其中α和β我們分別設(shè)為5和10。
L s使用dire_loss函數(shù)和L b使用二值交叉熵損失函數(shù):
其中S l代表正負樣本比例為1∶3的樣本集。
L t為平滑后的L1損失,為了避免樣本不平衡的問題,只計算G d內(nèi)部的值
2.2.5 在MobileNetV3中利用h-swish代替swish
使用swish當作為ReLU的替代時,它可以顯著提高神經(jīng)網(wǎng)絡(luò)的精度,但是在嵌入式環(huán)境中,成本太大,而我們的模型是基于移動端設(shè)計的,所以選擇了h-swish。但是由于大量采用h-swish會引入延遲,因此我們網(wǎng)絡(luò)前半部分的激活函數(shù)仍采用ReLU,后半部分則采用h-swish。
我們系統(tǒng)基于CRNN模型,本系統(tǒng)以基于輕量級主干網(wǎng)絡(luò)MobileNetV3 Small[14]作為backbone進行圖像特征序列的提取,同時添加RNN結(jié)構(gòu)作為neck預(yù)測每幀的標簽分布,CTCHEAD作為head。
圖7 CRNN+CTC模型結(jié)構(gòu)
在Borisyuk等人[16]提出“Rosetta”新型人工智能系統(tǒng)中,該系統(tǒng)文字檢測和識別的模型也是基于CRNN框架,但是采用了輕量級的backbone,在效率與性能上都有不錯的表現(xiàn)。同時,我們對本系統(tǒng)的預(yù)設(shè)是建立在輕便簡潔、操作友好的移動端,期望識別算法是精度相對高而相對輕量能在移動端運行。
基于之前檢測模型設(shè)計,發(fā)現(xiàn)MobileNetV3是一種良好的輕量級主干網(wǎng)絡(luò),MobileNetV3 Small在眾多數(shù)據(jù)集上雖然識別延遲高于Mobile?NetV3 Large,但是識別精確度要高于Mobile?NetV3 Large,由于對精確度比延遲的需求高,因此我們選擇了MobileNetV3 Small作為backbone。
2.3.1 Map-to-Sequence的實現(xiàn)
我們不能直接把CNN得到的特征圖送入RNN進行訓練的,而是需要進行一些調(diào)整,根據(jù)特征圖提取RNN需要的特征向量序列。首先從CNN模型產(chǎn)生的特征圖中提取特征向量序列,每一個特征向量在特征圖上按列從左到右生成,每一列包含c維特征,這意味著第i個特征向量是所有的特征圖第i列像素的連接,這些特征向量就構(gòu)成一個序列,作為循環(huán)層的輸入,每個特征向量作為RNN在一個時間步(time step)的輸入。
2.3.2 BiLSTM的狀態(tài)更新公式
本文采用的雙層雙向LSTM按時序展開如圖8所示(圖中省略了內(nèi)部狀態(tài)c t,⊕為向量拼接操作)。
圖8 雙層BiLSTM時序展開
狀態(tài)更新公式如下:
比較簡單直觀地可以看到t時刻第一層Bi L?STM的第一層(順時間循環(huán)層)的隱狀態(tài)h(1)t取決于前一時刻的隱狀態(tài)h(1)t-1和輸入值x t,但是需要特別注意的是第二層(逆時間循環(huán)層)的隱狀態(tài)h′(1)t則取決于后一時刻的隱狀態(tài)和輸入值x t。
本文模型部署在飛槳的AI Studio上,AI Stu?dio是基于百度深度學習平臺飛槳的人工智能學習與實訓社區(qū),提供在線編程環(huán)境、免費GPU算力以及數(shù)據(jù)模型可視化VisualDL服務(wù)。我們還使用Baidu推出的PaddleOCR工具進行優(yōu)化部署,PaddleOCR工具對該文本檢測訓練數(shù)據(jù)提供了如隨機旋轉(zhuǎn)角度(-10°,10°)、隨機裁剪(做透視變換和旋轉(zhuǎn))、隨機翻轉(zhuǎn)的數(shù)據(jù)增強的方式,每種擾動方式以50%的概率被選擇。
本項目根據(jù)收集的數(shù)據(jù)訓練集,其中包括1000張檢測圖片及1000000張中文文檔數(shù)據(jù)的識別圖片,經(jīng)過數(shù)據(jù)集劃分后進行訓練,訓練結(jié)果如下圖所示。
圖9
圖11
同時對于訓練所得的模型,50張檢測圖片和2000張識別圖片。將訓練所得的模型用于測試集上進行驗證,在IoU閾值為0.5的標準下,測試結(jié)果如表3—表4所示。
表3 DB_mv3測試結(jié)果
表4 CRNN_mv3測試結(jié)果
(1)多印章類型文檔。指印章比較多的債券圖標文檔。
圖12 多印章類型文檔的檢測識別結(jié)果
(2)過擠壓類型文檔。指存在表格線框擠壓表格內(nèi)文本文字情況的債券圖標文檔。
圖13 過擠壓類型文檔的檢測結(jié)果
圖14 過擠壓類型文檔的識別結(jié)果
(3)扭曲類型文檔。指不平整的債券圖標文檔。
圖15 扭曲類型文檔的檢測識別結(jié)果
(4)折痕類型文檔。指有折痕印記的債券圖標文檔。
圖16 折痕類型文檔的檢測識別結(jié)果
(5)污點類型文檔。指存在污點污跡的債券圖標文檔。
圖17 污點類型文檔的檢測識別結(jié)果
本文采用海量的數(shù)據(jù)集并且進行了半人工化的標注,經(jīng)過調(diào)查研究以及通過訓練的低數(shù)據(jù)集下的通用模型后,選擇了兼顧精度和效率的模型,文本檢測模型DB_MV3以及CRNN_MV3,并對通用模型進行了優(yōu)化和改良。在移動端離線部署的情況下,檢測識別精度和效率經(jīng)過實驗證明也較為穩(wěn)定。
普通CPU環(huán)境即移動端離線情況下,單個大圖片的預(yù)測時間平均為2 s左右,而移動端聯(lián)網(wǎng)條件下,為了使檢測服務(wù)并發(fā)進行,我們使用了springcloud部署該項目,構(gòu)建多個檢測服務(wù)后臺,將檢測服務(wù)作為微服務(wù)集群,然后通過負載均衡使其滿足需求。本項目能在基礎(chǔ)環(huán)境下能夠?qū)崟r運行且能同時滿足多個用戶的檢測服務(wù)。目前算法檢測識別時間離線和聯(lián)網(wǎng)主要取決于債券圖表的文字密集程度和圖片數(shù)據(jù)壓縮上傳速度,后續(xù)希望可以從這兩個角度進行改進以降低檢測識別所耗費的時間。