你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

适用于 Python 的 Azure 表单识别器客户端库 - 版本 3.0.0

Azure 认知服务表单识别器是一项云服务,它使用机器学习来识别表单文档中的文本和表数据。 它包括以下主要功能:

  • 自定义模型 - 识别表单中的字段值和表数据。 这些模型都是用你自己的数据训练的,因此是针对你的表单量身定制的。
  • 内容 API - 从文档中识别文本和表结构及其边界框坐标。 对应于 REST 服务的布局 API。
  • 预生成收据模型 - 使用预生成模型识别来自美国销售收据的数据。

源代码 | 包 (PyPI) | API 参考文档| 产品文档 | 样品

入门

先决条件

安装包

使用 pip 安装适用于 Python 的 Azure 表单识别器客户端库 - 版本 3.0.0:

pip install azure-ai-formrecognizer

注意:此版本的客户端库支持 v2.0 版本的 表单识别器 服务

创建表单识别器资源

表单识别器支持多服务和单服务访问。 如果计划通过一个终结点/密钥访问多个认知服务,请创建认知服务资源。 若要仅访问表单识别器,请创建表单识别器资源。

可以使用 创建资源

选项 1:Azure 门户

选项 2:Azure CLI。 下面是如何使用 CLI 创建表单识别器资源的示例:

# Create a new resource group to hold the form recognizer resource -
# if using an existing resource group, skip this step
az group create --name my-resource-group --location westus2
# Create form recognizer
az cognitiveservices account create \
    --name form-recognizer-resource \
    --resource-group my-resource-group \
    --kind FormRecognizer \
    --sku F0 \
    --location westus2 \
    --yes

验证客户端

若要与表单识别器服务交互,需要创建客户端的实例。 需要 终结点凭据 才能实例化客户端对象。

查找终结点

可以使用 Azure 门户或 AzureCLI 查找表单识别器资源的终结点:

# Get the endpoint for the form recognizer resource
az cognitiveservices account show --name "resource-name" --resource-group "resource-group-name" --query "endpoint"

获取 API 密钥

可以在 Azure 门户中或通过运行以下 Azure CLI 命令找到 API 密钥:

az cognitiveservices account keys list --name "resource-name" --resource-group "resource-group-name"

使用 AzureKeyCredential 创建客户端

若要使用 API 密钥 作为 credential 参数,请将密钥作为字符串传递到 AzureKeyCredential 实例中。

from azure.core.credentials import AzureKeyCredential
from azure.ai.formrecognizer import FormRecognizerClient

endpoint = "https://<region>.api.cognitive.microsoft.com/"
credential = AzureKeyCredential("<api_key>")
form_recognizer_client = FormRecognizerClient(endpoint, credential)

使用 Azure Active Directory 凭据创建客户端

AzureKeyCredential 本入门指南中的示例使用身份验证,但也可以使用 azure-identity 库通过 Azure Active Directory 进行身份验证。 请注意,区域终结点不支持 AAD 身份验证。 为资源 创建自定义子域 名称,以便使用此类型的身份验证。

若要使用如下所示的 DefaultAzureCredential 类型或 Azure SDK 提供的其他凭据类型,请安装包 azure-identity

pip install azure-identity

还需要注册新的 AAD 应用程序,并通过将角色分配给"Cognitive Services User"服务主体来授予对 表单识别器 的访问权限。

完成后,将 AAD 应用程序的客户端 ID、租户 ID 和客户端密码的值设置为环境变量: AZURE_CLIENT_IDAZURE_TENANT_IDAZURE_CLIENT_SECRET

from azure.identity import DefaultAzureCredential
from azure.ai.formrecognizer import FormRecognizerClient
credential = DefaultAzureCredential()

form_recognizer_client = FormRecognizerClient(
    endpoint="https://<my-custom-subdomain>.cognitiveservices.azure.com/",
    credential=credential
)

关键概念

FormRecognizerClient

FormRecognizerClient 提供操作以实现以下目的:

  • 使用经过训练的自定义模型识别表单域和内容,以识别自定义表单。 这些值在 RecognizedForm 对象的集合中返回。
  • 使用预先训练的收据模型识别美国收据中的常见字段。 这些字段和元数据在 对象的集合 RecognizedForm 中返回。
  • 无需训练模型即可识别表单内容,包括表格、行和单词。 表单内容在 FormPage 对象的集合中返回。

此处提供了示例代码片段来说明如何使用 FormRecognizerClient

FormTrainingClient

FormTrainingClient 提供操作以实现以下目的:

  • 训练不带标签的自定义模型,以识别在自定义窗体中找到的所有字段和值。 返回一个 CustomFormModel,它指示模型将识别的表单类型,以及将为每种表单类型提取的字段。 有关更详细的说明,请参阅 服务文档
  • 使用标签训练自定义模型,以识别通过标记自定义窗体指定的特定字段和值。 返回一个 CustomFormModel,它指示模型将提取的字段以,及每个字段的估计准确度。 有关更详细的说明,请参阅 服务文档
  • 管理在帐户中创建的模型。
  • 将自定义模型从一个表单识别器资源复制到另一个资源。

请注意,还可以使用图形用户界面(例如表单识别器标记工具)来训练模型。

此处提供了示例代码片段来说明如何使用 FormTrainingClient

Long-Running操作

长时间运行的操作包括发送到服务以启动操作的初始请求,然后按间隔轮询服务以确定操作是否已完成或失败,如果操作成功,则获取结果。

训练模型、识别表单中的值或复制模型的方法被建模为长时间运行的操作。 客户端公开返回 begin_<method-name>LROPollerAsyncLROPoller的方法。 调用方应通过调用 result()begin_<method-name> 方法返回的轮询器对象来等待操作完成。 提供了示例代码片段来说明如何使用长时间运行的操作

示例

以下部分提供了几个代码片段,涵盖一些最常见的表单识别器任务,包括:

使用自定义模型识别表单

识别表单中的名称/值对和表数据。 这些模型都是用你自己的数据训练的,因此是针对你的表单量身定制的。 为了获得最佳结果,应仅识别自定义模型训练所基于的表单类型的表单。

from azure.ai.formrecognizer import FormRecognizerClient
from azure.core.credentials import AzureKeyCredential

endpoint = "https://<region>.api.cognitive.microsoft.com/"
credential = AzureKeyCredential("<api_key>")

form_recognizer_client = FormRecognizerClient(endpoint, credential)
model_id = "<your custom model id>"

with open("<path to your form>", "rb") as fd:
    form = fd.read()

poller = form_recognizer_client.begin_recognize_custom_forms(model_id=model_id, form=form)
result = poller.result()

for recognized_form in result:
    print("Form type: {}".format(recognized_form.form_type))
    for name, field in recognized_form.fields.items():
        print("Field '{}' has label '{}' with value '{}' and a confidence score of {}".format(
            name,
            field.label_data.text if field.label_data else name,
            field.value,
            field.confidence
        ))

或者,表单 URL 还可用于使用 begin_recognize_custom_forms_from_url 方法识别自定义窗体。 对于所有识别方法,方法 _from_url 都存在。

form_url = "<url_of_the_form>"
poller = form_recognizer_client.begin_recognize_custom_forms_from_url(model_id=model_id, form_url=form_url)
result = poller.result()

识别内容

从文档中识别文本和表结构及其边界框坐标。

from azure.ai.formrecognizer import FormRecognizerClient
from azure.core.credentials import AzureKeyCredential

endpoint = "https://<region>.api.cognitive.microsoft.com/"
credential = AzureKeyCredential("<api_key>")

form_recognizer_client = FormRecognizerClient(endpoint, credential)

with open("<path to your form>", "rb") as fd:
    form = fd.read()

poller = form_recognizer_client.begin_recognize_content(form)
page = poller.result()

table = page[0].tables[0] # page 1, table 1
print("Table found on page {}:".format(table.page_number))
for cell in table.cells:
    print("Cell text: {}".format(cell.text))
    print("Location: {}".format(cell.bounding_box))
    print("Confidence score: {}\n".format(cell.confidence))

识别回执

使用预生成模型识别来自美国销售收据的数据。 可 在此处找到服务识别的收据字段。

from azure.ai.formrecognizer import FormRecognizerClient
from azure.core.credentials import AzureKeyCredential

endpoint = "https://<region>.api.cognitive.microsoft.com/"
credential = AzureKeyCredential("<api_key>")

form_recognizer_client = FormRecognizerClient(endpoint, credential)

with open("<path to your receipt>", "rb") as fd:
    receipt = fd.read()

poller = form_recognizer_client.begin_recognize_receipts(receipt)
result = poller.result()

for receipt in result:
    for name, field in receipt.fields.items():
        if name == "Items":
            print("Receipt Items:")
            for idx, items in enumerate(field.value):
                print("...Item #{}".format(idx+1))
                for item_name, item in items.value.items():
                    print("......{}: {} has confidence {}".format(item_name, item.value, item.confidence))
        else:
            print("{}: {} has confidence {}".format(name, field.value, field.confidence))

训练模型

根据自己的窗体类型训练自定义模型。 生成的模型可用于识别其训练所基于的形式类型中的值。 提供用于存储训练文档的 Azure 存储 Blob 容器的容器 SAS URL。 如果训练文件位于容器的子文件夹中,请使用 prefix 关键字参数指定要在哪个文件夹下训练。

有关设置容器和所需文件结构的更多详细信息,请参阅 服务文档

from azure.ai.formrecognizer import FormTrainingClient
from azure.core.credentials import AzureKeyCredential

endpoint = "https://<region>.api.cognitive.microsoft.com/"
credential = AzureKeyCredential("<api_key>")

form_training_client = FormTrainingClient(endpoint, credential)

container_sas_url = "<container-sas-url>"  # training documents uploaded to blob storage
poller = form_training_client.begin_training(
    container_sas_url, use_training_labels=False
)
model = poller.result()

# Custom model information
print("Model ID: {}".format(model.model_id))
print("Status: {}".format(model.status))
print("Training started on: {}".format(model.training_started_on))
print("Training completed on: {}".format(model.training_completed_on))

print("\nRecognized fields:")
for submodel in model.submodels:
    print(
        "The submodel with form type '{}' has recognized the following fields: {}".format(
            submodel.form_type,
            ", ".join(
                [
                    field.label if field.label else name
                    for name, field in submodel.fields.items()
                ]
            ),
        )
    )

# Training result information
for doc in model.training_documents:
    print("Document name: {}".format(doc.name))
    print("Document status: {}".format(doc.status))
    print("Document page count: {}".format(doc.page_count))
    print("Document errors: {}".format(doc.errors))

管理模型

管理附加到帐户的自定义模型。

from azure.ai.formrecognizer import FormTrainingClient
from azure.core.credentials import AzureKeyCredential
from azure.core.exceptions import ResourceNotFoundError

endpoint = "https://<region>.api.cognitive.microsoft.com/"
credential = AzureKeyCredential("<api_key>")

form_training_client = FormTrainingClient(endpoint, credential)

account_properties = form_training_client.get_account_properties()
print("Our account has {} custom models, and we can have at most {} custom models".format(
    account_properties.custom_model_count, account_properties.custom_model_limit
))

# Here we get a paged list of all of our custom models
custom_models = form_training_client.list_custom_models()
print("We have models with the following ids: {}".format(
    ", ".join([m.model_id for m in custom_models])
))

# Replace with the custom model ID from the "Train a model" sample
model_id = "<model_id from the Train a Model sample>"

custom_model = form_training_client.get_custom_model(model_id=model_id)
print("Model ID: {}".format(custom_model.model_id))
print("Status: {}".format(custom_model.status))
print("Training started on: {}".format(custom_model.training_started_on))
print("Training completed on: {}".format(custom_model.training_completed_on))

# Finally, we will delete this model by ID
form_training_client.delete_model(model_id=custom_model.model_id)

try:
    form_training_client.get_custom_model(model_id=custom_model.model_id)
except ResourceNotFoundError:
    print("Successfully deleted model with id {}".format(custom_model.model_id))

疑难解答

常规

表单识别器客户端库将引发 Azure Core 中定义的异常。

日志记录

此库使用标准 日志记录 库进行日志记录。 有关 HTTP 会话 (URL、标头等的基本信息,) 在 INFO 级别记录。

在客户端上使用 logging_enable 关键字参数可启用详细的调试级别日志记录(包括请求/响应正文和未编辑的标头):

import sys
import logging
from azure.ai.formrecognizer import FormRecognizerClient
from azure.core.credentials import AzureKeyCredential

# Create a logger for the 'azure' SDK
logger = logging.getLogger('azure')
logger.setLevel(logging.DEBUG)

# Configure a console output
handler = logging.StreamHandler(stream=sys.stdout)
logger.addHandler(handler)

endpoint = "https://<my-custom-subdomain>.cognitiveservices.azure.com/"
credential = AzureKeyCredential("<api_key>")

# This client will log detailed information about its HTTP sessions, at DEBUG level
form_recognizer_client = FormRecognizerClient(endpoint, credential, logging_enable=True)

同样,即使没有为客户端启用详细日志记录,logging_enable 也可以为单个操作启用:

poller = form_recognizer_client.begin_recognize_receipts(receipt, logging_enable=True)

可选配置

可选关键字参数可以在客户端和每个操作级别传入。 azure-core 参考文档 介绍了重试、日志记录、传输协议等的可用配置。

后续步骤

以下部分提供了几个代码片段,说明了 表单识别器 Python API 中使用的常见模式。

更多示例代码

这些代码示例演示 Azure 表单识别器 客户端库的常见方案操作。

异步 API

此库还包括 Python 3.5+ 上支持的完整异步 API。 若要使用它,必须先安装异步传输,例如 aiohttp。 异步客户端位于 命名空间下 azure.ai.formrecognizer.aio

其他文档

有关 Azure 认知服务表单识别器的更多文档,请参阅有关 docs.microsoft.com 的表单识别器文档

贡献

本项目欢迎贡献和建议。 大多数贡献要求你同意贡献者许可协议 (CLA),并声明你有权(并且确实有权)授予我们使用你的贡献的权利。 有关详细信息,请访问 cla.microsoft.com

提交拉取请求时,CLA 机器人将自动确定你是否需要提供 CLA,并相应地修饰 PR(例如标签、注释)。 直接按机器人提供的说明操作。 只需使用 CLA 对所有存储库执行一次这样的操作。

此项目采用了 Microsoft 开放源代码行为准则。 有关详细信息,请参阅行为准则常见问题解答,或如果有任何其他问题或意见,请与 联系。