【5分で解決】pyocr.get_available_toolsのout of rangeエラー

 

【悩み】
・pyocrのプログラムを実行したけど異常終了して動かない。
・tool = tools[0] IndexError: list index out of rangeのエラー原因を知りたい。
・pyocr.get_available_tools()を使ったPythonプログラムを正常実行したい。



こういった「悩み」に答えます。
 

【本記事の内容】
① pyocrとは?
➁ pyocr.get_available_toolsでlist index out of rangeが発生した経緯
➂ pyocr.get_available_toolsでlist index out of rangeが発生する原因
④ pyocr.get_available_toolsでlist index out of rangeを解決する手順



本記事を実践したことで、5分くらいで「pyocr.get_available_toolsを使った際に発生するIndexError: list index out of range」のエラーを解決できました(下の動画参照)。
 



記事の前半では「pyocrとは?」や「本エラーの発生経緯」を解説します。

記事の後半では「本エラーの発生原因」から「解決する方法」までを紹介します。
 

この記事を読み終えることで、「エラーで動かないpyocrプログラムを解消でき、正常に動く状態」になるはずです。

 

pyocrとは:PythonでOCRができるライブラリ


「pyocrとは?」に関しては、以下の記事「PythonでOCRができるライブラリ」の箇所をご覧ください。

>> 【最短5分】PythonとOCRでPDFや画像から文字認識をする方法

 

画像内に写っている「文字」を抽出したい場合、pyocrを使うことで実現できます。
続いて、pyocrを使っていると発生しやすい「IndexError: list index out of range」に関して紹介しますね。


 

pyocr.get_available_toolsでlist index out of rangeが発生した経緯


「pyocr.get_available_toolsでlist index out of rangeが発生した経緯」に関して解説します。
 

本事象が発生した当時は、納期が近く、「数日前までは発生しなかったのになぜ?」と思いつつ、慌てふためいた記憶があります。



筆者は、以下のようなPythonプログラムをWindows上で実行しようと考えていました。

import os
import sys
import re
from PIL import Image
import pyocr
 
# pyocrが利用するOCRエンジンをTesseractに設定
tools = pyocr.get_available_tools()
print(tools)
tool = tools[0]
 
# OCR(文字認識)させた画像ファイルを読み込み
ocr_image_file_path = "./input/postgresql_top_jp.jpg"
img = Image.open(ocr_image_file_path)
 
# OCR(文字認識)の実施
builder = pyocr.builders.TextBuilder(tesseract_layout=6)
text = tool.image_to_string(img, lang="jpn", builder=builder)
 
print(text)



ちなみに、上に記載したpyocrを使ったプログラムの詳細を知りたい方には、以下の記事がオススメです。
>> 【最短5分】PythonとOCRでPDFや画像から文字認識をする方法
 

上記プログラムを「pyocr-test.py」というファイル名で保存します。

保存したファイルを実行するために、以下のコマンドを実行したところ、「IndexError」が発生しました。

python pyocr-test.py
Traceback (most recent call last):
  File "C:\Users\user\Desktop\work\pyocr-test.py", line 10, in <module>
    tool = tools[0]
IndexError: list index out of range


 

本事象は、以下の日時と環境で発生しました。
動作確認済み日時:2022年10月31日
動作確認済み環境:
・MacOS Catalina
・Windows 11 pro



以上が、「pyocr.get_available_toolsでlist index out of rangeが発生した経緯」となります。
 

pyocr.get_available_toolsでlist index out of rangeが発生する原因


「pyocr.get_available_toolsでlist index out of rangeが発生する原因」に関して解説します。
 

list index out of rangeが発生する原因としては、「Tesseractの実行ファイルをうまく参照できていないから」となります。



本事象(IndexError: list index out of range)が発生する原因は、以下となります。
 

【発生原因】
エラーの意味:
 「リストに対して範囲外のインデックスを指定しています」です。
エラー箇所:
 tools = pyocr.get_available_tools()部分で空のリストを取得
 そのため、tool = tools[0]で範囲外のインデックスを指定しエラーが発生
原因:
 pyocr.get_available_tools()でTesseractを参照できていないためです。
 参照できない理由としては、主に以下が考えられます。
 ・環境変数にTesseractが設定されていない
 ・システムトラブルで環境変数を参照できない
 ・そもそもTesseractがインストールされていない



以上が、「pyocr.get_available_toolsでlist index out of rangeが発生する原因」となります。
 

pyocr.get_available_toolsでlist index out of rangeを解決する手順


「pyocr.get_available_toolsでlist index out of rangeを解決する手順」に関してご紹介します。
 

【解決方法】
手順1:Tesseractのインストール先を確認
手順2:pyocr.tesseract.TESSERACT_CMDでTesseractのPATHを設定



以降で、上記手順の各項目に関してご説明します。
 

手順1:Tesseractのインストール先を確認

まずは、Tesseractのインストール先を確認しましょう。
 

エラーを解消するためには、Tesseractのインストール先を知る必要があります。



Tesseractのインストール先を調べるために、以下のコマンドを「ターミナル」や「コマンドプロンプト」上で実行してください。

【MacOS/Linux/Ubuntuの場合】
  sudo su -
  find / -name 'tesseract*'

【Windowsの場合】
  cd C:\
  where /r . tesseract.exe



筆者のパソコンでは、「C:\Program Files\Tesseract-OCR\tesseract.exe」にTesseractがインストールされていました。
 

Tesseractのインストール先が見つからなかった場合、Tesseractがそもそもインストールされていない可能性があります。その場合は、以下の記事を参照し、インストールしましょう。

>> 【Linux向け】Tesseract(OCR/文字認識)をインストールする手順

>> 【Mac向け】Tesseract(OCR/文字認識)をインストールする手順

>> 【Windows向け】Tesseract(OCR/文字認識)のインストール手順


 

手順2:pyocr.tesseract.TESSERACT_CMDでTesseractのPATHを設定

続いて、Pythonプログラムを修正していきましょう。
 

プログラムに「pyocr.tesseract.TESSERACT_CMD」を追加することで、本エラーを解消できます。



本事象を解決するために、以下のようにプログラムを修正します。

import os
import sys
import re
from PIL import Image
import pyocr

# TesseractのインストールPATHを設定 ★追加★
pyocr.tesseract.TESSERACT_CMD = r"C:\Program Files\Tesseract-OCR\tesseract.exe"

# pyocrが利用するOCRエンジンをTesseractに設定
tools = pyocr.get_available_tools()
print(tools)
tool = tools[0]
 
# OCR(文字認識)させた画像ファイルを読み込み
ocr_image_file_path = "./input/postgresql_top_jp.jpg"
img = Image.open(ocr_image_file_path)
 
# OCR(文字認識)の実施
builder = pyocr.builders.TextBuilder(tesseract_layout=6)
text = tool.image_to_string(img, lang="jpn", builder=builder)
 
print(text)



上記のようにプログラムを修正した上で実行したところ、「IndexError: list index out of range」が発生せず、無事にpyocrプログラムが正常終了しました(下の動画参照)。
 



今回、事象を解消するために追加した「pyocr.tesseract.TESSERACT_CMD」のリファレンスは、以下となります。
 

【pyocr.tesseract.TESSERACT_CMDのリファレンス】
処理:pyocrが使うTesseractを設定
使い方:pyocr.tesseract.TESSERACT_CMD = Tesseractのインストール先
初期値:tesseract.exe
参照:公式ドキュメントなし。プログラムから使い方を判断(ソースコード)



上記の流れで、本事象を無事に解消できました。
 

pyocr.get_available_toolsでlist index out of rangeが発生しても慌てる必要はないです。エラー内容を理解し、一つ一つ原因をつぶすことで本問題を解消できます。


 

【まとめ】pyocr.get_available_toolsのlist index out of range


いかがでしたでしょうか?

上記で紹介した「pyocr.tesseract.TESSERACT_CMD」をエラーが発生したプログラムに追加していただくと、「IndexError: list index out of range」を解消できます。

最後にもう一度内容を確認しましょう。
 

【IndexError: list index out of rangeの原因と解決方法】
・原因
 pyocr.get_available_tools()でTesseractを参照できていないため
・解決するための手順は2つ
 手順1:Tesseractのインストール先を確認
 手順2:pyocr.tesseract.TESSERACT_CMDをプログラムに追加



体系的にTesseractを学習したい方には、本ブログで紹介している以下の記事がオススメです。

例えば、「インストール手順」や「縦書き日本語を文字認識方法」などをコピペで実践できるレベルでご紹介しています。

>> Tesseractの使い方【インストール→OCRの例→Python/Ruby】

 

コメント