文字認識¶
この章では、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で問題が解決できない場合は、画像特徴マッチングインターフェースを使用して画像マッチングを試すこともできます。