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://
格式进一步简化为:
终结点/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}]}]}]}
}
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!