EVN: Ubuntu16.04
1.安装 tessract-orc
1.1.tesseract-ocr安装 ( 默认安装路径:/usr/share/tesseract-ocr/4.00/tessdata)
sudo add-apt-repository ppa:alex-p/tesseract-ocr
sudo apt-get update
sudo apt-get install tesseract-ocr
sudo apt-get install tesseract-ocr-eng tesseract-ocr-chi-sim tesseract-ocr-equ
1.3.下载:jTessBoxEditorFX
jTessBoxEditor2.0工具,用于调整图片上文字的内容和位置,
下载地址:https://sourceforge.net/projects/vietocr/files/jTessBoxEditor/
安装包解压后“ java -jar jTessBoxEditor.jar”,或者双击该目录下的“train.bat”脚本文件,就可以打开该工具了。
2.准备训练数(自己准备多一些)
3.将图片转为TIF格式 (点击tools->Merge Tiff)
为了进行后续的操作,合并后的文件名需要按照一定的规则来命令:
[lang].[fontname].exp[num].tif
其中:
- lang表示语言名称;
- fontname表示字体名称;
- num表示序号
在这里,我们将TIF的文件名保存为了:cqc.font.exp0.tif
4、生成TIF图片的box盒子文件
生成box盒子文件是为了标识出图片中文字的具体位置。如果要训练进行训练,我们必须得准备tif/box这一文件对。在此,我们通过Tesseract的makebox命令来生成box盒子文件,其命令为
tesseract cqc.font.exp0.tif cqc.font.exp0 -l chi_sim batch.nochop makebox
在命令行中运行此命令,我们将会得到一个和TIF文件同名的box文件:cqc.font.exp0.box
补充和修正box盒子文件
Tesseract4.0与之前版本对于box盒子文件要求的区别在于,在Tesseract4.0中,不再要求box盒子文件中对文本的框选精确到单个字符,只需要将框的位置覆盖到一行文本即可。
但是为了便于训练,我们还是选择对单个字符进行框选。同时,makebox命令生成的box盒子文件不一定是完全无误的,有一些图片可能就没有识别出盒子框来,而jTessBoxEditor这个软件只能对已存在的box信息进行处理,没有办法在缺失box信息的图片上新增box。
5、调整 box盒子文件
打开之前的JTessBoxEdit软件, 点击“Box Editor”选项卡,open 加载TIF文件对box进行修改(box文件和tif文件需要在同一个文件夹下):
图片上面一共有5列,分别为:字符名称、X轴坐标、Y轴坐标、字符宽度、字符高度,点击可以调整,
操作完,记得点击save
box修改好之后。我们就可以进行下一步了。
6、生成lstmf文件
这一步,我们通过TIF图像文件和box盒子文件生成进行LSTM训练所需的lstmf文件,使用到的命令如下所示:
tesseract cqc.font.exp0.tif cqc.font.exp0 -l chi_sim --psm 6 lstm.train
运行之后,我们的文件夹下会生成一个名为cqc.font.exp0.lstmf的文件。
7、提取语言的LSTM文件
接着从tesseract_best(https://github.com/tesseract-ocr/tessdata_best)下载相应语言的traineddata文件。
这里选择chi_sim.traineddata文件。 (必须是在这下载来的,不要用安装时的,否则报错)
下载好之后,我们需要从中提取中它的LSTM文件,使用的命令如下所示:
(此处可以使用之前已有的chi_sim.traineddata提取 chi_sim.lstm,训练时指定用这个,最后合并是tarineddata 也用之前的chi_sim.traineddata,这样合并后的数据会有原有的基因,并且原始基因影响最小)
combine_tessdata -e chi_sim.traineddata chi_sim.lstm
运行上述命令,我们的文件夹下会生成一个名为chi_sim.lstm的文件。
新建一个名为chi_sim.training_files.txt的文本文件,在里面填入 第六步 生成的cqc.font.exp0.lstmf文件的绝对路径。
8、训练
使用下面的命令就可以开始训练:
lstmtraining \ --model_output="/home/sea/Desktop/orc/output/output" \ --continue_from="/home/sea/Desktop/orc/train/chi_sim.lstm" \ --train_listfile="/home/sea/Desktop/orc/chi_sim.training_files.txt" \ --traineddata="/home/sea/Desktop/orc/train/chi_sim.traineddata" \ --debug_interval -1 \ --max_iterations 4000
说明:
--modeloutput 模型训练输出的路径(新建了一个名为output的文件夹用来存输出的文件) --continue_from 训练从哪里继续(从tesseract_best下载的.traineddata,提取语言的LSTM文件)(建议用已有的data,提取lstm) --train_listfile 指定上一步创建的文件的路径(里面包含训练图片生成lstmf文件的绝对路径) --traineddata 必须tesseract_best下载的.traineddata文件的路径 (chi_sim.traineddata) --debug_interval 当值为-1时,训练结束,会显示训练的一些结果参数 --max_iterations 指明训练遍历次数
训练结束后,在output文件夹中会生成一个 output_checkpoint 文件和多个类似output0.012_3.checkpoint的.checkpoint文件
9、合并数据
我们接着使用命令把这些文件和之前的eng.traineddata合成为新的traineddata文件,使用命令如下:
lstmtraining \ --stop_training \ --continue_from="/home/sea/Desktop/orc/output/output_checkpoint" \ --traineddata="/home/sea/Desktop/orc/train/chi_sim.traineddata" \ --model_output="/home/sea/Desktop/orc/sea.traineddata"
各个参数的意义: --stop_training 默认必须有 --continue_from 上一步生成的output_checkpoint文件路径 --traineddata 从tesseract_best下载的chi_sim.traineddata文件的路径 (建议直接使用之前已有的数据,这样新数据会保留之前的基因) --model_output sea.traineddata 输出的路径 (名字可以随意修改,)
10、测试:
拷贝数据 /home/sea/Desktop/orc/sea.traineddata 到 /usr/share/tesseract-ocr/4.00/tessdata/下
img = Image.open("/home/sea/Desktop/orc/2.png") # tess_data_dir_conf = '--tessdata-dir "/home/sea/tesseract-ocr/tessdata-main"' # pytesseract.pytesseract.tesseract_cmd = "/usr/bin/tesseract" # text = pytesseract.image_to_string(img, config=tess_data_dir_conf, lang="chi_sim") text = pytesseract.image_to_string(img, lang="sea") print(text)