Обнаружение контента в Google Cloud Vision для.NET ничего не делает / зависает в приложении

Я только начал немного играть с Google Cloud Vision. Я хотел обнаружить текст на изображении. Вдохновленный официальными документами (например, https://cloud.google.com/vision/docs/detecting-text и https://cloud.google.com/docs/authentication/production), я

  • создал новый проект,
  • прикрепил к нему API Vision,
  • создал учетную запись службы и загрузил файл credentials/key-JSON,
  • создать проект VS и получить все соответствующие пакеты от NuGET.

Мой код выглядит так:

using System;
using System.Windows;
using Google.Apis.Auth.OAuth2;
using Google.Cloud.Vision.V1;
using Grpc.Auth;

//...

private void Button_Click(object sender, RoutedEventArgs e)
{
    // Load an image from a local file.
    var image = Image.FromFile(@"C:\!\myimage.png");
    var credential = GoogleCredential.FromFile(@"C:\!\credentials.json");

    var channel = new Grpc.Core.Channel(@"https://vision.googleapis.com/v1/images:annotate",credential.ToChannelCredentials());

    var client = ImageAnnotatorClient.Create(channel);

    var response = client.DetectText(image); // <-- Nothing happens, app hangs, why?
    foreach (var annotation in response)
    {
        if (annotation.Description != null)
            Console.WriteLine(annotation.Description);
    }
}

//...

При просмотре кода приложение зависает на var response = client.DetectText(image); (без исключения или что-нибудь). То же самое происходит, если я использую другие методы (например, DetectLogos(image) или же DetectLabels(image)). При проверке использования процессора и сетевого трафика ничего важного не происходит (до или после соответствующей строки кода).

Что я здесь не так делаю?

Спасибо!

3 ответа

Решение

Представленная цель URL, похоже, связана с Vision REST API, но вы создаете канал GRPC. Вы должны изменить цель на:

var channel = new Grpc.Core.Channel(@"http://vision.googleapis.com",credential.ToChannelCredentials());
var client = ImageAnnotatorClient.Create(channel);

Или же:

var channel = new Grpc.Core.Channel(ImageAnnotatorClient.DefaultEndpoint.Host, credential.ToChannelCredentials());
var client = ImageAnnotatorClient.Create(channel);

Информацию о конечной точке можно найти в классе ImageAnnotatorClient.

Надеюсь, это полезно.

Гораздо сложнее, чем передавать путь к файлу.json, чтобы создать экземпляр службы gRPC. Мы работаем над тем, чтобы сделать это проще. В то же время этот образец наиболее актуален: https://github.com/GoogleCloudPlatform/dotnet-docs-samples/blob/master/auth/AuthSample/Program.cs#L337

        var credential = GoogleCredential.FromFile(jsonPath)
            .CreateScoped(LanguageServiceClient.DefaultScopes);
        var channel = new Grpc.Core.Channel(
            LanguageServiceClient.DefaultEndpoint.ToString(),
            credential.ToChannelCredentials());
        var client = LanguageServiceClient.Create(channel);

Это для другого API, но это правильный шаблон.

Этот урок помог мне успешно заставить Vision API работать правильно. Я даже попробовал это с надписями, текстом и лицами. Вам просто нужно обновить часть JS вместе с CS, чтобы работать с любым Vision Detection, который вы хотите использовать.

Еще одна вещь, которую вам нужно изменить, - это возможность загружать изображение, а не снимать его с помощью веб-камеры, что не так уж сложно.

http://www.c-sharpcorner.com/article/using-google-vision-api-with-asp-net-mvc/

Надеюсь, поможет.

Другие вопросы по тегам