Python入門トップページ


目次

  1. データの準備
  2. macOS 編
    1. Tesseract による画像内文字認識
    2. PDF からの文字列抽出
    3. PDFの画像への変換
  3. Windows 編
    1. Tesseract による画像内文字認識
    2. PDF からの文字列抽出
    3. PDFの画像への変換

画像内文字認識と PDF からの文字列抽出

Tesseract による画像内文字認識(macOS 編)

Tesseract(テッセラクト)は Apache ライセンスで配布されているフリーソフトで,OCRエンジン (libtesseract) とコマンドラインプログラム (tesseract) が含まれるパッケージです.画像に含まれる様々な言語の文字を認識することができます.

目次に戻る

Tesseract のインストール

Python で Tesseract を利用するために,まず macOS に Tesseract をインストールする必要があります.おそらくパッケージ管理ツールの Homebrew を使ってインストールする方法が最も簡単だと思われます.Homebrew のインストールがまだの場合は,まず Homebrew のオリジナルサイトを参考にインストールします.

% /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" ⏎

Homebrew のインストール後に brew コマンドを使って tesseract をインストールします.

% brew install tesseract ⏎

目次に戻る

Tesseract による画像内文字認識(英語)

Tesseract のインストールが完了すれば,tesseract で利用できる言語を確認します.現時点では英語の認識はできるものの,日本語には対応していないことが確認できます.

% tesseract --list-langs ⏎
List of available languages in "/opt/homebrew/share/tessdata/" (3):
eng
osd
snum

次に,tesseract_data フォルダにある en_1_img.png ファイルの文字を認識し,result_en.txt というファイルに出力します.ここで, -l eng オプションは言語の指定です.この結果,正しく文字を認識していることがわかりました.なお,データは前のページを参考に準備してください.

(base) rinsaka@MacStudio2022 pyocr % tesseract tesseract_data/en_1_img.png result_en_1 -l eng ⏎
Estimating resolution as 318
(base) rinsaka@MacStudio2022 pyocr % cat result_en_1.txt ⏎
In this paper, we consider a nonparametric adaptive software rejuvenation schedule under a
random censored data. For u failure time data and v random censored data, we formulate
upper and lower bounds of the predictive system availability based on a nonparametric
predictive inference (NPI). Then, we derive adaptive rejuvenation policies which maximizes
the upper or lower bound. In simulation experiments, we show that estimates of the software
rejuvenation schedule are updated by acquisition of new failure data, and converge to the

theoretical optimal solution.
(base) rinsaka@MacStudio2022 pyocr %

目次に戻る

Tesseract の日本語対応

Tesseract で日本語文字の認識を行うためには,学習済みモデルのファイルをダウンロードしなければなりません.いくつか学習済みモデルが公開されていますが,ubuntu のパッケージを利用することで精度良く認識ができるようです.このために,ubuntu パッケージ:tesseract-ocr-jpn にある tesseract-lang_4.00~git30-7274cfa.orig.tar.xz ソースパッケージをダウンロードします(バージョンなどは異なる可能性があります).ダウンロードできたらファイルを展開します.様々な言語のファイルが展開されますが,jpn.traindeddata だけを利用します.なお,jpn_vert.traineddata は縦書き日本語の学習データです.必要に応じてこれも利用してください.

% tar -xvzf tesseract-lang_4.00~git30-7274cfa.orig.tar.xz ⏎
% cd tesseract-lang-4.00~git30-7274cfa ⏎
% ls -lah | grep jpn ⏎
-rw-r--r--@   1 rinsaka  staff   2.4M  2 22  2018 jpn.traineddata
-rw-r--r--@   1 rinsaka  staff   2.9M  9 16  2017 jpn_vert.traineddata
%

tesseract のインストール先と関連ファイルの保存先を確認します.最後の share/tessdata/ が学習済みファイルの保存先です.

% brew list tesseract ⏎
/opt/homebrew/Cellar/tesseract/5.2.0/bin/tesseract
/opt/homebrew/Cellar/tesseract/5.2.0/include/tesseract/ (12 files)
/opt/homebrew/Cellar/tesseract/5.2.0/lib/libtesseract.5.dylib
/opt/homebrew/Cellar/tesseract/5.2.0/lib/pkgconfig/tesseract.pc
/opt/homebrew/Cellar/tesseract/5.2.0/lib/ (2 other files)
/opt/homebrew/Cellar/tesseract/5.2.0/share/tessdata/ (35 files)
%

ファイルを格納すべきフォルダがわかったので,そのフォルダにファイルをコピーします.(必要に応じて縦書き日本語の学習データもコピーしてください.)

% cp jpn.traineddata /opt/homebrew/Cellar/tesseract/5.2.0/share/tessdata ⏎

ファイルがコピーできたことを念の為に確認しておきます.

% ls -l /opt/homebrew/Cellar/tesseract/5.2.0/share/tessdata ⏎
total 50056
drwxr-xr-x  27 rinsaka  admin       864  7  7 05:15 configs
-rw-r--r--   1 rinsaka  admin   4113088  7  7 05:15 eng.traineddata
-rw-r--r--@  1 rinsaka  admin   2471260  8 23 18:55 jpn.traineddata
-rw-r--r--   1 rinsaka  admin  10562727  7  7 05:15 osd.traineddata
-rw-r--r--   1 rinsaka  admin       572  7  7 05:15 pdf.ttf
-rw-r--r--   1 rinsaka  admin   8467391  7  7 05:15 snum.traineddata
drwxr-xr-x   8 rinsaka  admin       256  7  7 05:15 tessconfigs
%

コピーができれば,tesseract で利用可能な言語を確認します.日本語 (jpn) が表示されれば完了です.

% tesseract --list-langs ⏎
List of available languages in "/opt/homebrew/share/tessdata/" (4):
eng
jpn
osd
snum
%

では,日本語が含まれる画像の文字認識を実行します.

(base) rinsaka@MacStudio2022 pyocr % tesseract tesseract_data/ja_1_img.png result_ja_1 -l jpn ⏎
Estimating resolution as 452
(base) rinsaka@MacStudio2022 pyocr % cat result_ja_1.txt ⏎
研究者が自身で収集した学術論文の文献 PDF ファイルを効率的に管理し, 研究活動に有
効活用することを目的として, 文献 PDF データベースシステムを開発した. 利用者は PDF
ファイルを Web プラウザからサーバにアップロードすることとで, PDEF ファイルを一元的
に管理できるようになるとともに, 全文検索. ジャーナル検索, 著者検索. タグ (キーワー
ド) 検索が利用できるようになる. また, 論文情報の登録などに BIBTEX 情報を活用する
ことも本システムの特徴のひとつである. 本論文では文献 PDF データベースシステムの
詳細について議論するとともに, 性能評価実験の結果を考察する.
(base) rinsaka@MacStudio2022 pyocr %

ここまでの作業で macOS のターミナルを利用して tesseract の文字認識ができるようになりました.次は Python で文字認識を行います.

目次に戻る

Python での文字認識(インストール)

ここでは Python の仮想環境を作成して文字認識を行ってみます.なお,仮想環境を構築せずに base 環境に直接 pyocr をインストールすることもできると思われます.

まず,py39ocr という名前で Python 3.9 の仮想環境を作成します.

(base) rinsaka@MacStudio2022 pyocr % conda create -n py39ocr python=3.9 ⏎

構築した仮想環境に入ります.

(base) rinsaka@MacStudio2022 apyocri % conda activate py39ocr ⏎
(py39ocr) rinsaka@MacStudio2022 pyocr %

pip コマンドでインストール済みのパッケージを確認します.

(py39ocr) rinsaka@MacStudio2022 pyocr % pip list ⏎
Package    Version
---------- -------
pip        22.2.2
setuptools 65.2.0
wheel      0.37.1
(py39ocr) rinsaka@MacStudio2022 pyocr %

Python から OCR を実行するために pyocr パッケージをインストールします.パッケージ pyocr をインストールすると Pillow も同時にインストールされることが確認できました.

(py39ocr) rinsaka@MacStudio2022 pyocr % pip install pyocr ⏎
Collecting pyocr
  Downloading pyocr-0.8.3.tar.gz (67 kB)
     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 67.6/67.6 kB 1.4 MB/s eta 0:00:00
  Preparing metadata (setup.py) ... done
Collecting Pillow
  Using cached Pillow-9.2.0-cp39-cp39-macosx_11_0_arm64.whl (2.8 MB)
Building wheels for collected packages: pyocr
  Building wheel for pyocr (setup.py) ... done
  Created wheel for pyocr: filename=pyocr-0.8.3-py3-none-any.whl size=37342 sha256=501f18a08efcc4593d8d176734bb94b57fbb23bae55c855ccf59aed92c66b059
  Stored in directory: /Users/rinsaka/Library/Caches/pip/wheels/fd/77/6a/e7f97be77dd46cc892e7b5fd9914f28a2b2fbf0bba86929607
Successfully built pyocr
Installing collected packages: Pillow, pyocr
Successfully installed Pillow-9.2.0 pyocr-0.8.3
(py39ocr) rinsaka@MacStudio2022 pyocr % pip list ⏎
Package    Version
---------- -------
Pillow     9.2.0
pip        22.2.2
pyocr      0.8.3
setuptools 65.2.0
wheel      0.37.1
(py39ocr) rinsaka@MacStudio2022 pyocr %

さらに pytesseract もインストールします.

(py39ocr) rinsaka@MacStudio2022 pyocr % pip install pytesseract ⏎
Collecting pytesseract
  Downloading pytesseract-0.3.10-py3-none-any.whl (14 kB)
Collecting packaging>=21.3
  Using cached packaging-21.3-py3-none-any.whl (40 kB)
Requirement already satisfied: Pillow>=8.0.0 in /Users/rinsaka/miniforge3/envs/py39ocr/lib/python3.9/site-packages (from pytesseract) (9.2.0)
Collecting pyparsing!=3.0.5,>=2.0.2
  Using cached pyparsing-3.0.9-py3-none-any.whl (98 kB)
Installing collected packages: pyparsing, packaging, pytesseract
Successfully installed packaging-21.3 pyparsing-3.0.9 pytesseract-0.3.10
(py39ocr) rinsaka@MacStudio2022 pyocr % pip list ⏎
Package     Version
----------- -------
packaging   21.3
Pillow      9.2.0
pip         22.2.2
pyocr       0.8.3
pyparsing   3.0.9
pytesseract 0.3.10
setuptools  65.2.0
wheel       0.37.1
(py39ocr) rinsaka@MacStudio2022 pyocr %

Jupyter Notebook を利用するのであればインストールします.

(py39ocr) rinsaka@MacStudio2022 pyocr % pip install jupyter ⏎

目次に戻る

Python での文字認識

各種パッケージのインストールができれば Jupyter Notebook を起動します.

(py39ocr) rinsaka@MacStudio2022 pyocr % jupyter notebook ⏎

まず,言語を英語に設定して tesseract_data フォルダにある en_1_img.png から文字を認識します.

import os
from PIL import Image
import pyocr
import pyocr.builders

file_path = os.path.sep.join(['tesseract_data', 'en_1_img.png'])
lang = 'eng'

tool = pyocr.get_available_tools()[0]
text = tool.image_to_string(
    Image.open(file_path),
    lang=lang,
    builder=pyocr.builders.TextBuilder()
)

print('file_path:', file_path)
print('lang: ', lang)
print('----------')
print(text)
file_path: tesseract_data/en_1_img.png
lang:  eng
----------
In this paper, we consider a nonparametric adaptive software rejuvenation schedule under a
random censored data. For u failure time data and v random censored data, we formulate
upper and lower bounds of the predictive system availability based on a nonparametric
predictive inference (NPI). Then, we derive adaptive rejuvenation policies which maximizes
the upper or lower bound. In simulation experiments, we show that estimates of the software
rejuvenation schedule are updated by acquisition of new failure data, and converge to the

theoretical optimal solution.

日本語の場合でも言語設定を変更するだけで認識ができます.なお,「ブラウザ」を「プラウザ」,「PDF」を「PDEF」と認識したり,「,」を「.」と認識するなど,僅かな誤認識が含まれています.

import os
from PIL import Image
import pyocr
import pyocr.builders

file_path = os.path.sep.join(['tesseract_data', 'ja_1_img.png'])
lang = 'jpn'

tool = pyocr.get_available_tools()[0]
text = tool.image_to_string(
    Image.open(file_path),
    lang=lang,
    builder=pyocr.builders.TextBuilder()
)

print('file_path:', file_path)
print('lang: ', lang)
print('----------')
print(text)
file_path: tesseract_data/ja_1_img.png
lang:  jpn
----------
研究者が自身で収集した学術論文の文献 PDF ファイルを効率的に管理し, 研究活動に有
効活用することを目的として, 文献 PDF データベースシステムを開発した. 利用者は PDF
ファイルを Web プラウザからサーバにアップロードすることとで, PDEF ファイルを一元的
に管理できるようになるとともに, 全文検索. ジャーナル検索, 著者検索. タグ (キーワー
ド) 検索が利用できるようになる. また, 論文情報の登録などに BIBTEX 情報を活用する
ことも本システムの特徴のひとつである. 本論文では文献 PDF データベースシステムの
詳細について議論するとともに, 性能評価実験の結果を考察する.

目次に戻る