Различные ошибки при использовании VisionServiceClient в XamarinForms - PullRequest
0 голосов
/ 29 января 2019

Я пытаюсь создать простое приложение для создания форм Xamarin, которое позволяет пользователю просматривать или делать снимки, а лазурные когнитивные службы помечают фотографию с помощью настраиваемой модели зрения.

Я не могу получитьклиент для успешной аутентификации или поиска ресурса в соответствии с сообщением об ошибке в исключении, созданном VisionServiceClient.Я что-то пропустил?Какие правильные значения следует использовать для аргументов VisionServiceClient?

Все ключи были удалены из приведенных ниже изображений, они заполнены.

Исключение, выброшенное в VS2017:

«Microsoft.ProjectOxford.Vision.ClientException» в System.Private.CoreLib.dll

Вызов VisionServiceClient:

private const string endpoint = @"https://eastus2.api.cognitive.microsoft.com/vision/prediction/v1.0";
private const string key = "";

VisionServiceClient visionClient = new VisionServiceClient(key, endpoint);
VisualFeature[] features = { VisualFeature.Tags, VisualFeature.Categories, VisualFeature.Description };
try
{
     AnalysisResult temp = await visionClient.AnalyzeImageAsync(imageStream,                    
     features.ToList(), null);

     return temp;
}
catch(Exception ex)
{
     return null;
}

VSОшибка исключения:

Exception thrown by visionClient.AnalyzeImageAsync()

Azure Portal для когнитивных служб:

Cognitive Services Overview

Cognitive Services Keys

Портал Custom Vision:

Custom Vision Portal Settings Page

Project Prediction URL Popup

Ответы [ 2 ]

0 голосов
/ 30 января 2019

Спасибо cthrash за расширенную помощь и общение со мной в чате.Используя его пост вместе с небольшим устранением неполадок, я выяснил, что работает для меня.Код очень неуклюжий, но это было только для того, чтобы проверить и убедиться, что я могу это сделать.Чтобы ответить на вопрос:

Пакеты и классы Nuget

С помощью сообщения cthrash я смог установить как пакеты обучения, так и прогнозирования, которые являются правильными пакетами дляэто конкретное приложение.Мне нужны были следующие классы:

Microsoft.Azure.CognitiveServices.Vision.CustomVision.Prediction Microsoft.Azure.CognitiveServices.Vision.CustomVision.Prediction.Models Microsoft.Azure.CognitiveServices.Vision.CustomVision.Training Microsoft.Azure.CognitiveServices.Vision.CustomVision.Training.Models

Конечная точка Root

Следуя некоторым шагам Здесь , я определил, что URL-адрес конечной точки должен быть только корневым, а не полный URL-адрес, предоставленный на портале Custom Vision.Например,

https://southcentralus.api.cognitive.microsoft.com/customvision/v2.0/Prediction/

было изменено на

https://southcentralus.api.cognitive.microsoft.com

Я использовали ключ, и конечная точка портала Custom Vision и внесение этого изменения, я смог использовать клиент обучения и прогнозирования для извлечения проектов и итераций.

Получение идентификатора проекта

Чтобы использовать CustomVisionPredictionClient.PredictImageAsync, вам нужен Guid для идентификатора проекта и идентификатор итерации, если на портале не задана итерация по умолчанию.

Я протестировал два способа получить идентификатор проекта,

Использование строки идентификатора проекта с портала

  1. Получение строки идентификатора проекта с портала в настройках проекта.
  2. Для первогоаргумент PredictImageAsync pass

    Guid.Parse(projectId)

Использование обучающего клиента

  1. Создатьновый CustomVisionTrainingClient
  2. Для получения списка <Project> используйте

    TrainingClient.GetProjects().ToList()

  3. В моем случае у меня был только одинпроект, поэтому мне просто нужен первый элемент.

    Guid projectId = projects[0].Id

Получение идентификатора итерации

Чтобы получить идентификатор итерации проекта, вам нужно CustomVisionTrainingClient.

  1. Создать клиента
  2. Чтобы получить список <Iteration>, используйте

    client.GetIterations(projectId).ToList()

  3. В моем случае у меня была только одна итерация, поэтому мне просто нужен первый элемент.

    Guid iterationId = iterations[0].Id

Теперь я могу использовать свою модель для классификации изображений.В приведенном ниже коде fileStream - это поток изображения, передаваемый модели.

public async Task<string> Predict(Stream fileStream)
{
    string projectId = "";
    //string trainingEndpoint = "https://southcentralus.api.cognitive.microsoft.com/customvision/v2.2/Training/";
    string trainingEndpoint = "https://southcentralus.api.cognitive.microsoft.com/";
    string trainingKey = "";
    //string predictionEndpoint = "https://southcentralus.api.cognitive.microsoft.com/customvision/v2.0/Prediction/";
    string predictionEndpoint = "https://southcentralus.api.cognitive.microsoft.com";
    string predictionKey = "";

    CustomVisionTrainingClient trainingClient = new CustomVisionTrainingClient
    {
        ApiKey = trainingKey,
        Endpoint = trainingEndpoint
    };

    List<Project> projects = new List<Project>();

    try
    {
        projects = trainingClient.GetProjects().ToList();
    }
    catch(Exception ex)
    {
        Debug.WriteLine("Unable to get projects:\n\n" + ex.Message);
        return "Unable to obtain projects.";
    }

    Guid ProjectId = Guid.Empty;

    if(projects.Count > 0)
    {
        ProjectId = projects[0].Id;
    }

    if (ProjectId == Guid.Empty)
    {
        Debug.WriteLine("Unable to obtain project ID");
        return "Unable to obtain project id.";
    }

    List<Iteration> iterations = new List<Iteration>();

    try
    {
        iterations = trainingClient.GetIterations(ProjectId).ToList();
    }
    catch(Exception ex)
    {
        Debug.WriteLine("Unable to obtain iterations.");
        return "Unable to obtain iterations.";
    }

    foreach(Iteration itr in iterations)
    {
        Debug.WriteLine(itr.Name + "\t" + itr.Id + "\n");
    }

    Guid iteration = Guid.Empty;

    if(iterations.Count > 0)
    {
        iteration = iterations[0].Id;
    }

    if(iteration == Guid.Empty)
    {
        Debug.WriteLine("Unable to obtain project iteration.");
        return "Unable to obtain project iteration";
    }

    CustomVisionPredictionClient predictionClient = new CustomVisionPredictionClient
    {
        ApiKey = predictionKey,
        Endpoint = predictionEndpoint
    };

    var result = await predictionClient.PredictImageAsync(Guid.Parse(projectId), fileStream, iteration);

    string resultStr = string.Empty;

    foreach(PredictionModel pred in result.Predictions)
    {
        if(pred.Probability >= 0.85)
            resultStr += pred.TagName + " ";
    }

    return resultStr;
}
0 голосов
/ 29 января 2019

Похоже, вы путаете Компьютер Vision и Пользовательские Vision API.Вы пытаетесь использовать клиентский SDK для первого, используя ключ API последнего.

Для языков .NET вам понадобится Microsoft.Azure.CognitiveServices.Vision.CustomVision.Prediction пакет NuGet.

Ваш код будет выглядеть примерно так:

ICustomVisionPredictionClient client = new CustomVisionPredictionClient()
{
    ApiKey = PredictionKey,
    Endpoint = "https://southcentralus.api.cognitive.microsoft.com"
};
ImagePrediction prediction = await client.PredictImageAsync(ProjectId, stream, IterationId);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...