在 Xamarin Forms 中使用 Vision Service Client 的各种错误
Various errors using VisionServiceClient in XamarinForms
我正在尝试创建一个简单的 Xamarin 表单应用程序,它允许用户浏览或拍摄照片并让 azure 认知服务使用自定义视觉模型标记照片。
根据 VisionServiceClient 产生的异常中的错误消息,我无法让客户端成功验证或找到资源。我错过了什么吗?用于 VisionServiceClient 参数的正确值是什么?
所有键都已从下面的图像中删除,它们已填充。
VS2017 抛出异常:
'Microsoft.ProjectOxford.Vision.ClientException' in 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 异常错误:
用于认知服务的 Azure 门户:
自定义视觉门户:
您似乎混淆了 Computer Vision 和 Custom Vision APIs。您正在尝试使用后者的 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);
感谢 cthrash 的长期帮助并在聊天中与我交谈。通过使用他的 post 以及一些故障排除,我找到了适合我的方法。该代码非常笨重,但它只是为了测试并确保我能够做到这一点。回答问题:
Nuget 包和 类
使用 cthrash 的 post 我能够安装训练和预测 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
端点根目录
按照某些步骤 Here,我确定端点 URL 只需要是根,而不是自定义视觉门户中提供的完整 URL。例如,
https://southcentralus.api.cognitive.microsoft.com/customvision/v2.0/Prediction/
已更改为
我使用了自定义视觉门户中的密钥和端点并进行了更改,我能够使用训练和预测客户端来拉项目和迭代。
获取项目 ID
要使用 CustomVisionPredictionClient.PredictImageAsync
,您需要 Guid
作为项目 ID 和迭代 ID(如果门户中未设置默认迭代)。
我测试了两种获取项目id的方法,
使用来自门户的项目 ID 字符串
- 从项目设置下的门户获取项目 ID 字符串。
- 对于
PredictImageAsync
的第一个参数传递
Guid.Parse(projectId)
使用培训客户端
- 新建一个
CustomVisionTrainingClient
要获取 <Project>
的列表,请使用
TrainingClient.GetProjects().ToList()
在我的例子中,我只有一个项目,所以我只需要第一个元素。
Guid projectId = projects[0].Id
获取迭代 ID
要获取项目的迭代 ID,您需要 CustomVisionTrainingClient
.
- 创建客户端
- 要获取
<Iteration>
的列表,请使用
client.GetIterations(projectId).ToList()
- 在我的例子中,我只有一次迭代,所以我只需要第一个元素。
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;
}
我正在尝试创建一个简单的 Xamarin 表单应用程序,它允许用户浏览或拍摄照片并让 azure 认知服务使用自定义视觉模型标记照片。
根据 VisionServiceClient 产生的异常中的错误消息,我无法让客户端成功验证或找到资源。我错过了什么吗?用于 VisionServiceClient 参数的正确值是什么?
所有键都已从下面的图像中删除,它们已填充。
VS2017 抛出异常:
'Microsoft.ProjectOxford.Vision.ClientException' in 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 异常错误:
用于认知服务的 Azure 门户:
自定义视觉门户:
您似乎混淆了 Computer Vision 和 Custom Vision APIs。您正在尝试使用后者的 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);
感谢 cthrash 的长期帮助并在聊天中与我交谈。通过使用他的 post 以及一些故障排除,我找到了适合我的方法。该代码非常笨重,但它只是为了测试并确保我能够做到这一点。回答问题:
Nuget 包和 类
使用 cthrash 的 post 我能够安装训练和预测 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
端点根目录
按照某些步骤 Here,我确定端点 URL 只需要是根,而不是自定义视觉门户中提供的完整 URL。例如,
https://southcentralus.api.cognitive.microsoft.com/customvision/v2.0/Prediction/
已更改为
我使用了自定义视觉门户中的密钥和端点并进行了更改,我能够使用训练和预测客户端来拉项目和迭代。
获取项目 ID
要使用 CustomVisionPredictionClient.PredictImageAsync
,您需要 Guid
作为项目 ID 和迭代 ID(如果门户中未设置默认迭代)。
我测试了两种获取项目id的方法,
使用来自门户的项目 ID 字符串
- 从项目设置下的门户获取项目 ID 字符串。
- 对于
PredictImageAsync
的第一个参数传递Guid.Parse(projectId)
使用培训客户端
- 新建一个
CustomVisionTrainingClient
要获取
<Project>
的列表,请使用TrainingClient.GetProjects().ToList()
在我的例子中,我只有一个项目,所以我只需要第一个元素。
Guid projectId = projects[0].Id
获取迭代 ID
要获取项目的迭代 ID,您需要 CustomVisionTrainingClient
.
- 创建客户端
- 要获取
<Iteration>
的列表,请使用client.GetIterations(projectId).ToList()
- 在我的例子中,我只有一次迭代,所以我只需要第一个元素。
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;
}