概要
tesseractで文字認識するpythonプログラムを1つのexeファイル化する際につまづいたので、
その解決方法について紹介します。
先に結論!
pyinstaller実行後に作成されるspecファイルに、下記記述を追加します。
specファイルで再度pyinstaller実行すれば、Tesseractを含んだexeファイルが作成できます。
binaries=[(r'C:\Program Files\Tesseract-OCR', r'tesseract')],
datas=[(r'C:\Program Files\Tesseract-OCR\tessdata', r'data/tessdata')],
C:\Program Files\Tesseract-OCR
はtesseract.exeが格納されているフォルダのパスです。
ご自身の環境に合わせて、パスを変更してください。
作ろうとしていたもの
数字の書かれた画像ファイルから、数字と座標を認識するプログラムを作成。
実行環境
OS:Windows 11 Home
VScodeバージョン: 1.82.2
pythonバージョン:3.10
pyinstallerバージョン:5.13.2
pyocrバージョン:0.8.3
tesseract-ocrバージョン:5.3.1
トラブル発生時の状況
試しにテスト用のプログラムを作成し、
pyinstallerでexeファイルを作成しました。
プログラムの内容は画像から文字を認識し、文字と座標を出力するものです。
プログラムのファイル名はmain.py
です。
main.py
#ライブラリのインポート
#システムの利用を宣言する
import os
import sys
#PyOCRを読み込む
from PIL import Image
import pyocr
import pyocr.builders
# メインプログラム関数
def main():
#画像の読み込み
file_path = "image.jpg"
img = Image.open(file_path)
#builderオプションの設定
box_builder = pyocr.builders.WordBoxBuilder(tesseract_layout=6)
#文字と座標を読み取る
text_position = tool.image_to_string(img,lang="jpn",builder=box_builder)
#取得した座標と文字を出力する
for res in text_position:
print(res.content)
print(res.position)
if __name__ == "__main__":
# Tesseractのインストール場所をOSに教える
tesseract_path = "C:\Program Files\Tesseract-OCR"
if tesseract_path not in os.environ["PATH"].split(os.pathsep):
os.environ["PATH"] += os.pathsep + tesseract_path
#OCRエンジンを取得する
tools = pyocr.get_available_tools()
if len(tools) == 0:
print("OCRエンジンが指定されていません")
sys.exit(1)
else:
tool = tools[0]
# メインプログラム実行
main()
1つのexeファイルにまとめるため、--onefile
を使用します。
pyinstaller main.py --onefile --clean
pyinstallerを実行した結果、exeファイルは作成できたのですが。実行すると下記内容が出力さました。
Running from container, but no tessdata found !
tesseractが同封されていないため、出ているメッセージのようです。
調査
Running from container, but no tessdata found
でgoogle検索。
@bass_clef_さんの記事を発見しました。
記事を参考に下記のようにspecファイルを変更したのですが、うまくいきませんでした。
binaries=[(r'C:\Program Files\Tesseract-OCR\tesseract.exe', 'tesseract')],
datas=[(r'C:\Program Files\Tesseract-OCR\tessdata\jpn.traineddata', 'data/tessdata'), (r'C:\Program Files\Tesseract-OCR\tessdata\jpn_vert.traineddata', 'data/tessdata')],
解決策
binaries=[('{tesseract.exe のパス}', 'tesseract')],
datas=[('{*.traineddata のパス}', 'data/tessdata')],
{tesseract.exe のパス}
にexeファイル自体のパス(C:\Program Files\Tesseract-OCR\tesseract.exe)を入れるものだと勘違いしていました。
下記のように、tesseract.exeが格納されているフォルダのパスを記入するのが正解でした。
binaries=[(r'C:\Program Files\Tesseract-OCR', r'tesseract')],
datas=[(r'C:\Program Files\Tesseract-OCR\tessdata', r'data/tessdata')],
まとめ
pyinstallerでtesseractを同封するときは、
specファイルにtesseract.exeが格納されているフォルダのパスを記入することが重要!
最後まで読んでいただき、ありがとうございました。
コメントいただけるとうれしいです。
ブログ:https://pythonsoba.tech/
Qiita:https://qiita.com/yk5322
Zen:https://zenn.dev/yk5322