手書きを検出する(OCR)

光学式文字認識(OCR)

Vision API では、画像からテキストを検出、抽出できます。

  • DOCUMENT_TEXT_DETECTION は画像からテキストを抽出します。レスポンスは高密度のテキストやドキュメント向けに最適化されています。ページ、ブロック、段落、単語、改行の情報が JSON に含まれます。

DOCUMENT_TEXT_DETECTION の用途の 1 つとして、画像内の手書き文字の検出が挙げられます。

コードサンプル

さまざまなプログラミング言語でのサンプルについては、以下をご覧ください。

ドキュメント テキスト検出リクエスト

GCP プロジェクトと認証の設定

手書きを検出する

画像上の手書きを検出するには、画像のファイルパスまたは公開 URL を Cloud Vision API に渡します。

curl コマンド

Linux または MacOS のコマンドラインから curl を使用して手書き文字検出のリクエストを行うには、https://vision.googleapis.com/v1/images:annotate エンドポイントに対して POST リクエストを発行し、features.type の値として DOCUMENT_TEXT_DETECTION を指定します。その例を以下に示します。

curl -X POST \
     -H "Authorization: Bearer "$(gcloud auth application-default print-access-token) \
     -H "Content-Type: application/json; charset=utf-8" \
     --data "{
      'requests': [
        {
          'image': {
            'source': {
              'imageUri': 'gs://vision-api-handwriting-ocr-bucket/handwriting_image.png'
            }
          },
          'features': [
            {
              'type': 'DOCUMENT_TEXT_DETECTION'
            }
          ]
        }
      ]
    }" "https://vision.googleapis.com/v1/images:annotate"

画像は 3 種類の方法(base64 エンコード文字列(前述)、Google Cloud Storage URI、ウェブ URL)で渡すことができます。詳しくは、リクエストの作成をご覧ください。

リクエストの本文の構成について詳しくは、AnnotateImageRequest のリファレンス ドキュメントをご覧ください。

gcloud コマンド

エンティティ分析を実行するには、次の例に示すように gcloud ml vision detect-document コマンドを使用します。

gcloud ml vision detect-document "gs://vision-api-handwriting-ocr-bucket/handwriting_image.png"

PowerShell

Windows PowerShell を使用して手書き文字検出のリクエストを行うには、https://vision.googleapis.com/v1/images:annotate エンドポイントに対して POST リクエストを発行し、features.type の値として DOCUMENT_TEXT_DETECTION を指定します。その例を以下に示します。

$cred = gcloud auth application-default print-access-token
$headers = @{ Authorization = "Bearer $cred" }

Invoke-WebRequest `
  -Method Post `
  -Headers $headers `
  -ContentType: "application/json; charset=utf-8" `
  -Body "{
      'requests': [
        {
          'image': {
            'source': {
              'imageUri': 'gs://vision-api-handwriting-ocr-bucket/handwriting_image.png'
            }
          },
          'features': [
            {
              'type': 'DOCUMENT_TEXT_DETECTION'
            }
          ]
        }
      ]
    }" `
  -Uri "https://vision.googleapis.com/v1/images:annotate" | Select-Object -Expand Content

画像の渡し方は 3 種類あります(base64 エンコード文字列、Google Cloud Storage URI、HTTPS または HTTP でアクセス可能な公開 URL)。詳しくは、リクエストの作成をご覧ください。

リクエストの本文の構成について詳しくは、AnnotateImageRequest のリファレンス ドキュメントをご覧ください。

ドキュメント テキスト検出のレスポンス

DOCUMENT_TEXT_DETECTION レスポンスには、ページ、ブロック、段落、単語、および改行の情報など、付加的なレイアウト情報と、それぞれの信頼スコアが含まれています。(以下のサンプルでは簡素化された例が使用されています。高密度ドキュメントのレスポンスは長すぎるため、このページに表示できません)。

{
  "responses": [
    {
      "textAnnotations": [
        {
          "locale": "en",
          "description": "Google Cloud\nPlatform\n",
          "boundingPoly": {
            "vertices": [
              {
                "x": 312,
                "y": 95
              },
              {
                "x": 694,
                "y": 95
              },
              {
                "x": 694,
                "y": 253
              },
              {
                "x": 312,
                "y": 253
              }
            ]
          }
        },
        {
          "description": "Google",
          "boundingPoly": {
            "vertices": [
              {
                "x": 312,
                "y": 103
              },
              {
                "x": 530,
                "y": 99
              },
              {
                "x": 531,
                "y": 172
              },
              {
                "x": 313,
                "y": 176
              }
            ]
          }
        },
        {
          "description": "Cloud",
          "boundingPoly": {
            "vertices": [
              {
                "x": 602,
                "y": 97
              },
              {
                "x": 693,
                "y": 95
              },
              {
                "x": 694,
                "y": 168
              },
              {
                "x": 603,
                "y": 170
              }
            ]
          }
        },
        {
          "description": "Platform",
          "boundingPoly": {
            "vertices": [
              {
                "x": 429,
                "y": 190
              },
              {
                "x": 582,
                "y": 190
              },
              {
                "x": 582,
                "y": 253
              },
              {
                "x": 429,
                "y": 253
              }
            ]
          }
        }
      ],
      "fullTextAnnotation": {
        "pages": [
          {
            "property": {
              "detectedLanguages": [
                {
                  "languageCode": "en",
                  "confidence": 1
                }
              ]
            },
            "width": 850,
            "height": 550,
            "blocks": [
              {
                "boundingBox": {
                  "vertices": [
                    {
                      "x": 312,
                      "y": 103
                    },
                    {
                      "x": 693,
                      "y": 95
                    },
                    {
                      "x": 696,
                      "y": 250
                    },
                    {
                      "x": 315,
                      "y": 258
                    }
                  ]
                },
                "paragraphs": [
                  {
                    "boundingBox": {
                      "vertices": [
                        {
                          "x": 312,
                          "y": 103
                        },
                        {
                          "x": 693,
                          "y": 95
                        },
                        {
                          "x": 694,
                          "y": 168
                        },
                        {
                          "x": 313,
                          "y": 176
                        }
                      ]
                    },
                    "words": [
                      {
                        "property": {
                          "detectedLanguages": [
                            {
                              "languageCode": "en"
                            }
                          ]
                        },
                        "boundingBox": {
                          "vertices": [
                            {
                              "x": 312,
                              "y": 103
                            },
                            {
                              "x": 530,
                              "y": 99
                            },
                            {
                              "x": 531,
                              "y": 172
                            },
                            {
                              "x": 313,
                              "y": 176
                            }
                          ]
                        },
                        "symbols": [
                          {
                            "property": {
                              "detectedLanguages": [
                                {
                                  "languageCode": "en"
                                }
                              ]
                            },
                            "boundingBox": {
                              "vertices": [
                                {
                                  "x": 312,
                                  "y": 104
                                },
                                {
                                  "x": 371,
                                  "y": 103
                                },
                                {
                                  "x": 372,
                                  "y": 175
                                },
                                {
                                  "x": 313,
                                  "y": 176
                                }
                              ]
                            },
                            "text": "G",
                            "confidence": 0.99
                          },
                          ...
                        ],
                        "confidence": 0.99
                      },
                      {
                        "property": {
                          "detectedLanguages": [
                            {
                              "languageCode": "en"
                            }
                          ]
                        },
                        "boundingBox": {
                          "vertices": [
                            {
                              "x": 602,
                              "y": 97
                            },
                            {
                              "x": 693,
                              "y": 95
                            },
                            {
                              "x": 694,
                              "y": 168
                            },
                            {
                              "x": 603,
                              "y": 170
                            }
                          ]
                        },
                        "symbols": [
                          {
                            "property": {
                              "detectedLanguages": [
                                {
                                  "languageCode": "en"
                                }
                              ]
                            },
                            "boundingBox": {
                              "vertices": [
                                {
                                  "x": 602,
                                  "y": 98
                                },
                                {
                                  "x": 620,
                                  "y": 98
                                },
                                {
                                  "x": 621,
                                  "y": 170
                                },
                                {
                                  "x": 603,
                                  "y": 170
                                }
                              ]
                            },
                            "text": "C",
                            "confidence": 0.99
                          },
                          ...
                        ],
                        "confidence": 0.99
                      }
                    ],
                    "confidence": 0.99
                  },
                  {
                    "boundingBox": {
                      "vertices": [
                        {
                          "x": 429,
                          "y": 190
                        },
                        {
                          "x": 582,
                          "y": 190
                        },
                        {
                          "x": 582,
                          "y": 253
                        },
                        {
                          "x": 429,
                          "y": 253
                        }
                      ]
                    },
                    "words": [
                      {
                        "property": {
                          "detectedLanguages": [
                            {
                              "languageCode": "en"
                            }
                          ]
                        },
                        "boundingBox": {
                          "vertices": [
                            {
                              "x": 429,
                              "y": 190
                            },
                            {
                              "x": 582,
                              "y": 190
                            },
                            {
                              "x": 582,
                              "y": 253
                            },
                            {
                              "x": 429,
                              "y": 253
                            }
                          ]
                        },
                        "symbols": [
                          {
                            "property": {
                              "detectedLanguages": [
                                {
                                  "languageCode": "en"
                                }
                              ]
                            },
                            "boundingBox": {
                              "vertices": [
                                {
                                  "x": 429,
                                  "y": 190
                                },
                                {
                                  "x": 449,
                                  "y": 190
                                },
                                {
                                  "x": 449,
                                  "y": 253
                                },
                                {
                                  "x": 429,
                                  "y": 253
                                }
                              ]
                            },
                            "text": "P",
                            "confidence": 0.92
                          },
                          ...
                        ],
                        "confidence": 0.97
                      }
                    ],
                    "confidence": 0.97
                  }
                ],
                "blockType": "TEXT",
                "confidence": 0.98
              }
            ]
          }
        ],
        "text": "Google Cloud\nPlatform\n"
      }
    }
  ]
}

言語を指定する(オプション)

どちらのタイプの OCR リクエストでも、画像内の任意のテキストの言語を指定する 1 つ以上の languageHints がサポートされています。しかし、ほとんどの場合、値を空にして自動言語検出を有効にしておくことによって最善の結果が得られます。ラテン アルファベット系の言語の場合、languageHints の設定は不要です。画像中のテキストの言語がわかっている場合などに、ヒントを設定すると結果が少し良くなります(逆に、ヒントを間違えると大きな障害となります)。サポートされる言語以外の言語が 1 つでも指定されていると、テキスト検出でエラーが返されます。

試してみる

以下のテキスト検出とドキュメント テキスト検出をお試しください。[実行] をクリックして、すでに指定されている画像(gs://vision-api-handwriting-ocr-bucket/handwriting_image.png)を使用することができます。また、代わりに独自の画像を指定することもできます。

このページは役立ちましたか?評価をお願いいたします。

フィードバックを送信...

Cloud Vision API ドキュメント
ご不明な点がありましたら、Google のサポートページをご覧ください。