深入學習Tesseract-ocr識別中文并訓練字庫的方法

深入學習Tesseract-ocr識別中文并訓練字庫的方法

這是我轉載保存學習用的

上篇文章簡單的學習了tesseract-ocr識別圖片中的英文(鏈接地址如下:https://www.cnblogs.com/wj-1314/p/9428909.html),看起來效果還不錯,所以這篇文章繼續深入學習tesseract-ocr識別圖片中的中文。

一,準備中文字庫

下載chi_sim.traindata字庫。要有這個才能識別中文。下好后,放到Tesseract-OCR項目的tessdata文件夾里面。(注意下載字庫,一定要看庫對應的tesseract版本下載)

為什么強調版本呢 ,小編這里講自己做的愚蠢的事情附上,希望大家別入坑了。

 ? ?上一篇學習Tesseract-ocr中,識別的是英文,然后小編下載了中文庫,如下

  不知道是什么原因,總是報錯。報錯如下:

  我找了多種方法,包括重新安裝庫,配置環境變量,仍然沒有解決問題,所以在這里,我又考慮到Tesseract的版本問題,所以打算重新最新版 w64-v4.0.0,繼續試試。附上下載鏈接地址

下載Tesseract的地址:https://digi.bib.uni-mannheim.de/tesseract/

下載Tesseract-ocr包的地址:https://github.com/tesseract-ocr/tesseract/wiki/Data-Files

下載Tesseract的Git地址:https://github.com/tesseract-ocr/tesseract/wiki

?  經過一天的折騰,在tesseract的GitHub中,我偶然發現了問題的所在,可以說自己是非常的蠢,請看下圖

也就是不同的版本,安裝的中文包是不同的,而我亂安裝了包,所以一直報錯,還沒有解決問題,下次一定不能這么粗心。

二,準備訓練字庫

下載jTessBoxEditor,這個是用來訓練字庫的。


  以上的在百度都能找到下載,就不詳細講了(要是找不到的,可以留言給我),下載好之后就是這樣的。

三,下載Java虛擬機(Java大法好啊)

  如果你剛剛接觸Java語言,并且對它興趣很大,想繼續研究。那么這節就來給你說說怎么安裝Java工具JDK,它是你進行Java的第一步。

首先你要下載Java的JDK(JDK的全稱是:Java ?Development Kit即Java語言軟件工具開發包),目前最新的JDK版本是1.8,Java最初是SUN公司,因后來被oracle公司收購,故你需要到oracle官網上下載JDK網址是:http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html。輸入這個網址你就可以看到下面圖片

  其中圖片中現實的上面是oracle公司提供的Java JDK,上面有兩個按鈕,默認是不接受License,你需要接受以后就可以下載Java的JDK,這里你需要根據自己電腦的類型,以及操作系統的位數,下載對應的JDK。下面的一個是oracle公司對JDK提供的demos和Samples即簡單的例子,可以供我們學習,感興趣的可以下載下來學習。

? ? ? ?這里我選擇下載JDK的Windows的64位JDK,下面圖片是下載的JDK的安裝包。

? 雙擊JDK安裝包,點擊下一步。

?  這里選擇不安裝公共JRE,因為公共JRE是一個獨立的JRE系統,它是單獨的安裝在windows系統下的其他路徑下。公用的JRE會向瀏覽器和系統中注冊Java運行時的環境。通過向瀏覽器和系統中注冊運行時的環境,系統中的任何應用程序都可以使用公用JRE。但是現在在瀏覽器網頁上執行applet的機會幾乎沒有,并且JDK目錄下JRE完全可以勝任,所以一般選擇不安裝公用JRE。這里如果你不想安裝在默認路徑下,可以選擇更改目錄。

    單擊下一步,會出現如下安裝條。

?  輸入Java -version可以查看自己的Java版本。這樣你的JDK就安裝成功了。


四,識別中文效果

?1,隨便制作一張有漢字的圖片,小編做的圖片如下:

2,使用中文字庫訓練,程序如下:

1

2

3

4

5

6

7

8

9

10

11

12

import pytesseract

from?PIL import Image


#打開驗證碼圖片

image = Image.open('07.jpg')

#加載一下圖片防止報錯,此處可以省略

image.load()

#調用show來展示圖片,調試用此處可以省略

image.show()

text = pytesseract.image_to_string(Image.open('07.jpg'),lang ='chi_sim')


print(text)

3,使用中文字庫訓練的結果如下:

?  從結果來看,效果不太理想,所以我們要想得到更好的結果,那么就需要訓練自己的字庫,下面小編開始訓練自己的字庫。

五,訓練自己的文庫

1、將圖片轉換成tif格式,用于后面生成box文件。可以通過畫圖,然后另存為tif即可

  更改圖片名字,這個是有要求的

1

2

3

4

5

6

7

tif文面命名格式[lang].[fontname].exp[num].tif


lang是語言?????????? fontname是字體


比如我們要訓練自定義字庫myfontlab????? 字體名normal


那么我們把圖片文件重命名 myfontlab.normal.exp0.jpg在轉tif。

2、生成box文件

1tesseract myfontlab.normal.exp0.jpg myfontlab.normal.exp0 -l chi_sim batch.nochop makebox

 box文件和對應的tif一定要在相同的目錄下,不然后面打不開。

3、打開jTessBoxEditor矯正錯誤并訓練

打開train.bat

  用jTessBoxEditor.jar打開tif文件,然后根據實際情況修改box文件?


找到tif圖,打開,并校正。

4、訓練,生成.tr文件。

  只要在命令行輸入命令即可。

1tesseract? myfontlab.normal.exp07.jpg? myfontlab.normal.exp07? nobatch box.train

?  生成一個unicharset文件

1unicharset_extractor myfontlab.normal.exp07.box


  在這我明明已經矯正好了,但是還是有1個字符不能識別出來,報的錯跟實際上完全沒有相關性,不知道是不是bug,到后面的結果就是“一”字沒有識別出來。


5,新建一個font_properties文件

1里面內容寫入 normal 0 0 0 0 0 表示默認普通字體

  運行命令

1shapeclustering -F font_properties.txt -U unicharset myfontlab.normal.exp07.tr


1mftraining -F font_properties.txt -U unicharset -O unicharset myfontlab.normal.exp07.tr


1cntraining myfontlab.normal.exp07.tr

?  目錄下會生成對應下列五個文件,在這五個文件前加上normal.進行重命名

6 執行 combine_tessdata normal. ?

  合并五個文件,此時目錄下的normal.traineddata 就是訓練好的字庫文件

1combine_tessdata normal.

  得到訓練好的字庫如下:

六? 測試字庫

1,把normal.traineddata ?復制到Tesseract-OCRt程序目錄下的“tessdata”目錄,

2,在Tesseract-OCRt程序目錄下執行?

1tesseract.exe myfontlab.normal.exp07.jpg?out?–l normal


  下面文件中會保存你識別到的數據;

  這個其實網上資料很多,但大都描述的不夠詳細和完整,這里我一步一步把使用tesseract-ocr 訓練字庫的方法和步驟進行了描述,親測是沒有問題。


七,如何通過jTessBoxEditor進行Tesseract3.02.02樣本訓練

  Tesseract生成.box文件后,需要用到jTessBoxEditor工具對其進行糾正,以下是jTessBoxEditor的使用步驟。

1? 加載要糾正的.tif文件

  box文件的內容也同時會加載到jTessBoxEditor,如果這部分的內容為空,則是沒有生成.box文件的!如下圖:

2? 加載步驟如下:

  此處借用的是網友的圖片,方便,如有侵權,請聯系小編及時刪除。

3? 矯正文字

  當一個字被識別為兩個時,按住Ctrl鍵選中兩個,然后點擊Merge,即可進行合并!

  進行矯正 主要就是坐標 位置的調整,注意 添加需要選擇上一個文字才能分離

4.刪除空白的方法

  有些空白處可能也會被jTessBoxEditor誤認為是字體,用藍色框框住,

  這個可以直接選中,delete掉就好了!

5.總結

  正常情況下是每個字體都會有藍色框框住,如果說有其中的兩個相鄰的字都沒有被框住,這時候即使采用insert后加上藍色框,但是最后識別還是有問題,這個不懂是不是我操作不對! 最后發現原來是兩個字體挨的太近的,導致區別不開了,在老大的建議下,把兩個字的距離隔開點來,就可以正常的框出來了!(如果有更好的方法,請指出,謝謝)

  修改完成后保存即可!這里我是一張張樣本圖片進行修改的,但是我這樣做每張都有做同樣的糾正,不知道有沒有批量修改的方法呢?

  在對圖片進行訓練之前,最好先用Opencv進行下處理,比如說二值化,這樣就可以去掉一些干擾!但是要注意的是在識別之前同樣的也對圖片先進行相同效果的處理!這樣的識別率會有所提高!

八? 軟件設置字體的方法

  在setting>font 設置中文字體



不經一番徹骨寒 怎得梅花撲鼻香

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容