opencv自帶一個字符識別的例子,它的重點不是OCR字符識別,而主要是演示機器學(xué)習(xí)的應(yīng)用。它應(yīng)用的是UCI提供的字符數(shù)據(jù)(特征數(shù)據(jù))。 DAMILES在網(wǎng)上發(fā)布了一個應(yīng)用OpenCV進(jìn)行OCR的例子, http://blog./2008/11/basic-ocr-in-opencv/。 這些例子都只能用于學(xué)習(xí)OpenCV或熟悉OCR的簡單流程,因為它們與當(dāng)前比較專業(yè)的OCR引擎的識別率相去甚遠(yuǎn)。
這里寫下OpenCV下OCR的流程: 1. 特征提取 2. 訓(xùn)練 3. 識別
特征提取 1. 在圖像預(yù)處理后,提取出字符相關(guān)的ROI圖像,并且大小歸一化,整個圖像的像素值序列可以直接作為特征。damiles是直接將整個字符圖像轉(zhuǎn)換化為vector向量特征作為特征輸入的。
2. 但直接將整個圖像作為特征數(shù)據(jù)維度太高,計算量太大,所以也可以進(jìn)行一些降維處理,減少輸入的數(shù)據(jù)量。拿到字符的ROI圖像,二值化。將圖像分塊,然后統(tǒng)計每個小塊中非0像素的個數(shù),這樣就形成了一個較小的矩陣,這矩陣就是新的特征了。 UCI就是這么處理,詳見其說明http://archive.ics./ml/datasets/Optical+Recognition+of+Handwritten+Digits OpenCV中l(wèi)etter_recog例子就是使用的其特征數(shù)據(jù)。
訓(xùn)練與識別 訓(xùn)練與識別一般都采用同一種機器學(xué)習(xí)方法: DAMILES應(yīng)用了KNearest方法,對輸入數(shù)據(jù)進(jìn)行訓(xùn)練和識別。 1. 數(shù)據(jù)輸入: getData()函數(shù)中: 為trainData和trainClasses設(shè)置數(shù)據(jù)。
2. 初始化機器學(xué)習(xí)算法,及其訓(xùn)練 knn=new CvKNearest( trainData, trainClasses, 0, false, K ); trainData, trainClasses數(shù)據(jù)已得到。 而K是分類的數(shù)目。
訓(xùn)練在CvKNearest算法初始化中已經(jīng)完成
3. 識別 獲取識別測試的數(shù)據(jù),testData result=knn->find_nearest(testData,K,0,0,nearest,0); result為識別的結(jié)果。
而OpenCV自帶例子中,提供了boost,mlp,knearest,nbayes,svm,rtrees這些機器學(xué)習(xí)方法,進(jìn)行訓(xùn)練和識別。 處理的步驟和方式都類似。
這些例子的識別率不是很高,OCR識別率在90%以上才有較好的使用意義,所以,OCR還需要更多特征和分析方法,來提高識別率,tesseract是一個不錯的開源OCR引擎。
------------------- 在tesseract最初的字體庫里,一種字體的字符樣本庫包括:94個字符,8種大小,4種字體(正常,粗體,斜體,斜粗體),每種20個樣本,共60160個樣本。 與UIC提供的字體庫不同的是,tesseract提供的是標(biāo)準(zhǔn)印刷體字體庫的識別,而UIC提供是手寫體handwriting的特征數(shù)據(jù)。
數(shù)據(jù)之美提到,G公司(應(yīng)該就是google了)的研究結(jié)果表明,在自然語言與機器翻譯領(lǐng)域,簡單模型加上大量有效樣本數(shù)據(jù),比復(fù)雜模型加上小樣本數(shù)據(jù),有效的多。 這個結(jié)論應(yīng)該適用機器學(xué)習(xí)的很多領(lǐng)域。運算足夠快,樣本足夠大,即使簡單的模型,效果可能會出人意料。 由此可見,收集有效的、大量的樣本庫是多么的重要。 |
|