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会返回一个包含status
的json
格式的返回值,对于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说明