如何構建識別圖像中字符的自動程序?一文解讀OCR與HTR

2020-12-06 機器之心Pro

選自Medium

作者:Ajinkya Khalwadekar

機器之心編譯

參與:Panda、蛋醬

在機器學習和計算機視覺領域,光學字符識別(OCR)和手寫文本識別(HTR)長期以來都是人們研究的重要主題。本文將幫助計算機視覺愛好者大致了解如何對文檔圖像中的文本進行識別。

光學字符識別和手寫文本識別是人工智慧領域裡非常經典的問題。OCR 很簡單,就是將文檔照片或場景照片轉換為機器編碼的文本;而 HTR 就是對手寫文本進行同樣的操作。作者在文章中將這個問題分解成了一組更小型的問題,並製作了如下的流程圖。

圖 1.1:應用流程圖

按文檔邊框裁剪圖像

在圖像處理中,通常需要對圖像進行預先編輯,以便獲得更好的表徵。裁剪是圖像編輯中最常用的操作之一,這可以移除圖像中不需要的部分,也可以向圖像添加所需的特徵。

你可以使用 OpenCV 來輕鬆地找到圖像中文檔的邊緣,查找圖像中文檔邊緣的最佳方法是使用閾值圖像。OpenCV 提供了不同的閾值樣式,這是由其函數的第 4 個參數決定的。在這個函數中,第一個參數是源圖像,這應該是一張灰度圖像;第二個參數是用於分類像素值的閾值;第三個參數是 maxVal,這是當像素值超過(有時是低於)閾值時所要給出的值。

下面的代碼將能幫助你找到閾值圖像,然後確定文檔邊緣的輪廓,你可以將這些輪廓點與圖像邊緣進行比較,然後確定文檔的邊緣。

# threshold imageret, thresh = cv2.threshold(imgray, 150, 255, 0)cv2.imwrite('thresh.jpg', thresh)# edge contourscontours, hierarchy = cv2.findContours(thresh, 1, 2)

檢測和裁剪/分割文檔中的所有詞

在有約束的受控環境中進行詞檢測通常可以使用啟發式方法實現,比如利用梯度信息或者這樣的事實:文本通常會被分組成段落以及排列成直線的字符。但是,使用啟發式方法是存在缺陷的,圖像中很多不需要的區域也會被檢測為詞,所以我們可以使用 OpenCV 的 EAST(Efficient and Accurate Scene Text)檢測器。

可以參考 Adrian Rosebrock 寫的 EAST 檢測器相關文章:https://www.pyimagesearch.com/2018/08/20/opencv-text-detection-east-text-detector/

然後再根據 Tom Hoag 分享的方法對其進行改進:https://medium.com/@tomhoag/opencv-text-detection-548950e3494c

這種方法能以很高的準確度檢測出手寫文本以及機器列印的文本。檢測出圖像中的詞之後,再將它們裁剪出來並將它們全部保存下來。

預處理詞圖像

應該怎麼樣對圖像進行預處理?這完全取決於你接下來要做什麼。如果想要分類手寫的和機器列印的詞,需要所有圖像都處於灰度模式。為了將圖像轉換為灰度圖像,還需要使用 OpenCV:

imgray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

這是手寫詞嗎?

這是一個分類問題:確定一張特定圖像中的詞是「手寫詞」還是「機打詞」。作者瀏覽了多篇文章和研究論文,發現支持向量機(SVM)是解決這一問題的最佳方案,然後使用了來自 sklearn 軟體包的 SVM 分類器來完成這一任務。

對於用於分類的數據集,作者提到了一個很好的手寫詞圖像有標註數據集 IAM:http://www.fki.inf.unibe.ch/databases/iam-handwriting-database

對於機器列印的詞圖像,作者收集了大約 2000 張詞圖像。下面是用於預測的特徵:

1. 平均像素強度

2. 像素強度的標準差

3. Otsu 閾值

4. 像素強度直方圖中局部最大值的數量

5. 屬於像素強度上面的四分之一的像素的百分比

6. 屬於像素強度下面的四分之一的像素的百分比

按照上面來看,所有特徵都與圖像的像素強度有關聯。下一個問題是:如何找到像素強度?

灰度圖像的像素值就是像素的強度,同樣也可以使用 OpenCV 和數學運算來完成這一任務。

使用 TensorFlow 的 HTR

這是本文所有問題中最具有挑戰性的問題。在嘗試了不同的解決方案之後(包括在手寫字符數據集上重新訓練 Tesseract),結果顯示 Harald Scheidl 這篇文章的方法最佳:https://towardsdatascience.com/build-a-handwritten-text-recognition-system-using-tensorflow-2326a3487cd5

作者使用了類似的方法,不過做了一些小修改,在這裡使用了神經網絡,由 5 個卷積神經網絡(CNN)層、2 個循環神經網絡(RNN)層和 1 個連接主義時間分類(CTC)層構成。用於訓練這個神經網絡的數據集是 IAM 數據集,但你也可以使用任何有標註的詞圖像數據集。

圖 1.2:來自 Herald Scheidl 文章的示意圖

CNN 層的輸入是大小為 128×32 的灰度值圖像。CNN 層的輸出是一個序列,其包含 32 項,其中每一項都有 256 個特徵。這些特徵再進一步由 RNN 層處理,但是,某些特徵已經表現出了與輸入圖像的特定高層面性質的高度相關性。

圖 1.3:來自 Herald Scheidl 的文章的示意圖

圖 1.3 展示了處理一張包含文本「little」的圖像時,可視化的 RNN 輸出矩陣。最上面的圖表中的矩陣包含了字符的分數,這些字符中的最後一項(第 80 個)是一個 CTC 空白標籤。其它矩陣項,從上到下分別對應於如下字符:!」#&』()*+,-./0123456789:;?ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz

可以看到,大多數時間裡,被預測的字符都剛好出現在它們在圖像中的位置處(比如,你可以比較看看圖像與圖表中 i 的位置。只有最後一個字符 e 沒有對齊。但這其實沒有問題,因為 CTC 操作是無分割的,而且不在乎絕對位置。最下面的圖表展示了字符 l、i、t、e 和 CTC 空白標籤的分數,該文本可以輕鬆地被解碼:我們只需要從每個時間步驟取出最可能的字符即可,這會構成所謂的最佳路徑,然後我們丟棄重複的字符,最後丟棄所有空白,得到:「l—-ii—t-t—l-…-e」→「l—-i—t-t—l-…-e」→「little」。

更多有關如何實現這一方法的細節信息,請參看 Herald Scheidl 的文章。

Tesseract(OCR)

Tesseract 是目前最好的用於機器列印字符識別的開源 OCR 工具。Tesseract 支持 Unicode(UTF-8)字符集,可以識別超過 100 種語言,還包含多種輸出支持,比如純文本、PDF、TSV 等。但是為了得到更好的 OCR 結果,還必須提升提供給 Tesseract 的圖像的質量。

注意,在執行實際的 OCR 之前,Tesseract 會在內部執行多種不同的圖像處理操作(使用 Leptonica 庫)。通常它表現不錯,但在某些情況下的效果卻不夠好,導致準確度顯著下降。

在將圖像傳遞給 Tesseract 之前,可以嘗試以下圖像處理技術,但具體使用哪些技術取決於你想要讀取的圖像:

1. 反轉圖像

2. 重新縮放

3. 二值化

4. 移除噪聲

5. 旋轉/調整傾斜角度

6. 移除邊緣

所有這些操作都可以使用 OpenCV 或通過 Python 使用 numpy 實現。

簡單總結一下,本文介紹了與 OCR 和 HTR 相關的一些問題和可能的解決方案。如果你想要真正理解,一定要親自動手實現它們看看。

原文連結:https://medium.com/@ajinkya.khalwadekar/building-ocr-and-handwriting-recognition-for-document-images-f7630ee95d46

相關焦點

  • 推薦幾款OCR識別App(提取圖像中的文字,適用安卓與ios)
    Ocr識別技術,說直白一點,就是把以圖像形式存在的文字變成可編輯的文字.:10每個人都聽命於三個「長官」控制模式必須因時制宜,一藥不能治百疾現在讓我們來看看人的行為如何被控制或影響。市面有很多軟體都有這樣的功能, 這邊就推薦幾款手機上的ocr識別應用.
  • 機器視覺—字符識別之環形字符識別
    字符呈環形排列,若需識別,首先需要需要將環形排列的字符轉換至我們所熟悉的水平排列方式,後續就是OCR分割和分類的任務了。CD盤印刷的環形字符,如下圖。環形字符識別通過極坐標變換,可以加個環形排列字符轉換至水平排列,原理如下。極坐標變換原理直角坐標是我們能夠直觀想像,符合人類大腦的空間坐標,即x-y坐標系。
  • python人工智慧-圖像識別
    PIL:(Python Imaging Library)是Python平臺上的圖像處理標準庫,功能非常強大。pytesseract:圖像識別庫。引擎光學字符識別(OCR,Optical Character Recognition)是指對文本資料進行掃描,然後對圖像文件進行分析處理,獲取文字及版面信息的過程。
  • Python圖像處理之圖片文字識別(OCR)
    它可以通過訓練識別出任何字體(只要這些字體的風格保持不變就可以),也可以識別出任何Unicode 字符。Tesseract的安裝與使用   Tesseract的Windows安裝包下載地址為: http://digi.bib.uni-mannheim.de/tesseract/tesseract-ocr-setup-4.00.00dev.exe ,下載後雙擊直接安裝即可。
  • 康耐視利用自動調諧專利技術增進OCR 讀碼軟體性能
    設置快速、簡便,讀取率超卓當用戶單擊自動調諧按鈕時,系統採集樣本圖像並自動將工具調整為最優參數,以獲得可靠的讀取性能。先進的 OCRMax 算法可防止誤讀,並可提供方便的光學字符識別和驗證(OCR 和 OCV)應用字體管理(例如,解碼人工可讀日期、批次代碼或序列號)。
  • Python3爬蟲-10:Tesseract 圖像識別
    ,如:圖形驗證碼、極驗滑動驗證碼、點觸驗證碼、微博宮格驗證碼等;這時,可以利用OCR技術識別圖形驗證碼進行驗證。OCR,即Optical Character Recognition,是指光學字符識別,通過掃描字符將其形狀翻譯成電子文本。在Python3中,可以通過pytesseract庫調用Tesseract-OCR使用OCR技術識別圖形驗證碼。
  • 如何 提取圖片中的文字?這款Python 庫 4行代碼搞定!
    OCR的全稱叫作「Optical Character Recognition」,即光學字符識別。這算是生活裡最常見、最有用的AI應用技術之一。OCR本質是圖像識別,其包含兩大關鍵技術:文本檢測和文字識別。先將圖像中的特徵的提取並檢測目標區域,之後對目標區域的的字符進行分割和分類。
  • 手機怎樣識別圖片上的文字?文字如何翻譯成英文
    在工作中我們會遇到各種各樣格式的文件,其中圖片格式文件最多,如果我們想要將圖片中的文字提取出來怎麼操作?圖片中文字較少手寫敲打還行,但是文字過多進行打字就太費神費力了,怎樣可以識別圖片上的文字呢?識別文字如何翻譯成英文?遇到這種問題,其實利用手機上一些小工具就可以輕鬆解決!
  • 機動車號牌圖像自動識別技術規範(GA/T 833—2009)
    機動車號牌圖像自動識別技術規範(GA/T 833—2009) 1  範圍 本標準規定了機動車號牌圖像自動識別軟體的技術要求、接口函數和信息交換格式 4.2 號牌字符 號牌字符是自動識別的重要內容,應識別的號牌字符包括:
  • 圖像文字識別用什麼軟體?怎麼識別圖像中的文字?
    怎麼識別圖像中的文字?朋友小沈按照家裡人意思,壓制住了當自媒體撰稿人的想法,畢業後做起了財務文員。正因如此,她的文藝心逐漸泛濫,業餘把時間都放在了收集、記錄美圖、美句上。隨著日復一日的素材積累,小沈的寫作靈感越來越多,最後乾脆當起了兼職寫手。
  • OCR在NLP場景中的應用
    即,針對印刷體字符,採用光學的方式將紙質文檔中的文字轉換成為黑白點陣的圖像文件,並通過識別軟體將圖像中的文字轉換成文本格式,供文字處理軟體進一步編輯加工的技術。那麼既然是通過掃描,或者攝像的方式獲取,就會遇到很多諸如背景複雜、解析度低等情況,在沒有針對OCR技術實質性的了解下,有的朋友都會認為OCR識別,是一件非常easy的事情,不值得進行討論。
  • 圖像採集綜合評估的嵌入式指紋識別系統(一)
    在指紋圖像評估算法研究領域,Tabassi等人通過提取指紋圖像各子塊的對比度和曲率特徵評估指紋圖像質量,但這種方法只是從指紋圖像局部紋理進行分析,不足以反映指紋圖像全局信息;Hong等人通過計算指紋圖像每一圖塊指紋紋線垂直方向上的灰度方差評估指紋圖像質量,它在圖像噪聲較大時並不能很好獲得指紋圖像的方向圖,從而影響最後的評估效果。
  • 詳解RPA與OCR的工作機制與原理
    OCR與RPA的結合可以將組織中超過70%的無紙化業務實現自動化,其效率將是人工的5倍以上。下面本文將詳細介紹OCR與RPA在智能自動化中的一些案例和注意事項。什麼是OCR?它是如何工作的?OCR是指電子設備(例如掃描儀或數位相機)檢查紙上列印的字符,通過檢測暗、亮的模式確定其形狀,然後用字符識別方法將形狀翻譯成計算機數據的過程。針對印刷體字符,採用光學的方式將紙質文檔中的文字轉換成為黑白點陣的圖像文件,並通過識別軟體將圖像中的文字轉換成文本格式,供文字處理軟體進一步編輯加工的技術。
  • 包括的領域有計算機視覺,語音識別,自然語言處理,圖像識別等
    通過機器自動分析環境對環境的仿真信息,做出判斷或作出操作。現在人工智慧已經包括的領域有計算機視覺,語音識別,自然語言處理,圖像識別等。人工智慧的步驟人工智慧基本步驟包括,信息提取->信息分析->假設建模->學習->泛化,具體步驟。
  • 附代碼|OpenCV實現銀行卡號識別,字符識別算法你知多少?
    作者 | 李秋鍵責編 | Carol頭圖 | CSDN 付費下載自視覺中國隨著計算機視覺在我們生活中的應用越來越廣泛,大量的字符識別和提取應用逐漸變得越來越受歡迎,同時也便利了我們的生活。像我們生活中的憑藉身份碼取快遞、超市掃碼支付的機器等等。字符識別是模式識別的一個重要應用,首先提取待識別字符的特徵;然後對提取出來的特徵跟字符模板的特徵匹配;最後根據準則判定該字符所屬的類別。不同的訓練方法,不同的特徵提取, 不同的匹配規則,就相應的有不同的字符識別方法,基本上很多就是在這些地方做改進,或者是採用新的規則。但是萬變不離其宗。
  • 使用Python製作一個簡易的OCR圖片文字識別工具
    ,英文全稱是Optical Character Recognition,說白了就是從電子設備中顯示的圖片上面查找我們需要的字符,通過檢測、識別將字符翻譯成計算機文字的過程。自行百度吧,兄嘚),會彈出一個對話框,在對話框中輸入mspaint會打開系統提供給我們的一個簡易的繪圖工具,通過這個工具可以實現對圖像的簡單處理。比如截圖,保存圖片等等操作。
  • 驗證碼識別實例,python簡單圖像處理和實現
    問題來源某系統門戶登陸界面如下:現在我們要實現自動的驗證碼識別。圖像特徵首先,我們仔細觀察下這個驗證碼圖像,可以發現一些固定特徵:1、驗證碼中的字符數始終為6,並且是灰度圖像。2、字符間的間隔看起來每次都一樣。3、 每個字符都是完全定義的。
  • 百度OCR通用中英文字符識別準確率達95%以上
    來源:格隆匯格隆匯11月1日丨百度大腦開放日OCR文字識別專場昨日在上海召開,百度AI技術生態部產品經理為開發者們詳細介紹了百度大腦最新的開放能力,百度視覺技術部韓鈞宇深入分享了百度大腦OCR文字識別方向的最新技術與趨勢,並邀請華夏保險上海分公司
  • 代碼詳解:一文讀懂自動編碼器的前世今生
    去噪自動編碼器有幾種其它類型的自動編碼器。其中最常用的是去噪自動編碼器,本教程稍後會和Keras一起進行分析。這些自動編碼器在訓練前給數據添加一些白噪聲,但在訓練時會將誤差與原始圖像進行比較。這就使得網絡不會過度擬合圖像中出現的任意噪聲。稍後,將使用它來清除文檔掃描圖像中的摺痕和暗黑區域。
  • 使用Python和Tesseract來識別圖形驗證碼
    *本文原創作者:ipenox,本文屬FreeBuf原創獎勵計劃,未經許可禁止轉載各位在企業中做Web漏洞掃描或者滲透測試的朋友,可能會經常遇到需要對圖形驗證碼進行程序識別的需求。一、關於圖形驗證碼識別與tesseractOCR儘管多數圖型驗證碼只有區區幾個數字或字母,但你可能聽說了,在進行機器識別的過程中,你要收集樣本,對圖片去噪、二值化、提取字符、計算特徵,甚至還要祭出神經網絡去訓練數據進行機器學習……還沒開幹,退堂鼓早打響三遍了。