最近将族谱数字化,需要用到OCR软件。选择了Tesseract,但是官网的指南不是很亲切,所以记录了一些要点和脚本。
要点
- 族谱通常是竖向编排的,所以psm(页面分割模式)选项要用5。
- 合并多图,要先将图单独转换成tif格式,再进行合并。
- LSTM引擎生成的盒子都是一条条的,和Legacy引擎框住单个字符的不一样。
- LSTM盒子文件每一列文字最后要有一行\t开头的座标以示分隔。
- 训练时最好使用阈值“--target_error_rate 0.001”。
参考:
https://blog.csdn.net/qq_19313495/article/details/102977915
https://blog.csdn.net/Hu_helloworld/article/details/100923215
脚本
#!/bin/sh
export TESSDATA_PREFIX=/usr/share/tesseract/tessdata
f_img=$1
nm=${f_img%.*}
convert $f_img -density 300 $f_img
convert $f_img $nm.tif
#生成box
tesseract $nm.tif $nm -l chi_sim_vert --psm 5 lstmbox
#处理box
##把字符串拆成单独一行,每11行用?分隔
cat uni_string.txt | sed -e 's/\(.\)/\1\n/g' | sed -e '1~11i\?' > uni_char_row.txt
#生成lstmf
tesseract uni_char.tif uni_char -l chi_sim_vert --psm 5 lstm.train
find $(pwd) -name "*.lstmf" > training_files.txt
#提取lstm
combine_tessdata -e \
/home/ydx/Project-yushizupu/tesseract-train/71-model/yu.traineddata \
/home/ydx/Project-yushizupu/tesseract-train/71-model/yu.lstm
#训练
lstmtraining --model_output="./output/output" --continue_from="/home/ydx/Project-yushizupu/tesseract-train/71-model/yu.lstm" \
--train_listfile="/home/ydx/Project-yushizupu/tesseract-train/54/training_files.txt" \
--traineddata="/home/ydx/Project-yushizupu/tesseract-train/71-model/yu.traineddata" \
--debug_interval -1 --target_error_rate 0.01
#产出模型
lstmtraining --stop_training --continue_from="./output/output_checkpoint" \
--traineddata="/home/ydx/Project-yushizupu/tesseract-train/71-model/yu.traineddata" \
--model_output="./model/yu.traineddata"
#移动模型
cp ./model/yu.traineddata /home/ydx/Project-yushizupu/tesseract-train/71-model/yu.traineddata
sudo cp ./model/yu.traineddata /usr/share/tesseract/tessdata
模型产出
图像:
识别结果对比:
我的模型 - yu.traineddata 提取码:ifkr
十三丑时三子
宏戌宏艺宏达
二女长字大茶
李门次字黄人竹
城曾门氏终十
一月二十申时
葬大岭头向东
公寿八十一终
一九八七年丁
卯八月廿八葬
大石岭向南
官方best模型 - chi_sim_vert.traineddata
十三于时三子
宏成宏艺宏达
二女长字大茶
李门次字黄人竹
城曾门氏终十
-月二十申时
苦大岭头向东
公寿八十一绿
一九八七年本
师八月革八霓
大石叭向南
来源:oschina
链接:https://my.oschina.net/wffger/blog/3168379