Help us understand the problem. What is going on with this article?

画像をOCRして検索用のテキストファイルを作る

More than 1 year has passed since last update.

環境

  • Windows 10
  • Python 3.7.1 (Anaconda3-2018.12-Windows-x86_64)
  • pyocr
  • Tesseract OCR 4.0.0

Tesseract OCRとpyocrは以下の記事を参考に入れた。
PythonでOCR

フォルダ内の全画像のOCR

とりあえずフォルダ内の全画像にOCR掛ける雑なツールを作った。
遅いので並列化した→ 画像からOCRテキスト出すやつを並列化する
以下のソースは勉強用にしてください。

from PIL import Image
import sys

import pyocr
import pyocr.builders
import glob
import os

tools = pyocr.get_available_tools()
if len(tools) == 0:
    print("No OCR tool found")
    sys.exit(1)
# The tools are returned in the recommended order of usage
tool = tools[0]
print("Will use tool '%s'" % (tool.get_name()))
# Ex: Will use tool 'libtesseract'

langs = tool.get_available_languages()
print("Available languages: %s" % ", ".join(langs))
lang = langs[0]
print("Will use lang '%s'" % (lang))

ocrtext = ""
for p in glob.glob('./**', recursive=True): # ディレクトリとファイル取得
       if os.path.isfile(p):
           # ファイルの場合
           name,ext = os.path.splitext(p)
           if ".jpg" == ext or ".png" == ext or ".gif" == ext:
                txt = tool.image_to_string(
                    Image.open(p),
                    lang="jpn",
                    builder=pyocr.builders.TextBuilder(tesseract_layout=6)
                )
                ocrtext += p + ":\n" + txt + "\n\n"
                print( p )
                print( txt )

f = open('ocrtext.txt', 'w', encoding='utf-8')
f.write(ocrtext)
f.close()

これでOCR済みテキストが保存できる。

これにエディタとかで検索をかければ手動で画像探す時のインデックス代わりに使えそう。

ただし、実行にかなり時間がかかった。約2500画像ほどで約1時間(CPUはRyzen7 2700X)。
CPU使用率が20%程度と低く、シングルスレッドでちくちく動いてしまっているのでなんとかしたい。
1日経たずに並列化した→画像からOCRテキスト出すやつを並列化する

2/27追記: なんか"UnicodeEncodeError: 'cp932' codec can't encode character ..."とエラーが出た。
書き込み時のエンコーディング指定忘れが原因だった。ちゃんとencoding='utf-8'をつけましょう…。

ltzz
仕事ではバックエンドしてます。元組み込み屋。いろいろ。
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away