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

目录

  • 读取 API过程
    • 选择页面或页面范围以进行文本提取
    • 提交服务数据
      • ReadFileUrl的API调用
      • ComputerVisionClientExtensions.ReadAsync Method
      • ReadHeaders Class
      • ReadHeaders.OperationLocation Property
      • 探索ReadHeaders
        • 调试代码
        • Operation-Location
        • operationId
          • String.Substring
          • 提取operationId
      • 获取服务结果
        • ReadOperationResult Class
    • JSON 输出

读取 API过程

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

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

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

提交服务数据

ReadFileUrl的API调用

public async Task ReadFileUrl(ComputerVisionClient client, string urlFile){// Read text from URLvar 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 URLconst int numberOfCharsInOperationId = 36;string operationId = operationLocation.Substring(operationLocation.Length - numberOfCharsInOperationId);// Extract the textReadOperationResult 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 Class

public class ReadHeaders

构造函数

ReadHeaders()

public ReadHeaders ();

ReadHeaders(String)

public ReadHeaders (string operationLocation = default);ParametersoperationLocationString 

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 URLvar 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://.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 URLvar 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

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

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}]}]}]}
}


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部