關(guān)于移動(dòng)端vin碼識(shí)別的一次實(shí)踐

vin碼識(shí)別所涉及的知識(shí)

如果要實(shí)現(xiàn)vin碼識(shí)別,最簡(jiǎn)化的步驟是什么?獲取圖片->圖片識(shí)別。重點(diǎn)在于圖片識(shí)別,限于自身的知識(shí)和技術(shù)限制,我優(yōu)先想到的是使用開源的第三方庫來實(shí)現(xiàn)。要找到第三方開源庫,首先得知道在識(shí)別過程中用到的技術(shù)是什么。

經(jīng)過一番搜索學(xué)習(xí),我發(fā)現(xiàn)vin碼識(shí)別屬于光學(xué)字符識(shí)別技術(shù)(Optical Character Recognition, 即OCR)。OCR是指對(duì)文本資料的圖像文件進(jìn)行分析識(shí)別處理,獲取文字及版面信息的過程。

那么OCR的具體過程是什么呢?大的步驟我們可以分為:圖片預(yù)處理、特征提取和降維、分類器設(shè)計(jì)、訓(xùn)練和實(shí)際識(shí)別、后處理。

  • 圖片預(yù)處理

預(yù)處理階段是對(duì)包含文字的圖像進(jìn)行處理以便后續(xù)進(jìn)行特征提取、學(xué)習(xí)。因?yàn)閳D片輸入可能是五花八門的環(huán)境和效果,所以這個(gè)過程的主要目的是減少圖像中的無用信息,以便方便后面的處理。
在這個(gè)步驟通常有:灰度化(如果是彩色圖像)、降噪、二值化、字符切分以及歸一化這些子步驟。經(jīng)過二值化后,圖像只剩下兩種顏色,即黑和白,其中一個(gè)是圖像背景,另一個(gè)顏色就是要識(shí)別的文字了。降噪在這個(gè)階段非常重要,降噪算法的好壞對(duì)特征提取的影響很大。字符切分則是將圖像中的文字分割成單個(gè)文字——識(shí)別的時(shí)候是一個(gè)字一個(gè)字識(shí)別的。如果文字行有傾斜的話往往還要進(jìn)行傾斜校正。歸一化則是將單個(gè)的文字圖像規(guī)整到同樣的尺寸,在同一個(gè)規(guī)格下,才能應(yīng)用統(tǒng)一的算法。

  • 特征提取和降維

特征是用來識(shí)別文字的關(guān)鍵信息,每個(gè)不同的文字都能通過特征來和其他文字進(jìn)行區(qū)分。對(duì)于數(shù)字和英文字母來說,這個(gè)特征提取是比較容易的,因?yàn)閿?shù)字只有10個(gè),英文字母只有52個(gè),都是小字符集。對(duì)于漢字來說,特征提取比較困難,因?yàn)槭紫葷h字是大字符集,國標(biāo)中光是最常用的第一級(jí)漢字就有3755個(gè);第二個(gè)漢字結(jié)構(gòu)復(fù)雜,形近字多。
在確定了使用何種特征后,視情況而定,還有可能要進(jìn)行特征降維,這種情況就是如果特征的維數(shù)太高(特征一般用一個(gè)向量表示,維數(shù)即該向量的分量數(shù)),分類器的效率會(huì)受到很大的影響,為了提高識(shí)別速率,往往就要進(jìn)行降維,這個(gè)過程也很重要,既要降低維數(shù)吧,又得使得減少維數(shù)后的特征向量還保留了足夠的信息量(以區(qū)分不同的文字)。

  • 分類器設(shè)計(jì)、訓(xùn)練和實(shí)際識(shí)別

分類器是用來進(jìn)行識(shí)別的,就是對(duì)于第二步,對(duì)一個(gè)文字圖像,提取出特征給,丟給分類器,分類器就對(duì)其進(jìn)行分類,告訴你這個(gè)特征該識(shí)別成哪個(gè)文字。

  • 后處理

后處理是用來對(duì)分類結(jié)果進(jìn)行優(yōu)化的:
第一個(gè),分類器的分類有時(shí)候不一定是完全正確的(實(shí)際上也做不到完全正確),比如對(duì)漢字的識(shí)別,由于漢字中形近字的存在,很容易將一個(gè)字識(shí)別成其形近字。后處理中可以去解決這個(gè)問題,比如通過語言模型來進(jìn)行校正——如果分類器將“在哪里”識(shí)別成“存哪里”,通過語言模型會(huì)發(fā)現(xiàn)“存哪里”是錯(cuò)誤的,然后進(jìn)行校正。
第二個(gè),OCR的識(shí)別圖像往往是有大量文字的,而且這些文字存在排版、字體大小等復(fù)雜情況,后處理中可以嘗試去對(duì)識(shí)別結(jié)果進(jìn)行格式化,比如按照?qǐng)D像中的排版排列什么的,舉個(gè)栗子,一張圖像,其左半部分的文字和右半部分的文字毫無關(guān)系,而在字符切分過程中,往往是按行切分的,那么識(shí)別結(jié)果中左半部分的第一行后面會(huì)跟著右半部分的第一行諸如此類。

vin碼識(shí)別所用的開源庫

OpenCV

通過上面的OCR識(shí)別步驟的介紹,我們可以發(fā)現(xiàn)OCR涉及技術(shù)量很龐大。不管是預(yù)處理階段的各種圖像處理技術(shù)還是后面的文字特征提取,都涉及到大量的圖像算法知識(shí),同時(shí)分類器設(shè)計(jì)和訓(xùn)練還涉及到機(jī)器學(xué)習(xí)、人工智能相關(guān)技術(shù)及應(yīng)用,我們不可能從基礎(chǔ)算法上去完全編寫這些處理步驟,大多數(shù)人也不會(huì)機(jī)器學(xué)習(xí)、深度學(xué)習(xí)和人工智能,所以最快捷的方法是使用現(xiàn)有OCR相關(guān)的開源庫。

經(jīng)過一番搜索,我發(fā)現(xiàn)了OpenCV滿足我的要求。OpenCV是Intel?開源計(jì)算機(jī)視覺庫。它由一系列 C 函數(shù)和少量 C++ 類構(gòu)成,實(shí)現(xiàn)了圖像處理和計(jì)算機(jī)視覺方面的很多通用算法。OpenCV 擁有包括 300 多個(gè)C函數(shù)的跨平臺(tái)的中、高層 API。它不依賴于其它的外部庫——盡管也可以使用某些外部庫。OpenCV可用于開發(fā)實(shí)時(shí)的圖像處理、計(jì)算機(jī)視覺以及模式識(shí)別程序。

OpenCV的主要模塊不僅包括計(jì)算機(jī)視覺基礎(chǔ)算法的核心功能,還有圖像處理、食品分析、物體檢測(cè)、深度學(xué)習(xí)神經(jīng)網(wǎng)絡(luò)、機(jī)器學(xué)習(xí)、多維空間的聚類和搜索等等非常多的模塊,使用OpenCV完全可以實(shí)現(xiàn)OCR的一整套處理流程,但同時(shí)工作量也很大還需要自己去進(jìn)行分類器設(shè)計(jì)、訓(xùn)練和機(jī)器學(xué)習(xí)。那么有沒有可以直接用的訓(xùn)練好的識(shí)別庫呢?果然有,Tesseract。

OpenCV官網(wǎng) https://opencv.org

Tesseract

Tesseract是Ray Smith于1985到1995年間在惠普布里斯托實(shí)驗(yàn)室開發(fā)的一個(gè)OCR引擎,曾經(jīng)在1995 UNLV精確度測(cè)試中名列前茅。但1996年后基本停止了開發(fā)。2006年,Google邀請(qǐng)Smith加盟,重啟該項(xiàng)目。目前項(xiàng)目的許可證是Apache 2.0。該項(xiàng)目目前支持Windows、Linux和Mac OS 等主流平臺(tái)。但作為一個(gè)引擎,它只提供命令行工具。目前,Tesseract可以識(shí)別超過100種語言。也可以用來訓(xùn)練其它的語言。

經(jīng)過了解發(fā)現(xiàn)這是一個(gè)完整的OCR工具啊,能不能不用OpenCV然后完全使用OCR啊。理論上講是可以的,但是需要大數(shù)據(jù)、機(jī)器學(xué)習(xí)、深度學(xué)習(xí)相關(guān)的技術(shù),我們自己去定制訓(xùn)練相關(guān)場(chǎng)景的字庫,由于我們提供了更加詳細(xì)的場(chǎng)景和海量的數(shù)據(jù),這樣訓(xùn)練的結(jié)果還可以提高圖像的識(shí)別率。然而受限于知識(shí)技能。。 。

Tesseract Github地址 https://github.com/tesseract-ocr/tesseract

vin碼識(shí)別實(shí)踐

既然不會(huì)機(jī)器學(xué)習(xí)相關(guān)的知識(shí),那么最終我選擇了使用Tesseract自帶提供的英文字庫訓(xùn)練包來做文字識(shí)別,即實(shí)現(xiàn)OCR的特征提取和降維、分類器設(shè)計(jì)和訓(xùn)練、實(shí)際識(shí)別和后處理幾個(gè)步驟。使用OpenCV來進(jìn)行圖像預(yù)處理,對(duì)圖像灰度化、降噪、二值化等來為文字識(shí)別提供黑底白字干凈文字圖像。

OpenCV提供iOS框架,Tesseract也由一位國外開源作者封裝了iOS第三方庫,因此在工程的Podfile文件中引入:

pod 'OpenCV'
pod 'TesseractOCRiOS'   

就可以直接使用兩個(gè)庫了。

經(jīng)過一系列實(shí)踐調(diào)整之后,最終我將圖像處理劃分為了一下幾個(gè)步驟:

  • 圖像灰度化
  • 均衡直方圖
  • 高斯模糊去噪
  • 圖像二值化
  • 計(jì)算面積較小噪點(diǎn)閾值(噪點(diǎn)和文字的色度界限值),去除面積較小噪點(diǎn)
  • 計(jì)算面積較大干擾項(xiàng)特征值閾值(選擇寬高比、周長、面積作為特征),去除面積較大干擾項(xiàng)
  • 再一次高斯模糊去噪之后進(jìn)行邊緣檢測(cè),矯正圖像使文字出于水平位置
  • 經(jīng)過腐蝕、膨脹提取文字區(qū)域并進(jìn)行圖像裁剪,得到比較純的文字圖像
  • 將文字圖像輸入給Tesseract進(jìn)行文字識(shí)別

在文字處理過程中,干擾比較大的兩項(xiàng)就是計(jì)算面積較小噪點(diǎn)閾值和計(jì)算面積較大干擾項(xiàng)特征值閾值,因?yàn)檫@兩項(xiàng)是保證文字圖像干凈完整的關(guān)鍵步驟,計(jì)算值不準(zhǔn)確就會(huì)導(dǎo)致獲取的圖像不準(zhǔn)確,也就沒法進(jìn)行進(jìn)一步的文字識(shí)別。

計(jì)算面積較小噪點(diǎn)的閾值,我采用的是選取文字大致的連通域,并對(duì)連通域內(nèi)色度求取文字色度平均值,并擴(kuò)展為上限和下限。然后對(duì)每個(gè)像素求取周圍八個(gè)像素在界限內(nèi)的個(gè)數(shù),當(dāng)個(gè)數(shù)超出某個(gè)值的時(shí)候即視為噪點(diǎn),可以進(jìn)行該點(diǎn)像素的刪除。

計(jì)算面積較大干擾項(xiàng)的特征值閾值,主要選取了連通域矩形輪廓的寬高比、面積和周長三種特征,通過5張圖片的特征計(jì)算,求取了這些特征上限和下限,并引入了圖片拍攝距離的影響。最后對(duì)滿足特征的連通域輪廓再進(jìn)行數(shù)量統(tǒng)計(jì)、位置分析,選取位置最接近的17個(gè)連通域作為文字。如果這一步除了問題,那么獲取的17個(gè)文字中必然有錯(cuò)誤部分。

改進(jìn)方向:
1.使用大量圖片提取噪點(diǎn)篩選的特征值閾值,如此才能精準(zhǔn)處理圖片。
2.使用深度學(xué)習(xí)來訓(xùn)練文字庫,提高識(shí)別準(zhǔn)確率。

demo地址 https://github.com/Justin-ZhengYi/VINOCRDemo

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容