Combined Character

轉載自:http://blog.csdn.net/peaceinmind/article/details/50374089


1導語

前兩節我們分別解釋了字符提取和字符過濾,在這過程中主要有=兩個原因需要我們將單個字符組合成一個文字行或者段落之類(如圖1)。一個重要的原因是出來不管是由於MSER的原因還是分類器的原因,有些真的字符並沒有找出來,比如ij上面的點等等,當然實際中情況要遠比這些嚴重的多,我們需要靠字符合並來恢復這些漏掉的字符。另外一個原因是在識別的時候有上下文會大大增加識別的精度,比如一個0,有時候很難區別它是數字0還是字母哦o,但是通過上下文的聯繫,難度就沒這麼大了,本節主要介紹字符合並,文本二值化,並會在結尾順帶特別簡要地介紹下怎麼去做OCR,在後面的章節中再會找個好玩的算法具體解釋。


 

2 字符合並

在討論這個問題之前呢,有一個問題需要說明的是,不是所有的算法都是先找字符再合併成文本行的,例如文獻[1]中就是類似於物體識別,利用edgebox先去找word框,文獻[2]也是先找框,不過其中的算法論文很快帶過,文獻[3]就更標新立異了,利用對稱特徵先去找文本行.所以,本章節討論的是針對那些先找字符然後再合併的算法。最基本的字符合從結果上分可以分爲水平合併和任意方向合併。任意方向更復雜,效果也相對較差。這其實跟我們生活中的道理是一樣的,問題越簡單,知道的先驗知識越多,處理起來也就越簡單,結果也會更準確。在這裏我們只介紹水平合併,多方向合併的可以參考[3]

文獻[6]模擬底部和頂部直線,如下圖,個人感覺對於中文不是很通用,中文經常可以分爲上下兩個部分。


個人還是比較喜歡文獻[5]中的算法,它利用兩字符的顏色,位置,stroke等特徵判斷字符是否可以合併,比較直觀上比較符合人的感受,因此下面着重介紹它。

假設我們有兩字符uv,我們就利用兩字符的一些特徵差別,然後爲每個特徵差訓練一個權重,看最後的得分是否大於0,大於0說明差別比較大,不應該合併,小於0就可以合併。


論文中主要採用了這麼幾個特徵:

interval,也就是兩字符的間隔與字符的最大寬度的比例(對於這個特徵,由於mser有可能把幾個字符框在了一起,因此高度作爲分母是不是會更好些?)

Widthand height differences,非常直觀,字符寬度和高度差。

Topbottom alignment,其實有點類似於文獻[6]中的直線模擬

Colordifference,顏色差

Strokewidth difference,筆畫寬度差



如果對權重的訓練過程不是很感興趣,那可以直接用論文的結果,其中的theshold類似於神經網絡的bias


如果對訓練過程感興趣,那我們接着往下看。訓練的過程其實跟一般的並沒有什麼很特殊的區別,個人覺得比較麻煩的就是標註數據,不過ICDAR有一些可以利用。

首先我們有一些單詞或文本行的cluster(看你希望合併成單詞還是文本行),其中包含最基本的元素是字符,我們需要做的就是想讓cluster內部的字符特徵差與權重的內積小於0,而不同clusters的字符特徵差與權重的內積大於0,這裏採用迭代的方法。首先初始化一個w,然後選出所有cluster內部字符特徵差異最小的(個人有點不太理解爲什麼不選最大的?),和不同cluster間的字符特徵差x最小的


這個就有點類似於正負樣本了,接下來我們需要去定義損失函數,


 

其實很好理解,用的是邏輯迴歸的東西,同一個cluster的特徵差異越大,損失越大,不同cluster特徵差異越大,損失越小。論文中用的是LBFGS,這部分可以參考維基百科.

一次迭代後,再用新的w值再去尋找C,M中的樣本重新訓練。


3 文本二值化

二值化能很大程度上提高OCR的精度。現在用的最多的應當是是大金算法,tesseract[8]默認的也用的是這個,opencv裏也有現成,文獻[2]用的是Niblackbinarization,大家如果有興趣,可以參照[9]跑一跑代碼實際測試下,其中實現了幾種二值化的算法。這裏我們要介紹的文獻[6][12]中的grabcut算法,顯得要高大上些。另外非常抱歉的是由於本人沒做實驗,只能用論文中的圖片先代替,後面做完實驗後會更新這部分的內容。

 

前面的章節已經分析了Grabcut,現在假設大家都看過了這部分的內容。

如果要用grabcut進行二值化,就是要找到字的前景。在這裏我們可以把一個文本行中找到的字符點作爲前景來訓練,但是有可能這部分點有些噪點,文獻[6]是用了SSP作爲DF(確定是前景),並且也是採用了一個迭代過程來向外擴展文本框,4,5,6這幾部opencvgrabcut函數已經覆蓋了。PF是可能是前景的意思


最後的結果就類似於


 

4文字識別

由於文字識別很複雜,最簡單的方法是調用開源庫tesseract[8],當應用場景不是很複雜,文字定位也做的比較好時,精度還過得去。另外一種如果場景特別乾淨,你可以自己去分割,然後用分類器去識別,這種的缺點也比較明顯,先不說分割的準確度,由於缺少了上下文,一些字容易識別錯。現在越來越多的論文引入BLSTM或者Multi Dimensional LSTM去做文字識別[10][11],我們後面的章節應該會着重介紹LSTM

 

這節就囫圇吞棗的講到這裏。由於個人水平有限,錯誤與疏漏還請批評與指正。

 

[1]Reading text in the wildwith convolutional Neural Networks.

[2]PhotoOCR: Reading Text inUncontrolled Conditions

[3]Symmetry-Based Text LineDetection in Natural Scenes

[4]Multi-orientation scene textdetection with adaptive clustering

[5]Yin X C, Yin X, Huang K, etal. Robust text detection in natural scene images[J]. Pattern Analysis andMachine Intelligence, IEEE Transactions on, 2014, 36(5): 970-983.

[6]Neumann L, Matas J.Efficient Scene Text Localization and Recognition with Local Character

[7]https://en.wikipedia.org/wiki/Limited-memory_BFGS

[8]https://code.google.com/p/tesseract-ocr/

[9]https://github.com/caiosba/binarization

[10]Can we buildlanguage-independent OCR using LSTM networks?

[11]Segmentation-freeHandwritten Chinese Characters Recognition with LSTM-RNN

[12]Milyaev S, Barinova O, Novikova T, et al. Image binarization for end-to-end text understanding in natural images[C]//Document Analysis and Recognition (ICDAR), 2013 12th International Conference on. IEEE, 2013: 128-132.


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章