Skip to main content

Azure OCR 光学字符识别指南

分类:  Azure认知服务 标签:  #Azure #OCR #人工智能 发布于: 2023-06-10 22:15:45

我们前面一篇已经简要的介绍了基于.Net SDK的OCR快速入门,本篇详细的介绍OCR的注意事项。

OCR 支持的文档格式

当前OCR是基于新的读取API对光学字符识别,主要支持如下的文件格式

  • 支持JPEG,PNG, BMP, PDF, 以及TIFF。
  • 对于PDF和TIFF文件,最多支持2000个页面。
  • 文件的大小必须小于50M

支持的语言

对于印刷体,目前支持73种语言。

收费标准

根据事务进行收费,这里的一个事务是指分析一个图片或者一个页面为一个事务,假如你提交一个PDF文件,包含1000页,那么就会发生1000个事务。如果你对这个文件提交了50次,那么一共的事务时50 * 1000, 那么收费会按照 50 * 1000 来收取。

理解API

我们前面使用了.Net的SDK, 该SDK实际上是对API访问的封装,如果你所使用的语言工具并没有封装好的API, 你完全可以使用该语言提供的工具,直接对API发起调用。

API的格式和参数

在创建资源之后,你会拿到两个参数,一个是{ENDPOINT}, 另外一个是{KEY}, API的具体地址是:
https://{endpoint}/vision/v3.2/read/analyze[?language][&pages][&readingOrder]

注意这里该API还可以带几个参数:

  • language: 指定文档上的语言,如果不带该参数,API会自动侦测语言。
  • pages: 用于识别文档中指定的页面,如果不给出该参数,默认是全部的页面,页面指定的格式如下:pages=1,2, 则表示第一页和第二页,pages=5-, 表示从第五页到后面所有页, pages=-10, 表示直到第十页,之后不识别。
  • readingOrder, 仅仅能用拉丁语,可带值natural, 使得阅读顺序更自然。

提交后的返回参数

向该API提交OCR识别之后,该API并不会返回具体的内容,而是会在header里返回一个头:Operation-Location, 该header值是一个形式如:https://{ENDPOINT}/vision/v3.2/read/analyzeResults/49a36324-fc4b-4387-aa06-090cfbf0064f的格式, 在该格式中,最后一个分割栏中是刚刚提交后返回的一个任务ID,该ID的长度正好是36个字符。我们需要将这36个字符提取出来作为任务ID,使用它来查询识别的进度。

查询识别的进度和取得结果

取得ID之后,向API的URL, https://{endpoint}/vision/v3.2/read/analyzeResults/{operationId}, 该URL会返回一个包含statusjson格式的返回值,对于status的取值和说明如下:

含义
notStarted尚未启动操作。
running正在处理操作。
failed操作失败。
succeeded操作已成功执行。

可以根据status循环的调用此操作,直到识别完成。这里需要注意的是,API对调用的次数是有限制的,因此我们应该在轮询查询时添加必要的等待时间,例如等待1-2秒。

免费层将请求速率限制为每分钟 20 次调用。 付费层允许的每秒请求数 (RPS) 为 10 个,该限制可按请求提高。 注意你的 Azure 资源标识符和区域,并打开 Azure 支持票证或联系帐户团队,请求更高的每秒请求数 (RPS) 速率。

当 status 字段的值为 succeeded 时,JSON 响应将包含从图像或文档提取的文本内容。 JSON 响应会维护已识别单词的原始分组。 其中包括提取的文本行及其边界框坐标。 每个文本行都包含所有提取的单词及其坐标和可信度分数。

提交到 Read 操作的数据将暂时加密并静态存储较短的一段时间,然后被删除。 这样,应用程序便可以检索提取的文本作为服务响应的一部分。

示例JASON输出

{
  "status": "succeeded",
  "createdDateTime": "2021-02-04T06:32:08.2752706+00:00",
  "lastUpdatedDateTime": "2021-02-04T06:32:08.7706172+00:00",
  "analyzeResult": {
    "version": "3.2",
    "readResults": [
      {
        "page": 1,
        "angle": 2.1243,
        "width": 502,
        "height": 252,
        "unit": "pixel",
        "lines": [
          {
            "boundingBox": [
              58,
              42,
              314,
              59,
              311,
              123,
              56,
              121
            ],
            "text": "Tabs vs",
            "appearance": {
              "style": {
                "name": "handwriting",
                "confidence": 0.96
              }
            },
            "words": [
              {
                "boundingBox": [
                  68,
                  44,
                  225,
                  59,
                  224,
                  122,
                  66,
                  123
                ],
                "text": "Tabs",
                "confidence": 0.933
              },
              {
                "boundingBox": [
                  241,
                  61,
                  314,
                  72,
                  314,
                  123,
                  239,
                  122
                ],
                "text": "vs",
                "confidence": 0.977
              }
            ]
          }
        ]
      }
    ]
  }
}

如果是使用SDK,可以参考SDK的API说明