Обнаружение контента в 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/
Надеюсь, поможет.