概要
dockerで公開されているtesseractを使ってお手軽にOCR(光学的文字認識)する手順です。
公開されている手順そのままになりますが、dockerでの利用が簡単だったので日本語で残しておこうと思います。
手順
- docker pullする
- scriptファイルをDLする
- test.shをOCRしたいファイル向けに書き換える
- 結果の確認
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での利用例も別の機会に記載しようかと思います。