Tesseractのtraineddataを作る(START_MODEL指定)

こちらでMNISTの辞書を作ってた。

コレ自体は成功してるんだけど、MNISTの学習した辞書 = 数字としてしか認識してないんですよね。
元々あるeng.traineddataにMNISTを再学習させたい。
所定の場所に辞書をおいて、START_MODELで指定すれば良いらしい。

# 学習の元データを配置(ここではeng)
mkdir -p ~/tess/ocrd-train/usr/share/tessdata/
cp $TESSDATA_PREFIX/eng.traineddata ~/tess/ocrd-train/usr/share/tessdata/

# traindataを作成
nohup time -f "Run time = %E\n" make training MODEL_NAME=mnist START_MODEL=eng >> train.log 2>&1 &
# 実行結果をモニタ
tail -f train.log

失敗しとるやんけ。

unicharset_extractor --output_unicharset "data/mnist/my.unicharset" --norm_mode 2 "data/mnist/all-gt"
Bad box coordinates in boxfile string! 5731447772465593593980080763000377808191
Extracting unicharset from plain text file data/mnist/all-gt
Wrote unicharset file data/mnist/my.unicharset
merge_unicharsets data/eng/mnist.lstm-unicharset data/mnist/my.unicharset  "data/mnist/unicharset"
Failed to load unicharset from file data/eng/mnist.lstm-unicharset!!
make: *** [Makefile:193: data/mnist/unicharset] Error 1
Command exited with non-zero status 2
Run time = 0:03.31

まず、Boxファイルの座標がよくないって書いてありますね。
その後ろには生成されたall-gtファイルに書いてある先頭の文字列が続いています。

dir ~/tess/ocrd-train/data/eng
mnist.bigram-dawg      mnist.inttemp           mnist.lstm-word-dawg  mnist.punc-dawg      mnist.version
mnist.cube-unicharset  mnist.lstm              mnist.normproto       mnist.shapetable     mnist.word-dawg
mnist.cube-word-dawg   mnist.lstm-number-dawg  mnist.number-dawg     mnist.unicharambigs
mnist.freq-dawg        mnist.lstm-punc-dawg    mnist.pffmtable       mnist.unicharset

dir ~/tess/ocrd-train/data/mnist
all-gt  my.unicharset

cat ~/tess/ocrd-train/data/mnist/all-gt
5731447772465593593980080763000377808191
6112537405060708481747208153971502083047
1081672979589652628175573501138494518689(以下省略)

cat ~/tess/ocrd-train/data/mnist/my.unicharset
13
NULL 0 Common 0
Joined 7 0,255,0,255,0,0,0,0,0,0 Latin 1 0 1 Joined     # Joined [4a 6f 69 6e 65 64 ]a
|Broken|0|1 15 0,255,0,255,0,0,0,0,0,0 Common 2 10 2 |Broken|0|1        # Broken
5 8 0,255,0,255,0,0,0,0,0,0 Common 3 2 3 5      # 5 [35 ]0
7 8 0,255,0,255,0,0,0,0,0,0 Common 4 2 4 7      # 7 [37 ]0
3 8 0,255,0,255,0,0,0,0,0,0 Common 5 2 5 3      # 3 [33 ]0
1 8 0,255,0,255,0,0,0,0,0,0 Common 6 2 6 1      # 1 [31 ]0
4 8 0,255,0,255,0,0,0,0,0,0 Common 7 2 7 4      # 4 [34 ]0
2 8 0,255,0,255,0,0,0,0,0,0 Common 8 2 8 2      # 2 [32 ]0
6 8 0,255,0,255,0,0,0,0,0,0 Common 9 2 9 6      # 6 [36 ]0
9 8 0,255,0,255,0,0,0,0,0,0 Common 10 2 10 9    # 9 [39 ]0
8 8 0,255,0,255,0,0,0,0,0,0 Common 11 2 11 8    # 8 [38 ]0
0 8 0,255,0,255,0,0,0,0,0,0 Common 12 2 12 0    # 0 [30 ]0

こちらにエラーメッセージについて記載がありました。

Bad box coordinates in boxfile string! The LSTM trainer only needs bounding box information for a complete textline, instead of at a character level, but if you put spaces in the box string, like this:

<text for line including spaces> <left> <bottom> <right> <top> <page>

the parser will be confused and give you the error message.

How to train Tesseract 4.00

趣旨は「スペースいれんな」みたいですが、そういえばMNISTの抽出時に1行のプレーンテキストにしたような?
ちゃんとルールを守れって話か。
例えば、40文字「5041921314353617286940911243273869056076」と書かれたtifファイルから生成してみます。

tesseract /tmp/data_len40/00000.tif batch.nochop makebox
cat batch.nochop
3 4 3 24 23 0
0 35 4 51 24 0
4 59 3 78 23 0
7 87 0 99 28 0
/ 93 3 105 23 0
q 119 1 133 21 0
Q 126 0 132 28 0
2 145 5 165 23 0
N 180 4 186 24 0
3 201 3 218 23 0
| 237 3 241 23 0
4 258 4 276 24 0
3 286 4 299 24 0
5 314 7 334 21 0
3 339 3 359 23 0
6 371 6 386 26 0
1 393 0 411 28 0
7 404 1 442 23 0
3 454 5 474 23 0
% 483 3 498 23 0
6 514 5 524 25 0
s 540 1 552 21 0
M 563 4 582 24 0
0 593 4 610 24 0
9 626 2 636 22 0
/ 653 3 665 23 0
1 679 5 694 25 0
2 706 4 724 24 0
Y 737 2 747 22 0
3 761 3 779 23 0
2 788 3 808 23 0
7 821 5 833 19 0
e 843 5 863 21 0
P 873 3 892 23 0
b 906 6 918 26 0
7 930 1 946 21 0
0 961 3 973 23 0
5 985 6 1005 22 0
6 1018 5 1030 25 0
0 1043 4 1059 24 0
+ 1069 4 1088 21 0
6 1101 4 1113 24 0

どうやら左下を(0,0)とみるらしい。
MNIST画像は28×28で抽出しているので、機械的に作っちゃって良いでしょう。
抽出記事を見直しました。

再実行。ちょっと変わりました。
all-gtはただのboxファイルの連結みたいですね。

nohup: ignoring input
find -L data/mnist-ground-truth -name '*.gt.txt' | xargs paste -s > "data/mnist/all-gt"
combine_tessdata -u /root/tess/ocrd-train/usr/share/tessdata/eng.traineddata  data/eng/mnist
Version string:Pre-4.0.0
1:unicharset:size=7477, offset=192
2:unicharambigs:size=1047, offset=7669
3:inttemp:size=976552, offset=8716
4:pffmtable:size=844, offset=985268
5:normproto:size=13408, offset=986112
6:punc-dawg:size=4322, offset=999520
7:word-dawg:size=1082890, offset=1003842
8:number-dawg:size=6426, offset=2086732
9:freq-dawg:size=1410, offset=2093158
11:cube-unicharset:size=1511, offset=2094568
12:cube-word-dawg:size=1062106, offset=2096079
13:shapetable:size=63346, offset=3158185
14:bigram-dawg:size=16109842, offset=3221531
17:lstm:size=5390718, offset=19331373
18:lstm-punc-dawg:size=4322, offset=24722091
19:lstm-word-dawg:size=7143578, offset=24726413
20:lstm-number-dawg:size=3530, offset=31869991
23:version:size=9, offset=31873521
Extracting tessdata components from /root/tess/ocrd-train/usr/share/tessdata/eng.traineddata
Wrote data/eng/mnist.unicharset
Wrote data/eng/mnist.unicharambigs
Wrote data/eng/mnist.inttemp
Wrote data/eng/mnist.pffmtable
Wrote data/eng/mnist.normproto
Wrote data/eng/mnist.punc-dawg
Wrote data/eng/mnist.word-dawg
Wrote data/eng/mnist.number-dawg
Wrote data/eng/mnist.freq-dawg
Wrote data/eng/mnist.cube-unicharset
Wrote data/eng/mnist.cube-word-dawg
Wrote data/eng/mnist.shapetable
Wrote data/eng/mnist.bigram-dawg
Wrote data/eng/mnist.lstm
Wrote data/eng/mnist.lstm-punc-dawg
Wrote data/eng/mnist.lstm-word-dawg
Wrote data/eng/mnist.lstm-number-dawg
Wrote data/eng/mnist.version
unicharset_extractor --output_unicharset "data/mnist/my.unicharset" --norm_mode 2 "data/mnist/all-gt"
Extracting unicharset from box file data/mnist/all-gt
Wrote unicharset file data/mnist/my.unicharset
merge_unicharsets data/eng/mnist.lstm-unicharset data/mnist/my.unicharset  "data/mnist/unicharset"
Failed to load unicharset from file data/eng/mnist.lstm-unicharset!!
make: *** [Makefile:193: data/mnist/unicharset] Error 1
Command exited with non-zero status 2
Run time = 0:09.45

data/eng/mnist.lstm-unicharsetの読み込みに失敗していますが、そもそも作られていない。
分解してみる。

combine_tessdata -d ~/tess/ocrd-train/usr/share/tessdata/eng.traineddata
Version string:Pre-4.0.0
1:unicharset:size=7477, offset=192
2:unicharambigs:size=1047, offset=7669
3:inttemp:size=976552, offset=8716
4:pffmtable:size=844, offset=985268
5:normproto:size=13408, offset=986112
6:punc-dawg:size=4322, offset=999520
7:word-dawg:size=1082890, offset=1003842
8:number-dawg:size=6426, offset=2086732
9:freq-dawg:size=1410, offset=2093158
11:cube-unicharset:size=1511, offset=2094568
12:cube-word-dawg:size=1062106, offset=2096079
13:shapetable:size=63346, offset=3158185
14:bigram-dawg:size=16109842, offset=3221531
17:lstm:size=5390718, offset=19331373
18:lstm-punc-dawg:size=4322, offset=24722091
19:lstm-word-dawg:size=7143578, offset=24726413
20:lstm-number-dawg:size=3530, offset=31869991
23:version:size=9, offset=31873521

あれ?
こちらの「Pre 4.0.0 format from Nov 2016 (with both LSTM and Legacy models)」と同じですね。
その後の「4.00.00alpha LSTM only format」にはlstm-unicharsetがあるので、使ってるファイルが悪いのか?

今回のオチ

Ubuntu22.04.1 LTSで実行してたけど、Ubuntu18.04.5 LTSで同じことしたら動きました…。
BOXファイルも1行のプレーンテキストでOKっぽい。
そしてengではなく、こちらからダウンロードしたeng_bestを食わせています。
4時間ほど放置して、無事に終わりました。なんだよぉ…。

tesseract ~/tess/ocr-test.png stdout -l mnist
Failed to load any lstm-specific dictionaries for lang mnist!!
Detected 40 diacritics
123661510
5950789 0

0

精度はいまいちだけどー

警告対策

あと、『Failed to load any lstm-specific dictionaries for lang mnist!!』警告が出ちゃう。
最低限必要な3つlstm-word-dawg、lstm-number-dawg、lstm-punc-dawgがないかららしい。
元データから抜き出して結合することで消すことはできるが、精度に影響がありそう。

こちらを参考にさせていただきました。

# tmpフォルダで作業する
cp $TESSDATA_PREFIX/eng_best.traineddata /tmp/
cp $TESSDATA_PREFIX/mnist .traineddata /tmp/
cd /tmp/
# 必要な3ファイルを取り出す
combine_tessdata -e eng_best.traineddata eng_best.lstm-punc-dawg
combine_tessdata -e eng_best.traineddata eng_best.lstm-number-dawg
combine_tessdata -e eng_best.traineddata eng_best.lstm-word-dawg
# mnistに結合する
combine_tessdata -o mnist.traineddata eng_best.lstm-word-dawg
combine_tessdata -o mnist.traineddata eng_best.lstm-number-dawg
combine_tessdata -o mnist.traineddata eng_best.lstm-word-dawg

同じ画像でも、eng、eng_best、mnistだけ、eng_best+mnist、eng_best+mnistに3ファイルを結合した辞書で微妙に結果が変わる。うーん。


他にもニッチなIT関連要素をまとめていますので、よければ一覧記事もご覧ください。

返信を残す

メールアドレスが公開されることはありません。

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)