Azure 自定义视觉 Api POST 请求错误,甚至正确的 ID

问题描述

我正在尝试在训练后发布我的自定义视觉迭代。但我总是收到“错误请求”错误

我正在尝试使用以下代码行:

trainingApi.PublishIteration(ProjectID,iteration.Id,"Model",predictionResourceId);

它应该发布我的迭代,但我收到一个错误

我重新检查了我的所有 ID,但一切看起来都很好。型号名称是否特定(以小写字母开头)?

编辑:

我现在在 Postman 中使用 POST 请求进行了尝试,但现在我收到了:

{
    "code": "BadRequestInvalidPublishTarget","message": "Invalid prediction resource id"
}

但我重新检查了我的预测资源 ID,它是正确的。

编辑 2:

我想我在 POST 请求中将错误的东西放入了 predictId 中,我只是放入了一个 ID,但我认为它应该是 /subscriptions/... 部分,就像微软描述的那样。现在的问题是:

{
    "code": "BadRequestInvalidPublishTarget","message": "Invalid prediction id,please pass a prediction resource id."
}

对我来说,这意味着它没有收到预测资源 ID,但我迷路了,所以我不知道问题可能是什么。

编辑 3:

我忘记添加我的 POST 请求:

https://xxx.cognitiveservices.azure.com/customvision/v3.0/training/projects/xxx/
iterations/xxx/publish?publishName=Model&predictionId=/subscriptions/xxx/
resourceGroups/CustomVision/providers/Microsoft.CognitiveServices/accounts/xxx

解决方法

使用 POST 请求发布

如果您想确保您拥有正确的语法,您可以通过执行相同的步骤来检查使用自定义视觉门户。

例如,当我尝试发布一个项目的迭代时,我可以在控制台中看到以下调用:

https://westeurope.api.cognitive.microsoft.com/customvision/v3.3/Training/projects/ID_OF_MY_PROJECT/iterations/ID_OF_MY_ITERATION/publish?predictionId=%2Fsubscriptions%2FID_OF_MY_AZURE_SUBSCRIPTION%2FresourceGroups%2FNAME_OF_MY_RESOURCE_GROUP%2Fproviders%2FMicrosoft.CognitiveServices%2Faccounts%2FNAME_OF_MY_CUSTOM_VISION_PREDICTION_RESOURCE&publishName=NAME_OF_MY_ITERATION

演示: Sample from Custom Vision page

是的,“publicationId”值看起来像你提到的那个,但你必须编码这个字符串的值。

所以改变这个:

predictionId=/subscriptions/xxx/
resourceGroups/CustomVision/providers/Microsoft.CognitiveServices/accounts/xxx

predictionId=%2Fsubscriptions%2Fxxx%2F
resourceGroups%2FCustomVision%2Fproviders%2FMicrosoft.CognitiveServices%2Faccounts%2Fxxx

在您的通话中。

并且要小心使用预测资源,而不是训练资源。


使用 C# 发布

这是一个使用 C# 和 Nuget (here) 上托管的官方自定义视觉包的演示

using System;
using Microsoft.Azure.CognitiveServices.Vision.CustomVision.Training;

namespace so65714960
{
    class Program
    {
        private static CustomVisionTrainingClient _trainingClient;

        static void Main(string[] args)
        {
            Console.WriteLine("Hello World!");

            _trainingClient = new CustomVisionTrainingClient(new ApiKeyServiceClientCredentials("PUT_YOUR_TRAINING_KEY_HERE"));
            // I'm specifying my endpoint here as I'm working on West Europe region
            _trainingClient.Endpoint = "https://westeurope.api.cognitive.microsoft.com/";

            var projectId = new Guid("4b...a5"); // Put your Project Id here
            var iterationId = new Guid("9d...e"); // Put your iteration Id here

            // Get iteration information
            var targetIteration = _trainingClient.GetIteration(projectId,iterationId);
            Console.WriteLine($"Iteration publish resource Id: '{targetIteration.OriginalPublishResourceId}'");

            // If originalPublishResourceId is not null,it is already published
            // For this demo purpose,we unpublish first to publish again after if it is already published
            if (!string.IsNullOrWhiteSpace(targetIteration.OriginalPublishResourceId))
            {
                _trainingClient.UnpublishIteration(projectId,iterationId);

                // Force status refresh
                targetIteration = _trainingClient.GetIteration(projectId,iterationId);
                Console.WriteLine($"Iteration publish resource Id after unpublish: '{targetIteration.OriginalPublishResourceId}'");
            }

            // Publish
            var publicationResourceId = "/subscriptions/7c...e8/resourceGroups/Cognitive_Demo/providers/Microsoft.CognitiveServices/accounts/NRO-Cognitive-CustomVision-WestEurope-Prediction-S0";
            var publication = _trainingClient.PublishIteration(projectId,iterationId,"Publication1",publicationResourceId);
            
            // Force status refresh
            targetIteration = _trainingClient.GetIteration(projectId,iterationId);
            Console.WriteLine($"Iteration publish resource Id after publish: '{targetIteration.OriginalPublishResourceId}'");
        }
    }
}

查看我使用的 Azure 资源:

Azure Prediction resource