ocrd-trainでtesseractにトレーニングさせる

tesseractにおける画像を用いた学習方法を自分のメモ用で記述していきます。ocrd-trainを用いて学習します。最後の学習コマンドでエラーが出たときの対処法も記述していきます。Qiitaの使い方がわからなく、自分のメモ用とも会って見出し等はなく、コマンドをただただ実行しており最初に始める方は見づらいですが、ご了承ください。私が参考にしたサイトをまず閲覧後、エラーやバグが起こった場合にこちらに戻ってきていただけると内容をより把握できると思います。

基本的に上からコマンドをコピーしてペーストすればできるようになっています。(Ubuntu上でペーストする際は右クリックを押すとペーストされます)

https://qiita.com/keraFPV/items/fc87a3d048c47cf2ba8b

環境(2023/06/23)
Ubuntu 18.04.6 LTS (WSL上で構築します)


必要なもののダウンロード
```
# download
sudo su -
apt update && apt upgrade
apt install git
apt install make
apt install build-essential libbz2-dev libdb-dev libreadline-dev libffi-dev libgdbm-dev liblzma-dev libncursesw5-dev libsqlite3-dev libssl-dev zlib1g-dev uuid-dev tk-dev
apt-get install libicu-dev libpango1.0-dev libcairo2-dev
apt install imagemagick libsm6
apt install -y python3-pip
sudo apt-get install libjpeg-dev
pip3 install pillow --upgrade pip
```

tesseractのインストール
```
# tesseract install
apt install -y tesseract-ocr
apt install libtesseract-dev

# eng,osdの2つが出てくればOK
tesseract --list-langs
```

ocrd-trainや、.traineddata(学習済みデータ)のダウンロード
```
# ocrd-train , .traineddata download
mkdir ~/tess && cd ~/tess
git clone --depth 1 https://github.com/tesseract-ocr/langdata.git
echo "export TESSDATA_PREFIX=/usr/share/tesseract-ocr/4.00/tessdata/" >> ~/.profile && source ~/.profile
wget https://github.com/tesseract-ocr/tessdata/raw/main/jpn.traineddata -P $TESSDATA_PREFIX
wget https://github.com/tesseract-ocr/tessdata_best/raw/main/jpn.traineddata -O $TESSDATA_PREFIX/jpn_best.traineddata
wget https://github.com/tesseract-ocr/tessdata_best/raw/main/jpn_vert.traineddata -P $TESSDATA_PREFIX
git clone --depth 1 https://github.com/OCR-D/ocrd-train.git
cd ~/tess/ocrd-train
mkdir data
```

data 内に<モデル名>-ground-truth ディレクトリを作成し、tifと.gt.txtを配置
```
# 上の文を確認してください。

/root/tess/ocrd-train/data
|-<モデル名>-ground-truth
|  |-A.tif
|  |-A.gt.txt
|  |-B.tif
|  |-B.gt.txt
～～～～～～～～

というディレクトリになっていればOK

# <モデル名>は、ここに入れた画像を学習させた.traineddataが<モデル名>.traineddataという名前になるので適切なものをつけましょう
```

学習させていきます
```
cd ~/tess/ocrd-train
mkdir -p usr/share/tessdata/
cp $TESSDATA_PREFIX/jpn_best.traineddata usr/share/tessdata/
# 学習させる
nohup time -f "Run time = %E\n" make training MODEL_NAME=<モデル名> START_MODEL=jpn_best >> train.log 2>&1 &
# 様子確認
tail -f train.log
```

ここまでは本当にメモ程度です。上のURLを見た方もここまでは来れるのではないでしょうか。もしここまで来て、
Finish! Error rate
のような画面が出てきたら学習できています。

しかし、私はここでtrain.logを確認した際にエラーが発生してしまいました。

様々なエラーが出てくると思うので、私が直面したエラー1つ1つの解決方法について説明していきます。
エラーメッセージが変わる可能性があるので、以下のエラーを一つでも直した場合、もう一度学習を実行してtrain.logを確認し、エラーメッセージを確認することをお勧めします。

画像ファイル、正解テキストの権限エラー
```
Invailed <data/<モデル名>-ground-truth/A.gt.txt>
```
これは、アクセスできていない可能性があります。
'''
chmod 777 /root/tess/ocrd-train/data/<モデル名>-ground-truth/*.tif
chmod 777 /root/tess/ocrd-train/data/<モデル名>-ground-truth/*.txt
'''
これで権限を与えましょう。ほかの人も触る場合は777ではなく適切な値に変換してください。権限を変えても変わらない方は、他のエラーも確認し、一番下に対処方法を書いたのでそちらを確認してください。

ファイルが足りない
```
Failed ～
```
このようなエラーの際は、とりあえず足りないといわれているファイル名をそのまま検索してみましょう。
Hiragana.unicharsetなどはgithubにあるので、ダウンロードし、エラー内容にある場所に適切に配置してあげましょう。
.configがないというエラーの場合は、おそらくどこかに作成されているはずです。エクスプローラー上で <モデル名>.configと検索すると、どこかで引っ掛かるはずです。それをコピーし、これもまたエラー内容に書かれている場所に適切に配置してあげましょう。

UnicodeError
```
Unicodedecode　～
    Failed to read ～
```
こんな感じでエラーが出ている人は、おそらく日本語を読ませようとしている方だと思います。私はETLCDBの日本語データセットを用いて学習させようとした際にこのようなエラーが発生しました。
この際は、 /root/tess/ocrd-trainにある generate_line_box.pyファイルを開いて、
29行目のencodingを以下のように変更します。
```
with io.open(args.txt, "r", encoding='shift-jis') as f:
```
これで日本語に関するboxファイルを作成し、lstmfファイルも作成することができるはずです。

変わらないInvailed
全部試したけど何故か変わらない、どうしても謎のエラーが出る

こんな方はこれを試してみてください(特に Makefile 231 でエラーが出ている人におすすめ)
```
# /root/tess/ocrd-train のMakefileを開きます
#31行目のGROUND_TRUTH_DIRの右辺を下のように変更します。
$(OUTPUT_DIR)/ground-truth
```
これで実行すると、4つほどのデータを書き込んだ後、必ずエラーが起こります。train.logがエラーを吐いたのを確認してから、元に戻してください。
```
GROUND_TRUTH_DIR := $(OUTPUT_DIR)-ground-truth
```

私はこれで解決しました。本来あるべきファイルをこのコマンドで作成し、それが使われることで学習することができると考えていますが、だいぶ適当です。真実はわかりません。



私が思い出せるエラー対処はこれぐらいです。何か他のエラーが出ている方がいましたら、コメント等で共有していただけると嬉しいです。