1

我正在尝试创建一个简单的 Xamarin 表单应用程序,该应用程序允许用户浏览或拍照,并让 Azure 认知服务使用自定义视觉模型标记照片。

我无法让客户端成功验证或根据 VisionServiceClient 生成的异常中的错误消息找到资源。我错过了什么吗?VisionServiceClient 的参数使用的正确值是什么?

所有键都已从下图中删除,它们已被填充。

VS2017 中抛出的异常:

System.Private.CoreLib.dll 中的“Microsoft.ProjectOxford.Vision.ClientException”

调用 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异常错误:

visionClient.AnalyzeImageAsync() 抛出的异常

Azure 认知服务门户:

认知服务概述

认知服务密钥

自定义视觉门户:

自定义视觉门户设置页面

项目预测 URL 弹出窗口

4

2 回答 2

1

看起来您混淆了计算机视觉和自定义视觉 API。您正在尝试使用后者的 API 密钥为前者使用客户端 SDK。

对于 .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);
于 2019-01-29T18:49:17.013 回答
0

感谢 cthrash 提供的扩展帮助并在聊天中与我交谈。使用他的帖子以及一些故障排除,我已经找到了适合我的方法。代码非常笨重,但它只是为了测试并确保我能够做到这一点。要回答这个问题:

Nuget 包和类

使用 cthrash 的帖子,我能够安装训练和预测 nuget 包,它们是此特定应用程序的正确包。我需要以下课程:

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

端点根

按照此处的一些步骤,我确定端点 URL 只需作为根,而不是自定义视觉门户中提供的完整 URL。例如,

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

改为

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

我使用了自定义视觉门户中的密钥和端点,并进行了更改,我能够同时使用训练和预测客户端来拉动项目和迭代。

获取项目 ID

CustomVisionPredictionClient.PredictImageAsync如果在门户中未设置默认迭代,您需要一个Guid项目 id 和一个迭代 id,以便使用。

我测试了两种获取项目ID的方法,

   使用门户中的项目 ID 字符串

  1. 从项目设置下的门户中获取项目 ID 字符串。
  2. 第一个参数PredictImageAsync通过

    Guid.Parse(projectId)

   使用培训客户端

  1. 创建一个新的CustomVisionTrainingClient
  2. 获取使用<Project>清单

    TrainingClient.GetProjects().ToList()

  3. 就我而言,我只有一个项目,所以我只需要第一个元素。

    Guid projectId = projects[0].Id

获取迭代 ID

要获取项目的迭代 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;
}
于 2019-01-30T15:55:19.353 回答