摘要:
本文首先介紹了OCR在教育領域的幾種典型應用方式,如拍照掃題、自動閱卷等,進而以其中一種應用方式為例展開,詳細闡述了圖像識別過程幾個階段的技術原理,隨之繼續深入分析了各種主流圖像識別方法,包括傳統方法以及基于深度學習的方法等,最后給出總結。通過閱讀本文,讀者能夠對OCR在教育領域的應用及其技術原理建立起一個較為詳盡的全面理解。
OCR( )即光學字符識別,指通過檢測圖像中的視覺特征,如暗、亮、形狀等,將圖像內容識別出來的技術。OCR從最早出現至今已有多年。OCR在教育領域有著廣泛的應用,其中不少目前已經較為普及化了。
OCR在教育領域的應用場景
1、 掃描并識別文字或字符,如拍照搜題。
這個應該很多朋友都有所了解了。學生做題時碰到不會的題時,可以對題目拍照并上傳,軟件后臺會對題目進行識別,在云端數據庫中進行比對,找到匹配題目,反饋答案及解析。
當然,題庫要足夠大。這種應用對學生和家長帶來了很大的幫助,大幅提升了便利度和學習效率。在識別效果的提供此功能的主要產品有猿題庫、學霸君、作業幫等。
2、自動閱卷或自動作業批改。
傳統閱卷或批改作業需要老師人力完成,比較耗時耗力。尤其是大量試卷的批閱,對人力的消耗非常大。自動批閱可以大量節省人力成本,且效率可以大大提高。其實現過程可以是試卷的批量掃描或學生將作業拍照上傳。
因為是整個試卷或一組試題,為了提高識別準確率,可以通過預先標準化紙質試卷和試題來提高識別精準性,一般情況下,需要按標準模板格式來設計試卷。這種模式本質上是過去的答題卡的升級應用,當前主要引用為客觀題居多。目前科大訊飛在這一塊有很多落地產品。
3、 紙質文檔轉化電子文檔。
在學習中若對課本及紙質書籍內的內容覺得重要,可以對其拍照,通過圖像識別,照片內容可以被轉化為word格式的文檔,使得之后的再編輯成為可能。同理,也可以直接轉化圖片格式的文檔。該轉化過程也可以批量化。
除了上述這些應用場景之外,我們還可以在身邊經常看到各種各樣其他應用場景。以下以拍照搜題為例,我們將講解各種主流OCR方法的技術步驟和原理。
圖像識別的技術原理
這部分將是本文重點講述的內容。
一般來講,圖像識別過程需要三個基本階段:
1、圖像預處理 ;2、字符提取;3、字符識別。
01
圖像預處理
我們手機拍的照片通常都會有各種各樣的問題,比如因為光線不足、鏡頭不好、對焦不好、拍攝角度等原因使得所獲取圖像質量參差不齊,因此識別能力受限,要對圖片進行預處理,使圖像能夠符合識別所需標準。
圖像預處理具體方法
灰度處理:去顏色信息
對于識別字符而言,顏色信息是無用信息。因為無論字符是什么顏色,字本身都是一樣的。所以為了簡化信息,我們要把顏色去掉。
幾何校正:糾正變形圖片
通常拍攝的圖片都不是絕對的水平,這會影響到后續環節對圖像的分割,調整圖片位置及形變,使之達到較佳的正視和水平狀態。
二值化:處理成黑白圖片
我們要將目標字符與背景及其它雜物進行區分。由于目標字符的灰度會與其它背景有差異,可以通過對灰度設定一個閾值,大于此值為目標字符,低于此值為其它物體及背景,這樣就可以分開了。
而且,灰度也是無用信息。我們并不需要漸變的灰度數值,我們只需要有字的地方是黑色,沒字的地方是白色,這就可以了。通過二值化,圖像可以在保留有用信息的基礎上,數據量大大減少。
去噪聲:去掉圖片的干擾雜項(noise)
因為圖片本身在拍攝及獲取過程中的質量問題無法保證,其圖像會含有各種各樣雜七雜八的無用信息,比如紙面上的雜點,痕跡,圖像噪點等等,需要將其去掉或降低。根據噪聲類別的不同,濾除噪聲的方法也有很多種,效果各不相同。
降噪的過程會損失圖像細節,因此要選擇合適的降噪方法,并根據圖像情況對其進行不斷優化。總的來說,這些算法都是通過利用圖像本身的某些性質或屬性來將噪聲與有用信息進行分離,常用的方法比如各種濾波器等。
02
字符提取
圖片初始化完畢,接下來就要切割劃分出字符塊。這里有各種各樣的方法,我們在這里講述常用的典型切割方法:使用聯通域及投影等方法將圖片根據文字進行橫向切割、垂直切割,形成字符塊。
比如橫向行切割:書籍的字跡一般是以一行一行的形式來排布的,每一行之間有一個行距,在這個行距范圍內沒有文字,行與行之間以一定寬度的空白來隔開。
也就是說,文字行的地方是有信息的,而留白的地方是沒信息的。我們如果把這些文字信息向Y軸上進行投影,那么寫有字的位置信息將會累加,得到較大的數值,而空白處因為沒有信息,其投影后數值為零。
因此我們就可以得到一組類似與鋸齒狀的離散數值,清晰的告訴我們橫向來看哪里是有文字的,哪里是留白。這樣我們就可以將文本行清晰的隔開。
再比如垂直向的列切割:橫切完了我們可以繼續進行縱切,從而進一步將單個字符隔開。其原理同橫切十分相似,也是通過投影疊加后根據數值進行切分,只不過這次是投影到X軸。
因為字與字之間的橫向間距較小,沒有行距那么大,因此整體的難度會更大,容易切割出錯。比如有的字是左邊一個偏旁,右邊一些筆畫,左右兩邊之間不相連且有一定空隙。當字與字間間隙較小并與此空隙寬度接近時,可能發生誤切割,將該字切成兩半。
因此我們可以使用一些手段嘗試進一步將其精準化,比如漢字的平均寬度一般是差不多的,我們可以預設一個寬度值。如果把一個字切成兩半,那么左右兩邊的寬度值都會很小,從而不符合預設寬度,因此不會造成誤識別。
03
字符識別
當字符圖像切好之后,我們可以進行識別。識別有很多方法,是本文介紹的重點。這里主要介紹三種方法:傳統方法、HOG+SVM方法、CNN方法。
傳統方法
為了能夠識別字符,我們必須預先擁有一系列的字符模板,也就是先要有標準答案,知道什么圖形對應的是什么字,然后將我們上面切割出來的字符通過一些算法與模板進行比對,確認是否是其中的某個字,如果與其中某個相符度甚高且明顯高于其他字,那么就將這個字符識別為該字。
因此,我們的模板庫要夠大夠全,比如要涵蓋全部的漢字和各種不同的字體。而且,這些模板也需要進行二值化,保留最核心的信息。
在進行識別之前,可以先將字符進行歸一化。簡單地說,就是我們把字符圖片統一調整寬高,讓所有的字符使用統一標準,同時與模板一致,以便后續比對。
在此之上,我們還可以記錄一些原始信息,比如原始寬高及其他信息,在某些錯判的情況下,可根據這些信息加以進一步區分。
接下來要做的是和字符模板的匹配。典型的經典算法如字符像素匹配。這個方法非常直觀,就是將待識別的字符與模板字符進行像素級比對。
模板和待識別字符都是0/1位圖,大小一致,直接將兩者比較,看看每個像素是否一樣,一樣就計一個數,最后將所有的數進行累加求和,再除以字符的總像素值,看看一致的比例有多少。
比如說算出來是90%,那么就說該待識別字符和該模板字符相似度達到90%。接下來我們再將待識別字符與模板庫中其他的字符進行比對,選擇其中最高的作為最優答案。
這種方法理解起來特別簡單,但對圖像質量要求高。要求待識別圖像和模板匹配度很高。若是圖像源較好,且預處理較好,匹配結果還可以。但是一旦圖像源差點,效果就差很多,魯棒性差。
在此算法基礎上,發展出了一系列各種各樣的算法,比如投影區塊匹配,將像素向橫縱兩個軸向投影求和,再通過一些類似求平均的比對計算求得結果。
這種方式因為有了類似平均的計算,其敏感性就要小一些,但是準確度也要弱點。除此之外,還有諸如將字符圖像先行切塊之后在比對等等方法。
總體來看,這一類算法普遍限制較多,精準度較低。比如,切分、二值化、人工特征等多個步驟的誤差累加導致整體誤差相對高。
HOG+ SVM方法
接下來要談的,是之前較長時間內主流的機器學習方法。典型如方向梯度直方圖(HOG)+ 支持向量機(SVM)。該方法能達到比上面的方法好得多的效果,得到普遍采用。這種方法相對來說要復雜很多,這里我嘗試簡單描述其原理:
方向梯度直方圖(HOG):
其目的是獲取圖像內的輪廓特征,并將其用后續識別算法能理解的方式表示出來,給到后續識別模型。這個特征我們用向量來表示。
輪廓我們用梯度計算來尋找。梯度是一個向量。若將圖像看做一個離散函數,梯度可視為對其求導,因此可以表征圖像的變化值。
比如,圖像某個位置有比較大的圖像變化,那么變化的邊緣處會有比較大的梯度值,而變化緩慢處的梯度值就較小。因此,梯度可以用來表征圖像中的形態輪廓。
HOG的基本邏輯是,首先,將圖像歸一化,計算圖像各像素點的梯度。然后將圖像劃分成多個小塊(cell),對每個cell按梯度方向劃分為多個角度,將cell中的像素的梯度值在其梯度方向上進行投影累加,獲得該cell的梯度直方圖,進而得到該cell的HOG特征向量。
接下來,可將幾個cell組成一個大一點的塊,稱為block。將block中各cell的特征向量串聯在一起,構成block的特征向量。將block對整個圖像進行滑動遍歷,可以得到整個圖像其它部分的特征向量。
將這些特征向量都串在一起,得到一個最終的整個圖像的特征向量,也就是將特征表示為一串數。到此為止,我們已經擁有了圖像的特征描述,接下來就是對其進行識別。
支持向量機(SVM):
所謂識別,其實就是分類。比如我們的庫里有6000個漢字,每個字作為一個類別,我們要識別該圖像是其中哪個字,就是將其識別為該類別。SVM就是一個分類器,是主流監督學習算法的一種。
其原理比較復雜,簡單描述如下:
SVM是做二分類,也就是區別兩組數據。換言之,就是如果有兩個備選字的話,svm可以告訴我們待識別的字符是其中哪個字。
比如,這兩組數據分布在一個XY平面上,因為兩組數各有不同規律,這兩組數在平面上會呈現出內部各數之間相隔較近,而和另一組數相隔較遠。那么我們就想在兩組數之間畫出一個空間將兩者分隔開,這樣就可以分開兩者了。
打個比方,有兩片樹林,一邊是桃樹,一邊是李樹,我們想在中間將兩者隔開,隔得越寬越好。我們首先要找到一條中間線,這條線是最好的分隔線。然后嘗試將這條線擴寬,拓寬成一條路,在保證路的邊緣盡量不要碰到樹林的前提下,盡可能將路拓寬。
如果路的邊沿超過了樹林,就可能無法準確分開兩邊,因此路的邊沿就由離路最近的那些樹來限定。我們能夠在兩片樹林間劃出不同方向的很多條路都可以將兩邊隔開,這個路就稱為決策面,路的邊沿是決策面的極限位置。我們希望找出其中最寬的那條路,這條路能夠最好的分開兩邊樹林。
也就是說,我們想找出最優的那個方向,使得我們在這個方向可以構造一條路,并且能將這個路建到最寬,可以最好地將兩片樹林隔開。找到能達到最大分類間隔的那個決策面,這就是SVM要做的事情。而這個面的邊沿上的樣本,也就是最靠路邊的樹,就是支持向量,因此叫做支持向量機。
前期,我們會使用大量數據去訓練這個SVM模型,讓它去做分類,根據分類結果告訴它是對還是錯,讓它不斷訓練,直到最后能夠做出比較準確的分類,然后拿去用測試數據進行測試,如果測試ok,我們就說這個模型可以用了。
我們只要把待識別圖像的HOG的特征向量導入該SVM模型,讓SVM去做分類,告訴我們這個字符是哪個字,就ok了。當然,svm只能做二分類,我們可以讓一個字作為一類,其它所有字作為另一類,使用一個分類器,
然后同理再將其它每個字都使用不同的分類器,最后將所有分類器的結果做一個組合,便可得到最終結果,大功告成。
這種方法識別效果不錯,長期作為OCR主流算法而存在。
CNN方法
最后,我們來看看利用深度神經網絡來做文字圖像識別。這也是相對非常復雜的技術。
深度神經網絡有很多種,圖像方面的識別主要使用的是卷積神經網絡(CNN)。相比標準神經網絡(DNN),卷積神經網絡對圖像的處理效率更高。
原因在于,一般圖像的像素數都很大,以像素來描述的特征其維度就會很高, 如果使用標準神經網絡的話,會讓網絡體積過于龐大,計算量過大。而卷積神經網絡可以很好的解決這個問題。
CNN的基本原理:
我們把圖像視為一個二維矩陣,同時,構造一個過濾器(又稱為核,一個小型矩陣),用這個過濾器和圖像矩陣做卷積計算,可獲得一個尺寸減小的新矩陣。
這里所謂的卷積計算,就是把過濾器矩陣與圖像中對應大小的矩陣進行元素相乘并加總,再遍歷整個圖像矩陣,獲得新矩陣的過程。卷積不僅僅能夠將矩陣簡化,通過合理構造過濾器中的數值,卷積計算還可以將圖像中的輪廓檢測出來。
有輪廓的地方,其數值變化會比較大,通過卷積計算后,這些位置的變化值會被凸顯表示出來。
因此,卷積計算能夠用來檢測形狀。在CNN模型的訓練中,反向傳播可以使得過濾器中的值逐漸被確定在最優水平,使其成為一個很好的輪廓檢測器。這么講可能會讓有的同學感到費解,可以嘗試這么理解:用一個長得比較方形的貪食蛇將圖像的每個位置都跑一遍,貪食蛇就可以對它走過的這些位置做一個計算,辨認出其中哪些地方是有輪廓的。
為了檢測多個圖像的特征,比如我們不僅要檢測橫向的輪廓,還要檢測縱向的輪廓,我們可以使用多個過濾器,每個過濾器用以檢測一個特征。
這樣,我們求得的新矩陣就會是一個多通道的,每個通道用以記錄一個新特征。然后,我們可以將這個新矩陣又再與新的過濾器進行第二次卷積計算,可以又得到下一層的多通道新矩陣,這個矩陣尺寸更小,但通道數可能更多。
通過重復這個步驟,在多層之后,我們將得到一個尺寸較小,但卻用多通道記錄了多個特征的矩陣(其實已經不能再叫矩陣了,應該叫一個)。這時我們可以再將這個最后的送進一系列類似標準神經網絡的全連接層bp神經網絡原理及其在字符 1 識別中的應用,得到圖像的最終特征向量。
將這個特征向量送入分類器如分類器,便可得到最終識別結果。這個過程,我們也可將其通俗理解為bp神經網絡原理及其在字符 1 識別中的應用,我們使用了多條貪食蛇反復跑了圖像n次,每條蛇每跑滿一次整個圖像可以得到一個特征,所有的蛇多次跑下來,我們就可以得到描述這個圖像的多個特征了,在通過分類器分類,我們便能識別字體圖像。
上面所述是CNN的基本工作形態,已涵蓋CNN的主要基本原理。實際上其中還有很多沒講到的點,比如池化層以及步長、填充等概念,這里就不再細講。
經典的CNN架構有、VGG、等等。這些架構實際上就是上面說的基本結構的各種組合和變形。實際使用中,CNN可以是各種各樣的架構,比如可以是在這些常用經典架構基礎上的延展和變體,以實際效果而定。
在實踐中,有時也會將CNN與SVM進行結合,比如用CNN得到最終圖像特征向量之后,不用,而使用SVM來進行分類,因此也可以利用到SVM的一些優點,理論上也能獲得不錯或可能更好的識別結果。
總結
目前,以CNN來對圖像進行識別越來越受歡迎。主要原因在于,在足夠算力和數據的前提下,利用深度神經網絡可以達到比HOG+SVM更加精準的識別結果。其實神經網絡也是傳統機器學習算法的一種,也主要做分類應用。
但是隨著算力算法的不斷發展,神經網絡層數逐漸能達到很深,因此被稱為深度神經網絡,也就是常說的深度學習。深度神經網絡最大的優勢是,當數據越來越海量的情況下,其它算法的精度一般沒有明顯提高,但深度神經網絡的精準度能夠不斷提升,超越其它算法。
深度神經網絡和支持向量機一樣,需要在使用前先訓練好。另外,理論上在數據足夠多足夠好,算力也足夠的情況下,深度學習可以直接很好的完成端到端的任務,不需要再涉及任何其它中間另外設計的計算方法和過程。
即使不能完全端到端,也可以減少很多中間過程。比如,文字的切割和提取過程可以嘗試用循環神經網絡(RNN)來直接完成,效率更高,效果更佳。由于能力強且泛化性好,深度神經網絡得以在各個領域得到廣泛使用。
至此,我們已了解了當前主流的各種圖像識別算法。通過這些方法將字符圖像識別出來后,后續在通過NLP模塊進行一定語意理解,去庫里尋找答案,便可完成拍照搜題的整個過程。
當然,這里介紹的算法不僅可以用在拍照搜題當中,也可以用到各種其他類似領域,比如車牌識別,以及行人檢測等各種圖像識別場景。
圖像識別算法時至今日,比過去已有了長足進步,大量的各種商用已充分證明了其價值。當然,技術本身還有很多需要繼續提高的,比如對大篇幅手寫漢字的識別精準度還有待進一步提高。這里最核心的原因在于手寫文本訓練數據的不足。
而數據不足的原因一是由于沒有任何兩個人的字體是完全一樣,手寫體呈現出千差萬別的形態;二是本身漢字的復雜度就比較高,多字組合后復雜度更高得多。
因此樣本特征的學習和訓練難度就增加不少,對訓練數據的要求也就增加很多。目前研究人員主要嘗試人工生成大量偽樣本用以擴充數據,以及與傳統模式進行結合,如構造人工特征等,同時繼續不斷改進算法。
當這一領域發展到識別精度足夠高時,新的toC強市場需求痛點又將會被開啟,就像當年拍照搜題一樣,新的巨大市場機會又將會出現。