docker中基於centos7.3搭建tesseract5訓練環境以及進行訓練


1. 准備資料:

(1) https://github.com/tesseract-ocr/tesseract 項目,到linux中安裝

==這一步可以理解linux為安裝tesseract5環境,這里直接用安裝tesseract的鏡像啟動之后測試。

關於鏡像安裝tesseract參考https://www.cnblogs.com/qlqwjy/p/13028194.html

這里我把centos升級為8.也就是tesseract環境部署在centos8,我一開始用的centos7.3,會報錯ICU版本過低。下面的安裝也是在centos8鏡像中。

 

啟動鏡像並且進入容器查看內核和發行版:

[root@0f76915a8f71 ocrtemplate]# uname -a
Linux 0f76915a8f71 4.14.154-boot2docker #1 SMP Thu Nov 14 19:19:08 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux
[root@0f76915a8f71 ocrtemplate]# cat /etc/redhat-release
CentOS Linux release 8.1.1911 (Core)

 

(2) 訓練的字體庫,以黑體字體庫為例,需要字體庫simhei.ttf。
linux下面:
列出已安裝字體文件fc-list
列出中文字體文件fc-list :lang=zh
Windows的目錄C:\Windows\Fonts\simhei.ttf 拷貝到linux的目錄:/usr/share/fonts/zh

 

fc-list不是命令需要安裝一下:

yum install -y fontconfig mkfontscale

字體上傳之后如下:

[root@f7744ac1467d zh]# fc-list :lang=zh
/usr/share/fonts/zh/SIMHEI.TTF: SimHei:style=Normal

 

(3) langdata_lstm項目克隆到本地:
https://github.com/tesseract-ocr/langdata_lstm

也可以只下載chi_sim目錄與eng目錄外加下面五個文件:
common.punc
font_properties
Latin.unicharset
Latin.xheights
radical-stroke.txt

  tessdata官方訓練好的字庫,這里我們訓練的是中文,所以去下載chi_sim.traineddata以及eng.traineddata,eng.traineddata是必須的。

  用的時候我們可以用fast版本字體庫,但是訓練時的版本必須用best版本的字體庫。

字體庫下載地址:

https://github.com/tesseract-ocr/tessdata_best
https://github.com/tesseract-ocr/tessdata_fast

 

(4)安裝需要的依賴庫:

參考文檔:https://tesseract-ocr.github.io/tessdoc/Compiling.html#linux

 

 第一步:查看以及安裝cairo

[root@0f76915a8f71 zh]# yum list cairo
Last metadata expiration check: 0:45:55 ago on Thu 04 Jun 2020 10:05:43 AM UTC.
Available Packages
cairo.i686                                  1.15.12-3.el8                                 AppStream
cairo.x86_64                                1.15.12-3.el8                                 AppStream
[root@0f76915a8f71 zh]# yum install cairo.i686

 

第二步:查看以及安裝pango(安裝pango的時候也需要安裝pango-devel)

[root@0f76915a8f71 zh]# yum list pango
Last metadata expiration check: 0:48:03 ago on Thu 04 Jun 2020 10:05:43 AM UTC.
Available Packages
pango.i686                                   1.42.4-6.el8                                 AppStream
pango.x86_64                                 1.42.4-6.el8                                 AppStream
[root@0f76915a8f71 zh]# yum install pango.i686

 

第三步:查看以及安裝icu:

[root@0f76915a8f71 zh]# yum list icu
Last metadata expiration check: 0:49:26 ago on Thu 04 Jun 2020 10:05:43 AM UTC.
Available Packages
icu.x86_64                                   60.3-2.el8_1                                    BaseOS
[root@0f76915a8f71 zh]# yum install icu.x86_64

第四步:安裝如下依賴

yum install asciidoc.noarch

 

libicu-devel.x86_64

 

yum install libtiff

 

yum install pango-devel.x86_64

(5)重新進入tesseract-master進入安裝:

cd /opt/tesseract/tesseract-master

 第一步:

./autogen.sh

第二步:

./configure

這一步configure完成會出現提示安裝Trainging Tools:(中間如果缺少哪個依賴會在checking for 的時候提示)

checking for off_t... yes
checking for mbstate_t... yes
checking for pkg-config... /usr/bin/pkg-config
checking pkg-config is at least version 0.9.0... yes
checking for libcurl... no
checking for LEPTONICA... yes
checking for libarchive... no
checking for ICU_UC... yes
checking for ICU_I18N... yes
checking for pango... yes
checking for cairo... yes
checking for pangocairo... yes
checking for pangoft2... yes
checking that generated files are newer than configure... done
configure: creating ./config.status
config.status: creating include/tesseract/version.h
config.status: creating Makefile
config.status: creating tesseract.pc
config.status: creating tessdata/Makefile
config.status: creating tessdata/configs/Makefile
config.status: creating tessdata/tessconfigs/Makefile
config.status: creating unittest/Makefile
config.status: creating java/Makefile
config.status: creating java/com/Makefile
config.status: creating java/com/google/Makefile
config.status: creating java/com/google/scrollview/Makefile
config.status: creating java/com/google/scrollview/events/Makefile
config.status: creating java/com/google/scrollview/ui/Makefile
config.status: creating doc/Makefile
config.status: creating src/training/Makefile
config.status: creating config_auto.h
config.status: executing depfiles commands
config.status: executing libtool commands

Configuration is done.
You can now build and install tesseract by running:

$ make
$ sudo make install
$ sudo ldconfig

Documentation will not be built because asciidoc or xsltproc is missing.

Training tools can be built and installed with:

$ make training
$ sudo make training-install

第三步:執行安裝訓練環境

make training
make training-install

 

第四步:執行text2image測試

[root@0f76915a8f71 tesseract-master]# text2image -v
Using CAIRO_FONT_TYPE_FT.
Pango version: 1.42.3
5.0.0-alpha

 

2.開始訓練

1. 生成待訓練數據(官方 best版本的chi_sim 中文字庫訓練樣本為 12MB 左右的文本,全部生成圖片的話會過大,所以這里指定最多生成 5 頁文字)

(1)best版本的traineddata移動到/usr/local/share/tessdata/ 目錄,eng必須存在。而且必須用best版本

(2)生成待訓練數據(官方 langdata 中中文字庫訓練樣本為 25MB 左右的文本,全部生成圖片的話會過大,所以這里指定最多生成 5 頁文字)

  1700頁以后報錯,沒有找到原因,所以每次提取我最多到1700頁。而且/usr/local/share/tessdata下面的chi_sim.traineddata一定是best版本的。

/opt/tesseract/tesseract-master/src/training/tesstrain.sh \
  --fonts_dir /usr/share/fonts/zh \
  --lang chi_sim --linedata_only   \
  --noextract_font_properties \
  --langdata_dir /opt/tesstrain/langdata_lstm   \
  --tessdata_dir /usr/local/share/tessdata   \
  --save_box_tiff --maxpages 5  \
  --fontlist "SimHei" \
  --output_dir /opt/tesstrain/imgs

參數解釋:

 --exposures EXPOSURES      # A list of exposure levels to use (e.g. "-1 0 1").
 --fontlist FONTS           # A list of fontnames to train on.
 --fonts_dir FONTS_PATH     # Path to font files.
 --lang LANG_CODE           # ISO 639 code.
 --langdata_dir DATADIR     # Path to tesseract/training/langdata directory.
 --linedata_only            # Only generate training data for lstmtraining.
 --output_dir OUTPUTDIR     # Location of output traineddata file.
 --overwrite                # Safe to overwrite files in output_dir.
 --run_shape_clustering     # Run shape clustering (use for Indic langs).
 --maxpages                 # Specify maximum pages to output (default:0=all)
 --save_box_tiff            # Save box/tiff pairs along with lstmf files.
 --xsize                    # Specify width of output image (default:3600)  

解釋:這一步操作,實際上是利用 text2image 將要訓練的樣本文字轉換為 tif 圖片,生成的圖片中的文字都是校正好的,可以自己打開看一下。這樣一來,我們知道生成的圖片對應的正確文字,我們就可以拿來與官方現有訓練好的數據進行評估。即:用官方現有的訓練字庫來識別生成的圖片,將識別結果,與我們生成時已知的文字進行對比,就能知道當前訓練庫對於當前字體的識別率了,當然,這不需要我們自己手動去識別比對計算識別率了,有專門的工具。  

生成的訓練文件都在/opt/tesstrain/imgs目錄下。提取的文件列表如下:

[root@0f76915a8f71 imgs]# ls -l
total 4492
drwxr-x--- 2 root root    4096 Jun  5 01:50 chi_sim
-rw-r--r-- 1 root root  481134 Jun  5 01:50 chi_sim.SimHei.exp0.box
-rw-r--r-- 1 root root 3062484 Jun  5 01:50 chi_sim.SimHei.exp0.lstmf
-rw-r--r-- 1 root root 1041136 Jun  5 01:50 chi_sim.SimHei.exp0.tif
-rw-r--r-- 1 root root      46 Jun  5 01:50 chi_sim.training_files.txt

 

2. 提取 chi_sim.lstm 文件: 

[root@0f76915a8f71 imgs]# combine_tessdata -e /usr/local/share/tessdata/chi_sim.traineddata /opt/tesstrain/chi_sim.lstm
Extracting tessdata components from /usr/local/share/tessdata/chi_sim.traineddata
Wrote /opt/tesstrain/chi_sim.lstm
Version string:4.00.00alpha:chi_sim:synth20170629:[1,48,0,1Ct3,3,16Mp3,3Lfys64Lfx96Lrx96Lfx512O1c1]
0:config:size=89, offset=192
17:lstm:size=1546461, offset=281
18:lstm-punc-dawg:size=282, offset=1546742
19:lstm-word-dawg:size=590634, offset=1547024
20:lstm-number-dawg:size=82, offset=2137658
21:lstm-unicharset:size=258834, offset=2137740
22:lstm-recoder:size=72494, offset=2396574
23:version:size=84, offset=2469068

 

3.用提取的lstm文件進行評估:

lstmeval --model /opt/tesstrain/chi_sim.lstm \
 --traineddata /usr/local/share/tessdata/chi_sim.traineddata \
 --eval_listfile /opt/tesstrain/imgs/chi_sim.training_files.txt

 上面的評估過程可以省略,只是用來查看當前的識別精度而已,不執行也行。

 

4.開始訓練

 OMP_THREAD_LIMIT=8 lstmtraining --model_output /opt/tesstrain/simhei \
  --continue_from /opt/tesstrain/chi_sim.lstm \
  --traineddata /usr/local/share/tessdata/chi_sim.traineddata \
  --train_listfile /opt/tesstrain/imgs/chi_sim.training_files.txt \
  --max_iterations 5

    continue_from參數,該參數指定了從前面提取出來的神經網絡,也就是在現有的訓練字庫基礎上進行訓練,不僅僅可以是.lstm文件,也可以是chexbox文件,chexbox是訓練生成的文件,比如上面的命令,訓練輸出文件夾~/tesstutorial/output/simhei就會生成chexbox文件。
  如果訓練指定次數后結果還不滿意,可以繼續訓練,這時可以重復執行上面命令,如果chi_sim.lstm不小心刪除了,可以指定--continue_from改成~/tesstutorial/output/simhei中的checkbox文件,需要注意的是,-max_iterations需要比上一次大,因為它是接着之前的訓練結果開始訓練的。

 

==========訓練結果格式如下:=======================
At iteration 14615/695400/698614, Mean rms=0.158%, delta=0.295%, char train=1.882%, word train=2.285%, skip ratio=0.4%,  wrote checkpoint.
14615: learning_iteration 學習迭代
695400: training_iteration    訓練迭代
698614: sample_iteration    樣本迭代次數

learning_iteration :
    “Number of iterations that yielded a non-zero delta error and thus provided significant learning. (learning_iteration <= training_iteration). learning_iteration_ is used to measure rate of learning progress.” So it uses the delta value to assess it the iteration has been useful.
    “產生非零delta誤差從而提供重要學習的迭代次數。(學習迭代<=訓練迭代)。“學習迭代”是用來衡量學習進度的,“所以它使用delta值來評估它,迭代是有用的
training_iteration 
    “Number of actual backward training steps used.” It is how many times a training file has been SUCCESSFULLY passed into the learning process. So every time you get an error : “Image too large to learn!!” - “Encoding of string failed!” - “Deserialize header failed”, the sample_iteration increments but not the training_iteration. Actually you have 1 - (695400 / 698614) = 0.4% which is the skip ratio : proportion of files that have been skipped because of an error
    “實際使用的反向培訓步驟數”。這是一個訓練文件成功傳遞到學習過程中的次數。所以每次你得到一個錯誤:“圖像太大,無法學習!!字符串的“-”編碼失敗!“-”反序列化頭失敗“,示例迭代遞增,但不是訓練迭代。實際上,您有1-(695400/698614)=0.4%,這是跳過率:由於錯誤而被跳過的文件的比例
sample_iteration :
    “Index into training sample set. (sample_iteration >= training_iteration).” It is how many times a training file has been passed into the learning process.
    “索引到訓練樣本集中。(sample_iteration>=training_iteration)。“這是一個訓練文件傳遞到學習過程中的次數。
                                
skip ratio:由於錯誤而被跳過的文件
    1-(training_iteration/sample_iteration) = 1- (695400 / 698614) = 0.4%

 

5.合並訓練結果:

lstmtraining --stop_training \
  --continue_from /opt/tesstrain/simhei_checkpoint \
  --traineddata /usr/local/share/tessdata/chi_sim.traineddata \
  --model_output /usr/local/share/tessdata/chi_sim_simhei.traineddata

  最終生成我們訓練好的chi_sim_simhei.traineddata文件。

  如果想像官方那樣生成fast版本,可用如下命令將chi_sim_simhei.traineddata轉成fast版本:

combine_tessdata -c chi_sim_simhei.traineddata

 

再次查看語言列表:

[root@0f76915a8f71 tessdata_best-master]# tesseract --list-langs                                   List of available languages (5):
chi_sim
chi_sim_fast
chi_sim_simhei
eng
eng_fast

 

6.測試:

#只指定語言。指定語言需要用到chi_sim_vert.traineddata
tesseract ./normal.png chi_sim__simhei_result -l chi_sim_simhei
tesseract ./normal.png chi_sim__simhei_result -l chi_sim -c preserve_interword_spaces=1
tesseract ./normal.png chi_sim__simhei_result -l chi_sim -c preserve_interword_spaces=1 --dpi 300
tesseract ./normal.png chi_sim__simhei_result -l chi_sim -c preserve_interword_spaces=1 --dpi 300 --oem 1

# 指定 --psm 1 需要用到 osd.traineddata
tesseract ./normal.png chi_sim__simhei_result -l chi_sim -c preserve_interword_spaces=1 --dpi 300 --oem 1 --psm 1

 

3.容器commit為鏡像

Administrator@MicroWin10-1535 MINGW64 /e/tesseractTrain/docker制作tesseract5Train鏡像
$ docker ps -a
CONTAINER ID        IMAGE                                COMMAND             CREATED             STATUS              PORTS               NAMES
0f76915a8f71        daocloud.io/library/centos:centos8   "/bin/bash"         16 hours ago        Up 16 hours                             friendly_cannon

Administrator@MicroWin10-1535 MINGW64 /e/tesseractTrain/docker制作tesseract5Train鏡像
$ docker commit 0f76915a8f71 tesseracttraining  #容器導出為鏡像
sha256:0c80e881e0d2ba32ff930d2d6ec2645b9d2414c8d4c744e9efacf5be35c5f37a

Administrator@MicroWin10-1535 MINGW64 /e/tesseractTrain/docker制作tesseract5Train鏡像
$ docker images | grep training
tesseracttraining                                                      latest               0c80e881e0d2        28 seconds ago      2.15GB

 

4.鏡像save為tar包便於遷移

docker save -o tesseracttraining.tar tesseracttraining

  接下來tar包可以隨便遷移,離線安裝。

  當然可以提交到鏡像倉庫。

 

補充:如果yum源上述命令沒有的話需要修改yum源為阿里:果yum源上述命令沒有的話需要修改yum源為阿里:

(1)備份:
mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup 
(2)下載新的CentOS-Base.repo 到/etc/yum.repos.d/
CentOS 6
curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-6.repo
 
CentOS 7
curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
 
CentOS 8
curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-8.rep
(3)清除緩存,重新生成緩存 
清除緩存
yum clean all

重新設置緩存
yum makecache

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM