C#机器学习(4)-Azure AI(4)

该文章详细介绍了如何使用ComputerVisionClient的ReadAPI从URL指定的文件中提取文本。首先,调用ReadAsync方法开始异步操作,并从返回的ReadHeaders中获取OperationLocation。接着,使用OperationLocation中的operationId来获取ReadOperationResult,持续检查状态直到操作完成。最终,解析JSON输出以获取识别的文本内容。整个过程涉及语言选择、页面范围指定以及对异步结果的处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

读取 API过程

默认情况下,服务从图像或文档(包括混合语言)中提取所有文本。 读取操作包含可选语言请求参数。 如果希望强制将文档作为该特定语言处理,则仅提供语言代码。 否则,服务可能会返回不完整和不正确的文本。

选择页面或页面范围以进行文本提取

默认情况下,服务从文档的所有页面提取文本。 (可选)使用 pages 请求参数指定页码或页面范围,以便仅从这些页面提取文本。

提交服务数据

ReadFileUrl的API调用

public async Task ReadFileUrl(ComputerVisionClient client, string urlFile)
    {

        // Read text from URL
        var textHeaders = await client.ReadAsync(urlFile);
            // After the request, get the operation location (operation ID)
            string operationLocation = textHeaders.OperationLocation;
            tbOcrResult.Text += operationLocation;
            tbOcrResult.Text += Environment.NewLine;
            // Retrieve the URI where the extracted text will be stored from the Operation-Location header.
            // We only need the ID and not the full URL
            const int numberOfCharsInOperationId = 36;
        string operationId = operationLocation.Substring(operationLocation.Length - numberOfCharsInOperationId);

        // Extract the text
        ReadOperationResult results;
        tbOcrResult.Text+=($"从 URL 文件 {Path.GetFileName(urlFile)}解析文本...");
        tbOcrResult.Text += Environment.NewLine;
        do
        {
            results = await client.GetReadResultAsync(Guid.Parse(operationId));
        }
        while ((results.Status == OperationStatusCodes.Running ||
            results.Status == OperationStatusCodes.NotStarted));

        tbOcrResult.Text += Environment.NewLine;
        var textUrlFileResults = results.AnalyzeResult.ReadResults;
        foreach (ReadResult page in textUrlFileResults)
        {
                tbOcrResult.Text += page.Language;
                tbOcrResult.Text += Environment.NewLine;
                tbOcrResult.Text += page.Width;
                tbOcrResult.Text += Environment.NewLine;
                tbOcrResult.Text += page.Height;
                tbOcrResult.Text += Environment.NewLine;
                tbOcrResult.Text += page.Angle;
                tbOcrResult.Text += Environment.NewLine;
                foreach (Line line in page.Lines)
            {
                    tbOcrResult.Text += (line.Text);
                    tbOcrResult.Text += (line.Language);
                    tbOcrResult.Text += Environment.NewLine;
                }
        }
            tbOcrResult.Text += Environment.NewLine;
    }

ComputerVisionClientExtensions.ReadAsync Method

public static System.Threading.Tasks.Task<Microsoft.Azure.CognitiveServices.Vision.ComputerVision.Models.ReadHeaders> ReadAsync (this Microsoft.Azure.CognitiveServices.Vision.ComputerVision.IComputerVisionClient operations, string url, string language = default, System.Collections.Generic.IList<string> pages = default, string modelVersion = "latest", string readingOrder = "basic", System.Threading.CancellationToken cancellationToken = default);

参数

operations
IComputerVisionClient

url
String

language
String

pages
IList

modelVersion
String

readingOrder
String

cancellationToken
CancellationToken

返回

Task<ReadHeaders>

ReadHeaders Class

public class ReadHeaders

构造函数

ReadHeaders()




public ReadHeaders ();


ReadHeaders(String)

public ReadHeaders (string operationLocation = default);

Parameters

operationLocation
    String 

ReadHeaders.OperationLocation Property

[Newtonsoft.Json.JsonProperty(PropertyName="Operation-Location")]
public string OperationLocation { get; set; }

Property Value

String

Attributes
Newtonsoft.Json.JsonPropertyAttribute

探索ReadHeaders

那么究竟ReadHeaders是什么呢?
从字面上理解是读取头。
还有OperationLocation又是什么呢?它是ReadHeaders唯一的属性

调试代码
        // Read text from URL
        var textHeaders = await client.ReadAsync(urlFile);
            // After the request, get the operation location (operation ID)
            string operationLocation = textHeaders.OperationLocation;
            tbOcrResult.Text += operationLocation;
            tbOcrResult.Text += Environment.NewLine;

输出以下类似的格式

https://资源名.cognitiveservices.azure.com/vision/v3.2/read/analyzeResults/xxxxxx-xxxx-xxx

https://资源名.cognitiveservices.azure.com/为终结点
计算机视觉终结点的格式为 https://<your_computer_vision_resource_name>.cognitiveservices.azure.com/。
格式进一步简化为:

终结点/vision/v3.2/read/analyzeResults/xxxxxx-xxxx-xxx

xxxxxx-xxxx-xxx就是一串GUID表示的operationId

Guid 结构

定义

命名空间:
System

程序集:
System.Runtime.dll

表示全局唯一标识符 (GUID)。

Operation-Location

读取 API 的读取调用采用图像或 PDF 文档作为输入,以异步方式提取文本。

https://{endpoint}/vision/v3.2/read/analyze[?language][&pages][&readingOrder]

该调用返回时将包含一个名为 Operation-Location 的响应头字段。Operation-Location 值是一个 URL,其中包含要在下一步骤中使用的操作 ID。

响应标头 	                 示例值
Operation-Location 	https://cognitiveservice/vision/v3.2/read/analyzeResults/49a36324-fc4b-4387-aa06-090cfbf0064f

public async Task ReadFileUrl(ComputerVisionClient client, string urlFile)方法的前几行完成这个功能

public async Task ReadFileUrl(ComputerVisionClient client, string urlFile)
    {
        // Read text from URL
        var textHeaders = await client.ReadAsync(urlFile);
            // After the request, get the operation location (operation ID)
            string operationLocation = textHeaders.OperationLocation;

在这里插入图片描述

红色圈起来的部分即是

https://{endpoint}/vision/v3.2/read/analyze[?language][&pages][&readingOrder]
operationId

检索提取文本所在的URI,该URI用于进一步提取文本操作,它被保存在操作位置标头(Operation Location header)中。
继续分析public async Task ReadFileUrl(ComputerVisionClient client, string urlFile)代码

 // Retrieve the URI where the extracted text will be stored from the Operation-Location header.
    // We only need the ID and not the full URL
const int numberOfCharsInOperationId = 36;
string operationId = operationLocation.Substring(operationLocation.Length - numberOfCharsInOperationId);

我们只需要提取ID而不需要完整的URL

String.Substring

命名空间:
System

程序集:
netstandard.dll

从此实例检索子字符串。

重载
Substring(Int32)

从此实例检索子字符串。 子字符串在指定的字符位置开始并一直到该字符串的末尾。
Substring(Int32, Int32)

从此实例检索子字符串。 子字符串从指定的字符位置开始且具有指定的长度。
Substring(Int32)
从此实例检索子字符串。 子字符串在指定的字符位置开始并一直到该字符串的末尾。

public string Substring (int startIndex);

参数

startIndex
Int32

此实例中子字符串的起始字符位置(从零开始)。
返回

String

与此实例中在 startIndex 处开头的子字符串等效的一个字符串;如果 Empty 等于此实例的长度,则为 startIndex。
例外
ArgumentOutOfRangeException

startIndex 小于零或大于此实例的长度。

提取operationId

全局唯一标识符(GUID,Globally Unique Identifier)是一种由算法生成的二进制长度为128位的数字标识符。
GUID 的格式为“xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx”,其中每个 x 是 0-9 或 a-f 范围内的一个十六进制数。例如:6F9619FF-8B86-D011-B42D-00C04FC964FF 即为有效的 GUID 值。
就是最后36个字符串,所以才有const int numberOfCharsInOperationId = 36;
从下面PYTHON代码可计算长度

>>> a="6F9619FF-8B86-D011-B42D-00C04FC964FF"
>>> a
'6F9619FF-8B86-D011-B42D-00C04FC964FF'
>>> len(a)
36

获取服务结果

第二个步骤是调用获取读取结果操作。 此操作采用读取操作创建的操作 ID 作为输入。

https://{endpoint}/vision/v3.2/read/analyzeResults/{operationId}

此操作返回一个 JSON 响应,其中包含具有以下可能值的 status 字段。

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

可以不断地以迭代方式调用此操作,直到它返回 succeeded 值为止。 使用 1 到 2 秒的间隔可以避免超过每秒请求数 (RPS) 的速率限制。

ReadOperationResult Class

public async Task ReadFileUrl(ComputerVisionClient client, string urlFile)接下来的代码

// Extract the text
ReadOperationResult results;
tbOcrResult.Text+=($"从 URL 文件 {Path.GetFileName(urlFile)}解析文本...");
tbOcrResult.Text += Environment.NewLine;
public class ReadOperationResult

构造函数

 ReadOperationResult()
ReadOperationResult(OperationStatusCodes, String, String, AnalyzeResults) 

属性

AnalyzeResult
CreatedDateTime
LastUpdatedDateTime
Status 

接下来的代码

do
{
    results = await client.GetReadResultAsync(Guid.Parse(operationId));
}
while ((results.Status == OperationStatusCodes.Running ||
    results.Status == OperationStatusCodes.NotStarted));

results = await client.GetReadResultAsync(Guid.Parse(operationId));得到异步读取结果

Parse(String)

将 GUID 的字符串表示形式转换为等效的 Guid 结构。

上面代码段的Guid.Parse(operationId)就是参数operationId
返回为Task<ReadOperationResult>

还在继续运行或没开始,则继续获取结果

while ((results.Status == OperationStatusCodes.Running ||
    results.Status == OperationStatusCodes.NotStarted));

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

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

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

JSON 输出

下面是成功 JSON 响应示例:

{
  "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
              }
            ]
          }
        ]
      }
    ]
  }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值