TesseractのLSTM学習をWindows(WSL)上で行う

# はじめに
　どうもお久しぶりです。今回はTesseractのLSTM学習をWindowsのWSLを使って行おう、という記事を書いてみたいと思います。私は1年前とても苦しんだのですが、Tesseractの学習機能はどうもUbuntuを前提としていて、OSを入れ替えたりデュアルブートにしたりしたりと面倒な事をしていました。しかし、WindowsにはUbuntuのターミナルが入れられるそうで、WSLをインストールすれば可能という事を知りました。
　なので、
「Tesseractの学習機能を使いたいけどOS入れ替えとかしたくない。。。」
「どうにかWindows上でできないか」
とか思ってる人向けに記事を書きます。

〇参考
・[Windows 10でLinuxを使う](https://qiita.com/whim0321/items/093fd3bb2dd287a72fba)（@whim0321様）
・[WSLとwindows間のファイル連携](https://qiita.com/quzq/items/1096c638c0d86795be13)(@quzq様)

という記事を参考にさせて頂きました。丁寧な解説ありがとうございます。
# WSLの準備
## インストール
まずWSLの準備をします。PowerShellを”管理者として”開いて、以下のコマンドを入力してください。

```
Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux
```
すると、↓のような画面になるのでYを入力してEnterを押してください。
![1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/554112/979c98ee-fdb0-29cd-fe98-a9342c94aec3.png)
処理が終了したら、Microsoft Storeを開いてUbuntuと検索してください。そしてインストールをクリック。
![2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/554112/6538d479-6fea-ef16-8a07-921c9af95b11.png)
しばらくすると、↓の画面になり起動ボタンが押せるようになるのでクリック。
![4.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/554112/5a2d0c7e-7769-9408-0e5b-ccefdce0d9b0.png)
これでUbuntuのターミナルが入りました。最初はInstallの処理を行っているので、しばらく待ちましょう。
![3.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/554112/82cc9c3d-a53c-fad3-6f36-95f38d865b4f.png)
しばらくするとユーザー名とパスワードの設定が求められます。適当に決めて入力してください。パスワードは2回聞かれます。
![5.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/554112/24f8f9d1-12e0-ba5d-7bd8-2e341cbca1b5.png)
これでインストールは終了なのですが、以下のコマンドを実行して、最新の状態に保ちましょう。（私は結構時間がかかりました。）

```
sudo apt update
sudo apt upgrade
```
そして、後に必要になるGitとpythonもインストールしましょう。pythonのインストールは結構時間がかかります。

```
sudo apt install git
sudo apt install -y python
sudo apt install python3-pip
```
# Windowsのエクスプローラとの連携
　先の作業でWSLのインストールが終了しました。しかしターミナル上の操作に限られてしまうのはあまりに不便なので、いつも皆さんが使っているエクスプローラと連携しましょう。簡単です。
　エクスプローラを開いて、パスの欄に\\\wsl$と入力すると↓の画面になって、Ubuntuのフォルダがいじれるようになります。適当にスタートメニューに追加とかしておくと作業しやすいです。
![6.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/554112/a48545ce-0dac-236c-745c-46d93d2ab26a.png)

# ocrd-trainの準備
## 事前準備
まずUbuntuのターミナル上で以下のコマンドを打ってroot権限になってください。

```
sudo su -
```

んで以下のコマンドを入力してください。これを入力しないと`Note, selecting 'python-is-python2' instead of 'python'`というエラーが出ます。詳しくは以下のURLを見てください。
・https://lornajane.net/posts/2020/the-python-is-python2-package-on-ubuntu-focal-fossa

```
sudo apt install python-is-python3
```
そしてここから、ocrd-trainに必要なインストールをしていきます。

```
#Alexander Pozdnyakov氏のPPA
$ add-apt-repository ppa:alex-p/tesseract-ocr -y && apt update

#Tesseract本体
$ apt install -y tesseract-ocr

# 必要なライブラリをインストールします
$ apt install -y python imagemagick libsm6 libxext64
$ pip3 install numpy matplotlib pillow
```

## ocrd-trainのインストール
 これで準備は整いました！最後の仕上げとしてocrd-trainをインストールしていきます。また、ここからはrootディレクトリではなく、ユーザーのディレクトリで作業を行います。rootディレクトリで作業を行ってしまうと、エクスプローラからアクセスできなくなるかも、です。
という訳で、

```
sudo su "ユーザー名"
```
でユーザーディレクトリへ移行してください。それで、以下のコマンドで作業用ディレクトリとocrd-trainのcloneをしてください。

```
# 作業用のディレクトリ
mkdir tess
cd tedd

# ocrd-trainのclone
git clone --depth 1 https://github.com/OCR-D/ocrd-train.git
```

## 学習テスト
ここでは学習の動作が出来るかテストします。学習対象の画像はサンプルからたった2枚の画像です。エクスプローラからサンプルデータの解凍をしましょう。エクスプローラから`ubuntu/home/hogehoge/tess/ocrd-train`へアクセスして
![7.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/554112/e859ba59-5905-ffbc-dbee-0c213c322f4f.png)
zipファイルの`ocrd-testset.zip`を解凍します。
![8.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/554112/3b0ec931-517c-be23-36cb-c33d9f0fa65a.png)

そして`ocrd-train\data\`配下に`foo`と`foo-ground-truth`のディレクトリを作成してください。

![9.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/554112/1397d5a4-0282-5173-b0e4-5f12a3d8b194.png)

それで、回答したデータの中から、

・alexis_ruhe01_1852_0035_019.tif
・alexis_ruhe01_1852_0035_019.gt.txt
・alexis_ruhe01_1852_0087_027.tif
・alexis_ruhe01_1852_0087_027.gt.txt

を`foo-ground-truth`へコピーします。（サンプルデータの中でもうまく動作しないものがあります。私の環境では、上記のデータでは動作しました）
いよいよです。以下のコマンドを打てば学習データの作成がはじまります。

```
make training MODEL_NAME=foo
```
こんな画面が出てくれば、順調に学習が進んでいる証拠です。
![10.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/554112/fea26c19-9044-2bf9-9433-89e1f6bcfd02.png)
学習が終わるとこんな感じの画面になります。30分ぐらいかかりました。
![12.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/554112/e53389d4-3d71-24e5-a29d-30bf897b67a6.png)

そして、ディレクトリ`ocrd-train\data\`配下に作成された`foo.traineddata`が完成品です。
※学習後のデータの出力先には注意してください。
・[ocrd-trainので学習データの出力先（Failed to continue from: data/xxx/xxx.lstm）](https://qiita.com/mimuro_syunya/items/7c7294afad360b16c809)
![101.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/554112/09202cbc-9fb0-6e54-0084-8db7f01966eb.png)
### 自分で用意したデータを学習する
 みなさんがやりたいのはこれだと思います。これまでの作業でocrd-trainが動作する事は確認できたと思うので、以下のステップを踏んで、オリジナルの学習データを作ってみてください。学習データですので、文章の画像と正解のテキストデータを用意することになります。また、正解のテキスト（手順3）はutf-8で書き込んでください。そうしないと（多分）エラーが出ます。
　今回作成するモデルの名前は`TRAINING`としていますが、適当に変えて頂いてかまいません。（その場合は手順1と4の`TRAINING`を適宜変更してください）

1.`ocrd-train\data\`配下に`TRAINING`と`TRAINING-ground-truth`のディレクトリを作成
2.学習対象の画像（1行ごとの文章画像）をファイル名`training_image.git`で用意する。(`training_image`は適当にしていただいて構いません)
3. 2.の画像に対するテキストをファイル名`training_image.gt.txt`へ書き込む。（`training_image`は学習対象の画像ファイルの拡張子無しの名前の事です）
4.  2.と3.を`TRAINING-ground-truth`へコピーし、以下のコマンドを実行する。

```
make training MODEL_NAME=TRAINING
```

# おわりに
　久しぶりにTesseractについての記事を書きました。最近研究で使いそうになっているので、やりやすいやり方を探していて、WSL使えばいんじゃね？ってなったので忘れないようにまとめました。リモートでの課題提出も増えTeamsを使う機会が増えた事もあり、なるべくWindows上で済ませたかったのです。
　同じことで詰まっている誰かのためになれば幸いです。それでは！!