🦁

【Azure Document intelligence】事前構築済みモデルで遊んでみる

2024/10/24に公開

執筆日

2024/10/24

前提

  • Azure Document intelligenceのS0をデプロイ済みであること

code(名刺の読み取り)

main.py
from azure.ai.formrecognizer import DocumentAnalysisClient  
from azure.core.credentials import AzureKeyCredential  
  
# AzureリソースのエンドポイントとAPIキーを設定  
endpoint = "https://<your-resource-name>.cognitiveservices.azure.com/"  
api_key = "<your-api-key>"  
  
# クライアントの作成  
client = DocumentAnalysisClient(endpoint=endpoint, credential=AzureKeyCredential(api_key))  
  
# 名刺画像のパスを指定  
business_card_path = "<path-to-your-business-card-image>"  
  
# 画像を読み込んで分析を開始  
with open(business_card_path, "rb") as fd:  
    business_card_image = fd.read()  

# 名刺の読み取りモデルを指定
poller = client.begin_analyze_document("prebuilt-businessCard", business_card_image)  
result = poller.result()  
  
# 結果を出力  
for document in result.documents:  
    print("Document type: {}".format(document.doc_type))  
    for name, field in document.fields.items():  
        field_value = field.value if field.value else "N/A"  
        print(f"Field '{name}': {field_value}")
出力結果

※個人情報は,***とマスキングをしました。実際の出力では読み取られた内容が出力しています。

{  
  "DocumentType": "businessCard",  
  "Fields": {  
    "Addresses": [  
      {  
        "ValueType": "address",  
        "Value": {  
          "HouseNumber": "***",  
          "City": "***",  
          "State": "***",  
          "PostalCode": "***",  
          "StreetAddress": "***",  
          "CityDistrict": "***",  
          "House": "***"  
        },  
        "Content": "***",  
        "BoundingRegions": [  
          {  
            "PageNumber": 1,  
            "Polygon": [  
              {"x": 106.0, "y": 2453.0},  
              {"x": 1148.0, "y": 2453.0},  
              {"x": 1148.0, "y": 2614.0},  
              {"x": 106.0, "y": 2614.0}  
            ]  
          }  
        ],  
        "Spans": [  
          {"Offset": 137, "Length": 46}  
        ],  
        "Confidence": 0.925  
      }  
    ],  
    "CompanyNames": [  
      {  
        "ValueType": "string",  
        "Value": "***",  
        "Content": "***",  
        "BoundingRegions": [  
          {  
            "PageNumber": 1,  
            "Polygon": [  
              {"x": 124.0, "y": 2343.0},  
              {"x": 1062.0, "y": 2343.0},  
              {"x": 1062.0, "y": 2416.0},  
              {"x": 124.0, "y": 2416.0}  
            ]  
          }  
        ],  
        "Spans": [  
          {"Offset": 122, "Length": 14}  
        ],  
        "Confidence": 0.925  
      },  
      {  
        "ValueType": "string",  
        "Value": "***",  
        "Content": "***",  
        "BoundingRegions": [  
          {  
            "PageNumber": 1,  
            "Polygon": [  
              {"x": 299.0, "y": 1881.0},  
              {"x": 1069.0, "y": 1880.0},  
              {"x": 1065.0, "y": 2011.0},  
              {"x": 299.0, "y": 2008.0}  
            ]  
          }  
        ],  
        "Spans": [  
          {"Offset": 53, "Length": 10}  
        ],  
        "Confidence": 0.865  
      }  
    ],  
    "ContactNames": [  
      {  
        "ValueType": "dictionary",  
        "Value": {  
          "FirstName": {  
            "ValueType": "string",  
            "Value": "***",  
            "Content": "***",  
            "BoundingRegions": [  
              {  
                "PageNumber": 1,  
                "Polygon": [  
                  {"x": 1767.0, "y": 1678.0},  
                  {"x": 2016.0, "y": 1678.0},  
                  {"x": 2016.0, "y": 1831.0},  
                  {"x": 1767.0, "y": 1831.0}  
                ]  
              }  
            ],  
            "Spans": [  
              {"Offset": 50, "Length": 2}  
            ],  
            "Confidence": 0.957  
          },  
          "LastName": {  
            "ValueType": "string",  
            "Value": "***",  
            "Content": "***",  
            "BoundingRegions": [  
              {  
                "PageNumber": 1,  
                "Polygon": [  
                  {"x": 1407.0, "y": 1681.0},  
                  {"x": 1601.0, "y": 1680.0},  
                  {"x": 1602.0, "y": 1829.0},  
                  {"x": 1408.0, "y": 1830.0}  
                ]  
              }  
            ],  
            "Spans": [  
              {"Offset": 47, "Length": 2}  
            ],  
            "Confidence": 0.903  
          }  
        },  
        "Content": "***",  
        "BoundingRegions": [  
          {  
            "PageNumber": 1,  
            "Polygon": [  
              {"x": 1408.0, "y": 1678.0},  
              {"x": 2016.0, "y": 1678.0},  
              {"x": 2016.0, "y": 1831.0},  
              {"x": 1408.0, "y": 1831.0}  
            ]  
          }  
        ],  
        "Spans": [  
          {"Offset": 47, "Length": 5}  
        ],  
        "Confidence": 0.866  
      },  
      {  
        "ValueType": "dictionary",  
        "Value": {  
          "FirstName": {  
            "ValueType": "string",  
            "Value": "***",  
            "Content": "***",  
            "BoundingRegions": [  
              {  
                "PageNumber": 1,  
                "Polygon": [  
                  {"x": 1770.0, "y": 1848.0},  
                  {"x": 2023.0, "y": 1844.0},  
                  {"x": 2023.0, "y": 1914.0},  
                  {"x": 1770.0, "y": 1919.0}  
                ]  
              }  
            ],  
            "Spans": [  
              {"Offset": 73, "Length": 6}  
            ],  
            "Confidence": 0.835  
          },  
          "LastName": {  
            "ValueType": "string",  
            "Value": "***",  
            "Content": "***",  
            "BoundingRegions": [  
              {  
                "PageNumber": 1,  
                "Polygon": [  
                  {"x": 1377.0, "y": 1853.0},  
                  {"x": 1732.0, "y": 1848.0},  
                  {"x": 1732.0, "y": 1920.0},  
                  {"x": 1376.0, "y": 1920.0}  
                ]  
              }  
            ],  
            "Spans": [  
              {"Offset": 64, "Length": 8}  
            ],  
            "Confidence": 0.694  
          }  
        },  
        "Content": "***",  
        "BoundingRegions": [  
          {  
            "PageNumber": 1,  
            "Polygon": [  
              {"x": 1375.0, "y": 1849.0},  
              {"x": 2023.0, "y": 1844.0},  
              {"x": 2024.0, "y": 1918.0},  
              {"x": 1376.0, "y": 1923.0}  
            ]  
          }  
        ],  
        "Spans": [  
          {"Offset": 64, "Length": 15}  
        ],  
        "Confidence": 0.636  
      }  
    ],  
    "Departments": [  
      {  
        "ValueType": "string",  
        "Value": "***",  
        "Content": "***",  
        "BoundingRegions": [  
          {  
            "PageNumber": 1,  
            "Polygon": [  
              {"x": 1368.0, "y": 1376.0},  
              {"x": 2309.0, "y": 1364.0},  
              {"x": 2312.0, "y": 1612.0},  
              {"x": 1371.0, "y": 1624.0}  
            ]  
          }  
        ],  
        "Spans": [  
          {"Offset": 0, "Length": 38}  
        ],  
        "Confidence": 0.925  
      }  
    ],  
    "Emails": [  
      {  
        "ValueType": "string",  
        "Value": "***@***.co.jp",  
        "Content": "***@***.co.jp",  
        "BoundingRegions": [  
          {  
            "PageNumber": 1,  
            "Polygon": [  
              {"x": 1375.0, "y": 2072.0},  
              {"x": 2512.0, "y": 2065.0},  
              {"x": 2512.0, "y": 2130.0},  
              {"x": 1374.0, "y": 2130.0}  
            ]  
          }  
        ],  
        "Spans": [  
          {"Offset": 89, "Length": 32}  
        ],  
        "Confidence": 0.995  
      }  
    ],  
    "JobTitles": [  
      {  
        "ValueType": "string",  
        "Value": "***",  
        "Content": "***",  
        "BoundingRegions": [  
          {  
            "PageNumber": 1,  
            "Polygon": [  
              {"x": 1985.0, "y": 1550.0},  
              {"x": 2379.0, "y": 1539.0},  
              {"x": 2381.0, "y": 1605.0},  
              {"x": 1987.0, "y": 1616.0}  
            ]  
          }  
        ],  
        "Spans": [  
          {"Offset": 39, "Length": 7}  
        ],  
        "Confidence": 0.925  
      }  
    ],  
    "Websites": [  
      {  
        "ValueType": "string",  
        "Value": "https://www.***.co.jp",  
        "Content": "https://www.***.co.jp",  
        "BoundingRegions": [  
          {  
            "PageNumber": 1,  
            "Polygon": [  
              {"x": 81.0, "y": 2779.0},  
              {"x": 932.0, "y": 2785.0},  
              {"x": 930.0, "y": 2844.0},  
              {"x": 81.0, "y": 2836.0}  
            ]  
          }  
        ],  
        "Spans": [  
          {"Offset": 209, "Length": 28}  
        ],  
        "Confidence": 0.987  
      }  
    ],  
    "WorkPhones": [  
      {  
        "ValueType": "phoneNumber",  
        "Value": "+81**********",  
        "Content": "03-****-****",  
        "BoundingRegions": [  
          {  
            "PageNumber": 1,  
            "Polygon": [  
              {"x": 87.0, "y": 2683.0},  
              {"x": 547.0, "y": 2680.0},  
              {"x": 547.0, "y": 2744.0},  
              {"x": 85.0, "y": 2736.0}  
            ]  
          }  
        ],  
        "Spans": [  
          {"Offset": 184, "Length": 13}  
        ],  
        "Confidence": 0.988  
      }  
    ]  
  }  
}  
主な構造

DocumentType: ドキュメントのタイプ(この場合は「businessCard」)。
Fields: 各情報項目が含まれるオブジェクト。

各フィールドの内容

Addresses

住所情報を格納。
ValueType: データの種類(address)。
Value: 住所の詳細(市区町村、郵便番号など)。
Content: 完全な住所文字列。
BoundingRegions: 住所の位置を示すデータ。
Confidence: 抽出の信頼度。

CompanyNames

会社名。
ValueType: データの種類(string)。
Content: 会社名。
BoundingRegions: 会社名の位置。
Confidence: 抽出の信頼度。

ContactNames

名前情報。
ValueType: データの種類(dictionary)。
Value: 名前の詳細(姓と名)。
BoundingRegions: 名前の位置。
Confidence: 抽出の信頼度。
Departments:

部署名。

ValueType: データの種類(string)。
Content: 部署名。
BoundingRegions: 部署名の位置。
Confidence: 抽出の信頼度。

Emails

メールアドレス。
ValueType: データの種類(string)。
Content: メールアドレス。
BoundingRegions: メールアドレスの位置。
Confidence: 抽出の信頼度。

JobTitles

役職名。
ValueType: データの種類(string)。
Content: 役職名。
BoundingRegions: 役職名の位置。
Confidence: 抽出の信頼度。

Websites

ウェブサイトのURL。
ValueType: データの種類(string)。
Content: URL。
BoundingRegions: URLの位置。
Confidence: 抽出の信頼度。

WorkPhones

電話番号。
ValueType: データの種類(phoneNumber)。
Content: 電話番号。
BoundingRegions: 電話番号の位置。
Confidence: 抽出の信頼度。

事前構築済みモデルの種類について

以下の種類があります。
↓Docsより引用

  • 請求書モデル。 請求書から一般的なフィールドとその値を抽出します。
  • 領収書モデル。 領収書から一般的なフィールドとその値を抽出します。
  • 米国税モデル。 W-2、1098、1099、1040 などのフォームから抽出できる統一された米国税モデル。
  • ID ドキュメント モデル。 米国の運転免許証、欧州連合の ID と運転免許証、国際パスポートから共通のフィールドとその値を抽出します。
  • 名刺モデル。 名刺から一般的なフィールドとその値を抽出します。
  • 医療保険カード モデル。 医療保険カードから共通フィールドとその値を抽出します。
  • 結婚証明書。 結婚証明書から情報を抽出します。
  • クレジット/デビット カード モデル。 銀行カードから共通の情報を抽出します。
  • 住宅ローンのドキュメント。 住宅ローン契約締結開示説明書、Uniform Residential Loan Application (フォーム 1003)、Appraisal (フォーム 1004)、Validation of Employment (フォーム 1005)、Uniform Underwriting and Transmittal Summary (フォーム 1008) から情報を抽出します。
  • 口座取引明細書モデル。 口座情報 (開始残高と終了残高、取引明細など) を口座取引明細書から抽出します。
  • 給与明細書モデル。 賃金、時間、控除、手取り額、その他の一般的な給与明細書フィールドを抽出します。
  • 小切手モデル。 支払い先、金額、日付、その他の関連情報を小切手から抽出します。

細かいモデルの名前は以下のDocsで確認できます。
https://learn.microsoft.com/ja-jp/azure/ai-services/document-intelligence/model-overview?view=doc-intel-4.0.0#model-overview

事前構築済みモデルの料金

東日本リージョンでは、1,000ページあたり$10。

まとめ

Azure Document intelligenceの事前構築済みモデルで遊んでみました。
APIとして利用するのも簡単でした。出力でConfidenceが出力されるのはいいなーと。
次はカスタムモデルを触ってみようかなと。

ヘッドウォータース

Discussion