版面分析那些事
在大家討論使用深度學習端到端進行OCR時,我們覺得像傳統的圖像預處理、版面分析已經離我們遠去,但是在真正實施的時候,發現這些又一直陪伴在我們左右。本次我們就來說道說道版面分析那些事,如有不正確的地方,望大家斧正。本文不講解關於演算法實現以及數學實現,不講解識別,只講解如何去處理。
版面分析是對版面內的圖像、文本、表格信息和位置關 系所進行的自動分析、識別和理解的過程。
說到版面分析,我先從兩方面說下為什麼需要版面分析。
1.圖像產生過程
從圖像採集設備來看,掃描儀、移動設備、高拍儀、以及其他一些方法。
如果像圖1,圖2這樣的圖,使用高拍儀是可以拍出如此質量的圖像的。我用投影法,幾行代碼就可以搞定版面分析,將表格、文本區域給區分出來。
通過圖3,圖4一目了然可以搞定出來文本行、線、以及表格對應區域。代碼如下:
import numpy as npimport cv2import sysimport matplotlib.pyplot as pltimg = cv2.imread(sys.argv[1],0)h,w = img.shape[:2]img = cv2.resize(img,(h//5,w//5),interpolation=cv2.INTER_CUBIC)_,bin = cv2.threshold(img,128,255,cv2.THRESH_BINARY)horizontal_sum = np.sum(bin, axis=1) plt.plot(horizontal_sum, range(horizontal_sum.shape[0]))plt.gca().invert_yaxis()plt.show()
此時此刻,開開心心的可以把文本、表格去檢測出來,然後我再對不同元素使用不同方法來識別了。
比如表格的分割與識別,如圖5表格,通過處理可以得到表格框架圖7與表格交點圖6,通過一系列處理是可以得到對應的每個區域的ROI的。
代碼如下:
#coding:utf-8表格生成線條坐標import cv2import numpy as npfrom matplotlib import pyplot as pltimport jsonimport sysimport subprocessimport osclass detectTable(object): def __init__(self, src_img): self.src_img = src_img def run(self): if len(self.src_img.shape) == 2: # 灰度圖 gray_img = self.src_img elif len(self.src_img.shape) ==3: gray_img = cv2.cvtColor(self.src_img, cv2.COLOR_BGR2GRAY) thresh_img = cv2.adaptiveThreshold(~gray_img,255,cv2.ADAPTIVE_THRESH_MEAN_C,cv2.THRESH_BINARY,15,-2) h_img = thresh_img.copy() v_img = thresh_img.copy() scale = 15 h_size = int(h_img.shape[1]/scale) h_structure = cv2.getStructuringElement(cv2.MORPH_RECT,(h_size,1)) # 形態學因子 h_erode_img = cv2.erode(h_img,h_structure,1) h_dilate_img = cv2.dilate(h_erode_img,h_structure,1) # cv2.imshow("h_erode",h_dilate_img) v_size = int(v_img.shape[0] / scale) v_structure = cv2.getStructuringElement(cv2.MORPH_RECT, (1, v_size)) # 形態學因子 v_erode_img = cv2.erode(v_img, v_structure, 1) v_dilate_img = cv2.dilate(v_erode_img, v_structure, 1) mask_img = h_dilate_img+v_dilate_img joints_img = cv2.bitwise_and(h_dilate_img,v_dilate_img) joints_img = cv2.dilate(joints_img,None,iterations=3) cv2.imwrite("joints.png",~joints_img) cv2.imwrite("mask.png",~mask_img)if __name__==__main__: img = cv2.imread(sys.argv[1]) detectTable(img).run()
這是理想情況:就是圖像質量良好(亮度一樣),並且圖像是正放。
但是你會發現你在接觸項目的時候不可能每個客戶給的圖片都是拍的那麼好,有的人著急用掃描儀,發現拍出來的圖是斜著的,有的是用200萬像素的諾基亞5230拍的,那圖像質量不那麼清晰,還有人拿著IphoneX在走訪客戶的時候怕泄密文件,在廁所里偷拍的暗光圖片(自行腦補),還有各種複雜背景的圖片,不勝枚舉。
當然你可以diss我說圖像如果斜著放,不存在透射的時候我用opencv自帶的傅里葉變換的可以搞定(參考:https://python.freelycode.com/contribution/detail/686),再輔助直線檢測得到圖像對應的正方向,當然可以這麼做。如果亮度不統一,我用各種酷炫的二值化方法,然後最後投影搞定。那我們就可以說你可以在這種情況下用傳統方法搞定。不過別高興太早,接著往下看。
等到某一天你看到蘇州大學一個關於複雜版面分析的論文(http://www.ecice06.com/EN/article/downloadArticleFile.do?attachType=PDF&id=18712),對於之前提到的方法你開始懷疑人生了。不過聰明的你復現了論文中的方法~這時你已經會用機器學習方法來進行版面分析,看不上之前土方法。
到後來你信心滿滿的去找工作,專門做ocr,正好應聘的是一家做教育的公司,然後老闆扔給一份小學數學試卷。如圖8
看到圖後,你就準備起草「世界那麼大,我想去看看」的離職報告了。無意中打開知乎看到一個新鮮辭彙:深度學習。心裡想著反正閑著也是閑著,我來研究下這是什麼新技術,然後就發現這是個好東西,又能圖像分類,又能圖像檢測的,反正看起來就是高端,無所不能。不過提到檢測,心裡好像有點想法,我做版面分析的時候是不是可以用檢測的思路來做。到時我搞個牛掰的模型可以通用,什麼表格 、文本、圖形、印章、手寫字、印刷體我都一咕嚕給你搞出來。說到這裡,就是下一節要說的圖像元素的對於版面分析的影響。
這裡我多說一句,大家在接圖像項目一定要先看圖,不然你根本無法想像圖像質量能超越你的想像的。(下一次我打算寫一個我之前幫一老師做的一個項目,本以為是一個簡單的識別項目,後來發現越做坑越多,從圖像質量到後面程序部署平台遇到的坑,讓人記憶猶新)。
2.圖像元素
現在ocr正在從具有先驗知識的文檔往自然場景發展,比如騰訊QQ對於聊天記錄圖片的ocr,涉及到色情驗證等,給你一張圖,上面來一段廣告,色情網站什麼的,你根本無法想像文本是怎麼排列的,在沒有先驗知識的情況下,深度學習就有用武之地了。這時你又要抬杠了,我要用mser來檢測文本(可參考:https://www.jianshu.com/p/1b9c275698c9 )。然後圖像分布太恐怖,各種背景,各種場景,五花八門,眼花繚亂,準備放棄。慢著,深度學習了解一下。
看了那麼多模型,在論文兩篇論文[1][2]的引導下,最終想做圖9的效果
最後我決定用maskrcnn做一下版面分析。(ps:不過由於版面分析模型沒有完全訓練好,所以我就拿另外一個關於發票識別的例子來說說。)
之前幫朋友做過一個關於發票識別的demo,主要是識別出來發票相關信息然後放入到國家稅務局網站來校驗真偽(https://inv-veri.chinatax.gov.cn),當時驗證碼識別已經做好,看如下視頻:
https://www.zhihu.com/video/970662085256028160這個網站需要的信息是發票代碼,發票號碼,開票日期,金額等。
再看如下視頻是定位發票上面相關信息:
https://www.zhihu.com/video/970663716308594688ps:如果大家對ocr感興趣,可以加微信群討(由於二維碼上傳後會出現編碼情況,我從新截圖了,發現還是編碼,所以可以加我微信:lixianjie0518,拉你進群),我會在群里把文本版面分析的模型發出來,大家拭目以待。
https://weixin.qq.com/g/AdoDiFYs5pzXhpBG (二維碼自動識別)
引用:
[1]Fast CNN-based document layout analysis http://openaccess.thecvf.com/content_ICCV_2017_workshops/papers/w18/Oliveira_Fast_CNN-Based_Document_ICCV_2017_paper.pdf
[2]Table Detection Using Deep Learning https://www.researchgate.net/publication/320243569_Table_Detection_Using_Deep_Learning
推薦閱讀:
※深度反向投影網路(DBPN)--通過Back-Projection來超解析度的新方法
※魔幻光影濾鏡(3):美女人像「劃重點」
※去霧演算法 顏色衰減先驗 《A Fast Image Haze Removal Algorithm Using Attenuation Prior》
※數字圖像處理
TAG:OCR光學字元識別 | 圖像處理 | 深度學習DeepLearning |