【问题标题】:Different text detection result from Google Vision API来自 Google Vision API 的不同文本检测结果
【发布时间】:2018-06-01 01:23:54
【问题描述】:

从 .Net 代码和演示应用中为同一图像 google vision api result.net result 获取不同的文本检测结果

这是我的代码:

            var response = vision.Images.Annotate(
            new BatchAnnotateImagesRequest()
            {
                Requests = new[]
                {
                    new AnnotateImageRequest()
                    {
                        Features = new[]
                        {
                            new Feature()
                            {
                                Type =
                                    "TEXT_DETECTION"
                            }
                        },
                        Image = image
                    }
                }
            }).Execute();

【问题讨论】:

  • 我在使用 PHP 库时遇到同样的问题,浏览器和 REST API 调用的结果不同,为什么?

标签: .net google-cloud-vision google-vision


【解决方案1】:

正如 Emil 的回答中所述,您需要 DOCUMENT_TEXT_DETECTION 功能而不是 TEXT_DETECTION。但是,您可以比使用当前代码更简单地完成这一切。

我建议使用Google.Cloud.Vision.V1(它使用 gRPC 端点,并且希望更易于使用。免责声明:我在后一个库上工作)。请注意,您可以使用 REST 端点完成大部分工作。

这是使用后一个库的完整示例。

using Google.Cloud.Vision.V1;
using System;
using System.Linq;

class Program
{
    static void Main(string[] args)
    {
        var client = ImageAnnotatorClient.Create();
        var image = Image.FromUri("https://i.stack.imgur.com/H21rL.png");
        var annotations = client.DetectDocumentText(image);
        var paragraphs = annotations.Pages
            .SelectMany(page => page.Blocks)
            .SelectMany(block => block.Paragraphs);
        foreach (var para in paragraphs)
        {
            var box = para.BoundingBox;
            Console.WriteLine($"Bounding box: {string.Join(" / ", box.Vertices.Select(v => $"({v.X}, {v.Y})"))}");
            var symbols = string.Join("", para.Words.SelectMany(w => w.Symbols).SelectMany(s => s.Text));
            Console.WriteLine($"Paragraph: {symbols}");
            Console.WriteLine();
        }
    }
}

这会丢失符号之间的空格,但表明正在检测所有文本 - 执行实际检测的方法调用非常简单:

var client = ImageAnnotatorClient.Create();
var image = Image.FromUri("https://i.stack.imgur.com/H21rL.png");
var annotations = client.DetectDocumentText(image);

上面的大部分代码都在处理响应。

【讨论】:

  • 谢谢,检测与方法无关,gRPC 和 REST API 的结果应该相同,只是它具有密集的 OCR 模式,与 OCR 相比可以检测到更多的文本。
  • @EmilBorconi:当然——我只是想证明通过 gRPC 库更容易做到这一点。会澄清这一点。
【解决方案2】:

发现问题,按照documentation使用Vision API我们应该使用DOCUMENT_TEXT_DETECTION

+-------------------------+-----------------------------------------------------------------------------------------------------------------+
| TEXT_DETECTION          | Run OCR.                                                                                                        |
+-------------------------+-----------------------------------------------------------------------------------------------------------------+
| DOCUMENT_TEXT_DETECTION | Run dense text document OCR. Takes precedence when both DOCUMENT_TEXT_DETECTION and TEXT_DETECTION are present. |
+-------------------------+-----------------------------------------------------------------------------------------------------------------+

因此代码应如下所示:

var response = vision.Images.Annotate(
            new BatchAnnotateImagesRequest()
            {
                Requests = new[]
                {
                    new AnnotateImageRequest()
                    {
                        Features = new[]
                        {
                            new Feature()
                            {
                                Type =
                                    "DOCUMENT_TEXT_DETECTION"
                            }
                        },
                        Image = image
                    }
                }
            }).Execute();

【讨论】:

    猜你喜欢
    • 2017-09-27
    • 2017-04-20
    • 2020-08-30
    • 2017-10-20
    • 2019-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多