文字認識

この章では、OCRを使用してインターフェース操作を補助する方法を紹介します。ゲームなどのアプリケーションでは、通常のインターフェースセレクタが使用できない場合があります。そのようなときにOCR方式を選択できます。OCR認識方式は、要素の存在確認、クリック、スクリーンショットなどの操作のみをサポートします。OCRバックエンドライブラリは、paddleocr、easyocr、およびカスタムHTTPバックエンドインターフェースをサポートします。

OCRバックエンドの設定

OCR認識方式を使用する前に、まずOCRバックエンドを設定する必要があり、事前に依存ライブラリをインストールしておく必要があります。

注目

クラスタを使用する場合、つまり同じコンピュータで複数のデバイスを制御する場合は、必ずOCR HTTPインターフェースとして自作してください。paddleocrやeasyocrを直接使用すると、各プロセスが重複して読み込まれるため、大量のローカルメモリや計算リソースを消費します。

バックエンドとしてpaddleocrを使用し、認識用のスクリーンショット品質を80とし、GPUアクセラレーションを有効にします。

d.setup_ocr_backend("paddleocr", quality=80, use_gpu=True, drop_score=0.85, use_space_char=True)

バックエンドとしてeasyocrを使用し、認識用のスクリーンショット品質を80とし、簡体字中国語と英語を認識します。

d.setup_ocr_backend("easyocr", ["ch_sim", "en"], quality=80)

setup_ocr_backendの追加パラメータは、インスタンスを初期化する際のパラメータと一致させる必要があります。上記のパラメータのスペルが不明な場合は、以下の公式のインスタンス化パラメータを参照し、上記のコードと比較してください。

paddleocr.PaddleOCR(use_gpu=True, drop_score=0.85, use_space_char=True)
easyocr.Reader(["ch_sim", "en"])

カスタムOCRバックエンドは、主に多数のデバイスを制御する場合や、ローカルにGPUアクセラレーションがない場合などに使用します。作成した認識機能をHTTPサービスとしてデプロイし、カスタムバックエンドでリクエストを送信してリモート認識を行うことができます。CustomOcrBackendを継承して記述し、要求された形式に従って認識結果をフォーマットする必要があります。また、弊社が提供するpaddle_ocr_http_backend.pyでレスポンス形式の定義を確認でき、若干の修正を加えた上でそのままそのサービスをデプロイすることも可能です。

class HttpOcrBackend(CustomOcrBackend):
    def __init__(self, url, auth):
        self.auth = auth
        self.url = url
    def ocr(self, image: bytes):
        r = requests.post(self.url, headers={"X-Auth": self.auth},
                                                    data=image)
        return r.json()

その後、OCR認識バックエンドサービスをカスタムサービスクラスとして設定します。

d.setup_ocr_backend(HttpOcrBackend, "http://server/ocr", "Secret")

OCRセレクタ

現在、OCR認識のセレクタは以下の種類をサポートしています。

text

完全なテキストに一致します。

element = d.ocr(text="私の")

textContains

部分的なテキストを含む一致です。

element = d.ocr(textContains="私の")

textMatches

テキストの正規表現一致です。

element = d.ocr(textMatches=".*?私の")

OCR操作

現在、OCR認識のセレクタは以下の関連操作をサポートしています。

click

選択した要素をクリックします。

element.click()

click_exists

要素が存在する場合、クリックします。

element.click_exists()

exists

要素が存在するかどうかを確認します。

element.exists()

screenshot

一致する要素のスクリーンショットを取得します。

element.screenshot(100).save("element.png")

info

一致したOCR情報を取得します。

element.info()

豆知識

それでもOCRで問題が解決できない場合は、画像特徴マッチングインターフェースを使用して画像マッチングを試すこともできます。