クイック スタート:Computer Vision の REST API と Python を使用して印刷されたテキストと手書きテキストを抽出するQuickstart: Extract printed and handwritten text using the Computer Vision REST API and Python

このクイックスタートでは、Computer Vision の REST API を使って、印刷および手書きのテキストを画像から抽出します。In this quickstart, you'll extract printed and handwritten text from an image using the Computer Vision REST API. 読み取り読み取り結果の取得メソッドを使うと、画像内のテキストを検出し、認識した文字をマシンで読み取り可能な文字ストリームに抽出することができます。With the Read and Get Read Result methods, you can detect text in an image and extract recognized characters into a machine-readable character stream.

重要

読み取りメソッドは、非同期で実行されます。The Read method runs asynchronously. このメソッドは、正常な応答の本文では任意の情報を返しません。This method does not return any information in the body of a successful response. 代わりに、バッチ読み取りメソッドは、Operation-Location 応答ヘッダー フィールドの値に URI を返します。Instead, the Batch Read method returns a URI in the value of the Operation-Location response header field. その後、読み取り結果の取得 API を表すこの URI を呼び出して、状態をチェックし、読み取りメソッド呼び出しの結果を返すことができます。You can then call this URI, which represents the Get Read Result API, to both check the status and return the results of the Read method call.


このクイック スタートは、MyBinder 上で Jupyter Notebook を使い、ステップ バイ ステップで実行することができます。You can run this quickstart in a step-by step fashion using a Jupyter notebook on MyBinder. Binder を起動するには、次のボタンを選択します。To launch Binder, select the following button:

Binder の起動ボタンThe launch Binder button

前提条件Prerequisites

  • Azure サブスクリプション - 無料アカウントを作成しますAn Azure subscription - Create one for free
  • PythonPython
  • Azure サブスクリプションを入手したら、Azure portal で Computer Vision リソースを作成し、キーとエンドポイントを取得します。Once you have your Azure subscription, create a Computer Vision resource in the Azure portal to get your key and endpoint. デプロイされたら、 [リソースに移動] をクリックします。After it deploys, click Go to resource.
    • 対象のアプリケーションを Computer Vision サービスに接続するには、作成したリソースのキーとエンドポイントが必要です。You will need the key and endpoint from the resource you create to connect your application to the Computer Vision service. このクイックスタートで後に示すコードに、自分のキーとエンドポイントを貼り付けます。You'll paste your key and endpoint into the code below later in the quickstart.
    • Free 価格レベル (F0) を使用してサービスを試用し、後から運用環境用の有料レベルにアップグレードすることができます。You can use the free pricing tier (F0) to try the service, and upgrade later to a paid tier for production.
  • キーとエンドポイント URL 用に、それぞれ COMPUTER_VISION_SUBSCRIPTION_KEYCOMPUTER_VISION_ENDPOINT という名前の環境変数を作成します。Create environment variables for the key and endpoint URL, named COMPUTER_VISION_SUBSCRIPTION_KEY and COMPUTER_VISION_ENDPOINT, respectively.

サンプルの作成と実行Create and run the sample

このサンプルを作成して実行するには、次の手順を実行します。To create and run the sample, do the following steps:

  1. テキスト エディターに次のコードをコピーします。Copy the following code into a text editor.
  2. 必要に応じて、テキストを抽出したい別の画像の URL で image_url 値を置き換えます。Optionally, replace the value of image_url with the URL of a different image from which you want to extract text.
  3. .py 拡張子のファイルとして、コードを保存します。Save the code as a file with an .py extension. たとえば、「 get-text.py 」のように入力します。For example, get-text.py.
  4. コマンド プロンプト ウィンドウを開きます。Open a command prompt window.
  5. プロンプトで、python コマンドを使用してサンプルを実行します。At the prompt, use the python command to run the sample. たとえば、「 python get-text.py 」のように入力します。For example, python get-text.py.
import json
import os
import sys
import requests
import time
# If you are using a Jupyter notebook, uncomment the following line.
# %matplotlib inline
import matplotlib.pyplot as plt
from matplotlib.patches import Polygon
from PIL import Image
from io import BytesIO

missing_env = False
# Add your Computer Vision subscription key and endpoint to your environment variables.
if 'COMPUTER_VISION_ENDPOINT' in os.environ:
    endpoint = os.environ['COMPUTER_VISION_ENDPOINT']
else:
    print("From Azure Cognitive Service, retrieve your endpoint and subscription key.")
    print("\nSet the COMPUTER_VISION_ENDPOINT environment variable, such as \"https://westus2.api.cognitive.microsoft.com\".\n")
    missing_env = True

if 'COMPUTER_VISION_SUBSCRIPTION_KEY' in os.environ:
    subscription_key = os.environ['COMPUTER_VISION_SUBSCRIPTION_KEY']
else:
    print("From Azure Cognitive Service, retrieve your endpoint and subscription key.")
    print("\nSet the COMPUTER_VISION_SUBSCRIPTION_KEY environment variable, such as \"1234567890abcdef1234567890abcdef\".\n")
    missing_env = True

if missing_env:
    print("**Restart your shell or IDE for changes to take effect.**")
    sys.exit()

text_recognition_url = endpoint + "/vision/v3.1/read/analyze"

# Set image_url to the URL of an image that you want to recognize.
image_url = "https://raw.githubusercontent.com/MicrosoftDocs/azure-docs/master/articles/cognitive-services/Computer-vision/Images/readsample.jpg"

headers = {'Ocp-Apim-Subscription-Key': subscription_key}
data = {'url': image_url}
response = requests.post(
    text_recognition_url, headers=headers, json=data)
response.raise_for_status()

# Extracting text requires two API calls: One call to submit the
# image for processing, the other to retrieve the text found in the image.

# Holds the URI used to retrieve the recognized text.
operation_url = response.headers["Operation-Location"]

# The recognized text isn't immediately available, so poll to wait for completion.
analysis = {}
poll = True
while (poll):
    response_final = requests.get(
        response.headers["Operation-Location"], headers=headers)
    analysis = response_final.json()
    
    print(json.dumps(analysis, indent=4))

    time.sleep(1)
    if ("analyzeResult" in analysis):
        poll = False
    if ("status" in analysis and analysis['status'] == 'failed'):
        poll = False

polygons = []
if ("analyzeResult" in analysis):
    # Extract the recognized text, with bounding boxes.
    polygons = [(line["boundingBox"], line["text"])
                for line in analysis["analyzeResult"]["readResults"][0]["lines"]]

# Display the image and overlay it with the extracted text.
image = Image.open(BytesIO(requests.get(image_url).content))
ax = plt.imshow(image)
for polygon in polygons:
    vertices = [(polygon[0][i], polygon[0][i+1])
                for i in range(0, len(polygon[0]), 2)]
    text = polygon[1]
    patch = Polygon(vertices, closed=True, fill=False, linewidth=2, color='y')
    ax.axes.add_patch(patch)
    plt.text(vertices[0][0], vertices[0][1], text, fontsize=20, va="top")
plt.show()

結果の確認Examine the response

成功応答が JSON で返されます。A successful response is returned in JSON. サンプルの Web ページによって成功応答が解析され、次の例のようにコマンド プロンプト ウィンドウに表示されます。The sample webpage parses and displays a successful response in the command prompt window, similar to the following example:

{
  "status": "succeeded",
  "createdDateTime": "2020-05-28T05:13:21Z",
  "lastUpdatedDateTime": "2020-05-28T05:13:22Z",
  "analyzeResult": {
    "version": "3.1.0",
    "readResults": [
      {
        "page": 1,
        "language": "en",
        "angle": 0.8551,
        "width": 2661,
        "height": 1901,
        "unit": "pixel",
        "lines": [
          {
            "boundingBox": [
              67,
              646,
              2582,
              713,
              2580,
              876,
              67,
              821
            ],
            "text": "The quick brown fox jumps",
            "words": [
              {
                "boundingBox": [
                  143,
                  650,
                  435,
                  661,
                  436,
                  823,
                  144,
                  824
                ],
                "text": "The",
                "confidence": 0.958
              },
              {
                "boundingBox": [
                  540,
                  665,
                  926,
                  679,
                  926,
                  825,
                  541,
                  823
                ],
                "text": "quick",
                "confidence": 0.57
              },
              {
                "boundingBox": [
                  1125,
                  686,
                  1569,
                  700,
                  1569,
                  838,
                  1125,
                  828
                ],
                "text": "brown",
                "confidence": 0.799
              },
              {
                "boundingBox": [
                  1674,
                  703,
                  1966,
                  711,
                  1966,
                  851,
                  1674,
                  841
                ],
                "text": "fox",
                "confidence": 0.442
              },
              {
                "boundingBox": [
                  2083,
                  714,
                  2580,
                  725,
                  2579,
                  876,
                  2083,
                  855
                ],
                "text": "jumps",
                "confidence": 0.878
              }
            ]
          },
          {
            "boundingBox": [
              187,
              1062,
              485,
              1056,
              486,
              1120,
              189,
              1126
            ],
            "text": "over",
            "words": [
              {
                "boundingBox": [
                  190,
                  1064,
                  439,
                  1059,
                  441,
                  1122,
                  192,
                  1126
                ],
                "text": "over",
                "confidence": 0.37
              }
            ]
          },
          {
            "boundingBox": [
              664,
              1008,
              1973,
              1023,
              1969,
              1178,
              664,
              1154
            ],
            "text": "the lazy dog!",
            "words": [
              {
                "boundingBox": [
                  668,
                  1008,
                  923,
                  1015,
                  923,
                  1146,
                  669,
                  1117
                ],
                "text": "the",
                "confidence": 0.909
              },
              {
                "boundingBox": [
                  1107,
                  1018,
                  1447,
                  1023,
                  1445,
                  1178,
                  1107,
                  1162
                ],
                "text": "lazy",
                "confidence": 0.853
              },
              {
                "boundingBox": [
                  1639,
                  1024,
                  1974,
                  1023,
                  1971,
                  1170,
                  1636,
                  1178
                ],
                "text": "dog!",
                "confidence": 0.41
              }
            ]
          }
        ]
      }
    ]
  }
}

次のステップNext steps

次は、Computer Vision を使用して光学文字認識 (OCR) を実行する Python アプリケーションについて説明します。これは、スマートにクロップされたサムネイルを作成し、イメージ内の視覚的な特徴を検出、カテゴライズ、タグ付け、および記述します。Next, explore a Python application that uses Computer Vision to perform optical character recognition (OCR); create smart-cropped thumbnails; and detect, categorize, tag, and describe visual features in images.