TesseractとPyocrの組み合わせがうまく動かない? 2021年08月25日

Code

Googleの作った画像認識が得意なTesseractというアプリケーションがあって、それをPythonから使うために間を取り持つためのラッパーという役割でPyocrというライブラリがある。このライブラリを使えばPythonから簡単に画像認識、画像から文字列を抜き出すなどいろいろと便利になる。

のだが、ちょっと今このTesseractとPyocrをCentOS7.0上にインストールして使っていて、なんでだかエラーが出る。

[root@c7 lott]# python extract_number.py
tesseract 3.04.00
leptonica-1.72
libgif 4.1.6(?) : libjpeg 6b (libjpeg-turbo 1.2.90) : libpng 1.5.13 : libtiff 4.0.3 : zlib 1.2.7 : libwebp 0.3.0

psm_parameter(): failed to get Tesseract version. AssumingTesseract >= 4 --> using option '--psm'
Traceback (most recent call last):
File "/root/.pyenv/versions/3.9.0/lib/python3.9/site-packages/pyocr/tesseract.py", line 454, in get_version
ver_string = ver_string.split(" ")[1]
IndexError: list index out of range

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
File "/root/.pyenv/versions/3.9.0/lib/python3.9/site-packages/pyocr/tesseract.py", line 168, in psm_parameter
version = get_version()
File "/root/.pyenv/versions/3.9.0/lib/python3.9/site-packages/pyocr/tesseract.py", line 471, in get_version
raise TesseractError(
pyocr.error.TesseractError: (0, 'Unable to parse Tesseract version (spliting failed): []')
No. of data: NG> prize1 0

どうやらtesseract.pyのget_version()という関数でエラーが出て失敗してるっぽいが、さらに読んでいくと

def get_version(set_env=True):

global g_version

~ 省略 ~

command = [TESSERACT_CMD, "-v"]

proc = subprocess.Popen(command,
startupinfo=g_subprocess_startup_info,
creationflags=g_creation_flags,
stdout=subprocess.PIPE)
ver_string = proc.stdout.read()
ver_string = ver_string.decode('utf-8')

commandというリストに[“tesseract”, “-v”]というコマンドとオプションを格納して次のsubprocess.Popenに渡す、Popenオブジェクトからread()で標準出力を読み取ってバージョンを検証する流れだが、このPopenオブジェクトの標準出力に何も出力されていない。適当なところで print(ver_string) で何が入っているのか見てみたけどb”とか”とかなんにも出力されないのよね。。。

proc = subprocess.Popen(command,
startupinfo=g_subprocess_startup_info,
creationflags=g_creation_flags,
stdout=subprocess.PIPE,
stderr=subprocess.STDOUT)

結局、標準エラー出力を標準出力にリダイレクトするとtesseractのバージョン情報がやっと読み取れるようになるんだが、-v オプションを付けてるのになんで標準エラー出力にバージョン情報が出てくるの?他のコマンドでテストしてみるとちゃんとバージョン情報は標準出力に出てくるのに。。。

これってtesseractが問題なの?それともsubprocess.Popenが問題なの?うーんPopenのソースも読まないといけないのか。。。あと他のCentOS7の環境にTesseractとPyocr入れて動き一緒なのか変わるのかも見ないとな。。。すんません、ここまで書いてて何が原因かまだわかりません。ここまで見てきたところで「あ、ブログ書かなきゃ」と思ったので頭の中にあったものを書いたまで。お粗末様。

「独学プログラマー Python言語の基本から仕事のやり方まで」 2018年08月27日

From the light came Python 3K

つい最近アマゾンのキンドルでこの本を購入。Pythonを使えるようになりたくて買ってみたが非常にこの本が面白くて自宅に居る間はPCの前にかじりついてこの本のサンプルスクリプトを組んで試して一人で微笑んでおります。

自分はネットワーク系のエンジニアでプログラミングはまったくできない人間だが、この本は非常にスムーズにPythonの文法などが頭に入ってきて(というかPythonの文法自体がかなりわかりやすくできているということか?)、すぐにかんたんなスクリプトなら書いて動かせるようになった。身の回りの細かい作業はこれでスクリプト化して楽しんでおります。

そしてPythonの面白いところのひとつのBeautifulSoup4というウェブスクレイピングのライブラリを使って海外のグラビアアイドルのギャラリーサイトからHTMLをパースして数千枚の画像を一気に落としてきたり。年を取っても行動パターンは変わらずです。

そういえば、1998年ぐらいの大学生時代、有人と一緒に夜な夜なテレホーダイが始まると手分けをして素人ハメ撮り写真集を落としましたが、はっきり言ってその時にもこういうプログラミングを学習するきっかけはあったのかもしれないと思うところもあります。(とはいえその頃にこんな便利なライブラリはたぶん存在していなかったとは思うが。。)

他にもPythonでウェブスクレイピングという書籍はいくつか出ているようなのでそのへんも買って勉強してみようかと思います。。。

独学プログラマー Python言語の基本から仕事のやり方まで
日経BP社 (2018-03-20)
売り上げランキング: 303