2
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【pyinstaller】tesseract-ocrを同封して、1つのexeファイルを作成する方法を解説!

Posted at

概要

tesseractで文字認識するpythonプログラムを1つのexeファイル化する際につまづいたので、
その解決方法について紹介します。

先に結論!

pyinstaller実行後に作成されるspecファイルに、下記記述を追加します。
specファイルで再度pyinstaller実行すれば、Tesseractを含んだexeファイルが作成できます。

main.spec
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ファイルを変更したのですが、うまくいきませんでした。

main.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が格納されているフォルダのパスを記入するのが正解でした。

main.spec
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

2
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?