dockerのtesseract-ocrでお手軽OCRする

最終更新日

アイキャッチ

概要

dockerで公開されているtesseractを使ってお手軽にOCR(光学的文字認識)する手順です。
公開されている手順そのままになりますが、dockerでの利用が簡単だったので日本語で残しておこうと思います。

手順

  1. docker pullする
  2. scriptファイルをDLする
  3. test.shをOCRしたいファイル向けに書き換える
  4. 結果の確認

docker pullする

なにはともあれ

docker pull tesseractshadow/tesseract4re

scriptファイルをDLする

scriptファイルをダウンロードして解凍してください
こちらのソース一式にdocker pullしたイメージを使ったshellが入っています。
もちろんscriptファイルがなくてもdocker imageの利用は可能ですが、あったほうが簡単に使えるのでDLします。

test.shをOCRしたいファイル向けに書き換える

そのままでもサンプルは利用可能ですが、自分が用意した画像に変えたほうが楽しいと思うので、OCRするファイルパスを修正します。

cd /path/to/your/directory/{回答したディレクトリ}
vim test.sh

ocr-files以下を好きなファイルパスに変更します。

docker cp ./ocr-files/phototest.tif t4re:/home/work/$TASK_TMP_DIR/

こちらのphototest.tifの部分を上記で指定したファイル名に変更します。

docker exec -it t4re /bin/bash -c "mkdir -p ./$TASK_TMP_DIR/out/; cd ./$TASK_TMP_DIR/out/; tesseract ../phototest.tif phototest -l eng --psm 1 --oem 3 txt pdf hocr"

結果の確認

以下でOCRを実行できます。

sh test.sh

以下のディレクトリ以下にできたファイルが確認できると思います。

scripts/ocr-files/output/TASK_xxxxx/out/

様々なOCR

test.sh内のtesseractコマンドのオプションを修正することで様々な結果が出力されます。
自分が利用したかったのはpsm(page segmentation mode)のレイアウトを考慮してくれるオプションです。

以下の様にpsmのオプションを1から11に変更すると、画像のレイアウトを考慮したOCRをしてくれます。またoemは1を指定する必要があります。

docker exec -it t4re /bin/bash -c "mkdir -p ./$TASK_TMP_DIR/out/; cd ./$TASK_TMP_DIR/out/; tesseract ../phototest.tif phototest -l eng --psm 11 --oem 1 txt pdf hocr"

さらに以下のように出力の結果をtsvにすると座標や、何番目のブロックとして文字列を読み取ったかの情報が得られます。

docker exec -it t4re /bin/bash -c "mkdir -p ./$TASK_TMP_DIR/out/; cd ./$TASK_TMP_DIR/out/; tesseract ../phototest.tif phototest -l eng --psm 11 --oem 1 tsv"

結果TSV(抜粋)
block_numやtop, left, width, heightといった値が入り、それに該当したテキストが取得できています。これを使えばどの位置にどの文字があるか?というのがわかるので様々な用途に応用できそうですね。

level   page_num    block_num   par_num line_num    word_num    left    top width   height  conf    text
1   1   0   0   0   0   0   0   640 480 -1  
2   1   1   0   0   0   36  92  582 269 -1  
3   1   1   1   0   0   36  92  582 92  -1  
4   1   1   1   1   0   36  92  544 30  -1  
5   1   1   1   1   1   36  92  60  24  96  This
5   1   1   1   1   2   109 92  20  24  96  is
5   1   1   1   1   3   141 98  15  18  96  a
5   1   1   1   1   4   169 92  32  24  96  lot
5   1   1   1   1   5   212 92  28  24  96  of
5   1   1   1   1   6   251 92  31  24  96  12
5   1   1   1   1   7   296 92  68  30  96  point
5   1   1   1   1   8   374 93  53  23  96  text
5   1   1   1   1   9   437 93  26  23  96  to

終わりに

tesseractはDeepLearningを利用して文字認識しています。
学習データも様々用意されており、読ませる学習データにより日本語や世界各国の言語が認識できます。
また、もちろん自分で学習データを用意することも可能です。

flutterでもtesseractを利用したライブラリが出ていて、非常に簡単に利用できました。(使い方や精度の問題はクリアしないといけませんが)
flutterでの利用例も別の機会に記載しようかと思います。

stmon19

遊びが一番 人生遊び 好きにまみれてます