日本語特化OCR「YomiToku」を自作プログラムから動かす【備忘録】

お疲れ様です。

今回はOCR光学文字認識)のお話。

OCR(Optical Character Recognition:光学的文字認識)は画像に含まれる文字をコンピュータで認識できるテキストの形で読み取る技術のこと。

最近だとOSSYomiTokuが日本語特化OCRとしてはとても優秀です。

使い方にもあるようにターミナル上からコマンドで実行することができます。
例えば以下のコマンドを実行すると、画像内のレイアウトと文字を検出し、検出した情報を可視化した画像ファイルとmarkdownでテキストをファイル出力してくれます。 ./imagesに解析したい画像ファイルを入れる形です。

yomitoku ./images -f md -v

  • 検出結果 detect

検出したテキスト

今宵の月のように

作詞 · 作曲 宮本浩次

編曲 宮本浩次 佐久間正英

くだらねえとつぶやいて
醒めたつらして歩く
いつの日か輝くだろう
あふれる熱い涙

いつまでも続くのか
吐きすてて寝転んだ
俺もまた輝くだろう
今宵の月のように

夕暮れ過ぎて きらめく町の灯りは

悲しい色に 染まって揺れた

君がいつかくれた 思い出のかけら集めて
真夏の夜空 ひとり見上げた

新しい季節の始まりは

夏の風 町に吹くのさ

このようにコマンドだけでも十分に使えるのですが、Pythonのライブラリとしても使用することができます。 自作のプログラムに組み込むこともできるということです。
ライブラリとして使用できるという情報はほとんど見当たらなかったので個人的に調べて、簡単に実装したものをメモとして残しておきます。

ソースコード

ソースコードGithubに置いてありますので必要に応じてご参照ください。   github.com

※Yomitokuのバージョンは2025年10月時点の最新バージョン0.9.5です。

import os
os.environ["HF_HOME"] = "./pretrained"
from pathlib import Path

from yomitoku import TextDetector, TextRecognizer

import cv2
import pandas as pd

td = TextDetector()
tr = TextRecognizer()

Path("./result").mkdir(parents=True, exist_ok=True)

anno_dict = {"img": [], "text": []}

image_dir_path = Path(".images")
for image_path in image_dir_path.glob("*"):
    img = cv2.imread(image_path)
    
    layout = td(img)
    
    for i, pt in enumerate(layout[0].points):
        x1, y1 = pt[0]
        x2, y2 = pt[2]
        
        try:
            crop_img = img
            crop_img = crop_img[y1:y2, x1:x2]
            crop_img_name = f"{Path(image_path).stem}_{i+1}.png"
            cv2.imwrite(f"./result/{crop_img_name}", crop_img)
        except:
            continue
        
        result = tr(crop_img)
        text = result[0].contents[0]
        text = text.replace("·", "・")
        
        anno_dict["img"].append(crop_img_name)
        anno_dict["text"].append(text)
        print(text)
    
anno_df = pd.DataFrame(anno_dict)
anno_df.to_csv("./result/annotations.csv", encoding="cp932", index=False)

YomiTokuからはTextDetectorTextRecognizerをインポートしています。

  • TextDetector
    画像から文章や文字の部分を検出する。(物体検出の部分)
    検出した矩形の座標などの情報を出力する。

  • TextRecognizer
    画像内の文字をテキストとして検出する。(OCRの部分) 入力は画像と文字部分を囲う座標情報です。上記のTextDetectorで出力した座標が使えます。
    座標情報はオプションなので入力は必須ではないです。入力なしの場合は画像全体を見ますが、おそらく座標で切り出すことを前提としているのでそのままではうまく検出できないはず。

プログラムではTextDetectorで得られた座標情報から左上座標と右下座標を取得してクロップし、クロップ後の画像を入力してテキスト出力させています。

出力はこんな感じになります。AI OCRのモデル学習に使うデータのアノテーションに使えます。というか、それを想定して作りました。
(もちろん画像によっては誤検出もあるのでそれらは人の目で確認する必要はあります…。)

output

anno

他にも機能はあるので、いろいろと使えそうです。
本当に高精度で扱いやすいのですが、商用利用は有償なので手軽には使えないのが残念…。 業務で使う機会があったら是非使いたいです。