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