Ошибка отправки запроса Azure Custom Vision Api, даже правильные идентификаторы

#c# #api #post #azure-cognitive-services #microsoft-custom-vision

#c# #API #Публикация #azure-cognitive-services #microsoft-custom-vision

Вопрос:

Я пытаюсь опубликовать свою итерацию пользовательского видения после того, как я ее обучил. Но я всегда получаю сообщение об ошибке «Плохой запрос».

Я пытаюсь использовать следующую строку кода:

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

Он должен опубликовать мою итерацию, но я просто получаю сообщение об ошибке.

Я перепроверил все свои документы, но, похоже, все в порядке. Должно ли название модели быть каким-то конкретным (начинаться со строчной буквы или что-то в этом роде)?

Редактировать:

Я попробовал это сейчас с POST-запросом в Postman, но теперь я получаю:

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

Но я перепроверил свой идентификатор ресурса прогнозирования, и он правильный.

Правка 2:

Я думаю, что я неправильно ввел predictionId в POST-запросе, я просто ввел идентификатор, но я думаю, что это должна была быть часть / subscriptions/ …, как описано Microsoft. Проблема сейчас заключается в следующем:

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

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

Правка 3:

Я забыл добавить свой запрос на публикацию:

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

Ответ №1:

Опубликовать с помощью POST-запроса

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

Например, когда я пытаюсь опубликовать итерацию проекта, я вижу следующий вызов в консоли:

https://westeurope.api.cognitive.microsoft.com/customvision/v3.3/Training/projects/ID_OF_MY_PROJECT/iterations/ID_OF_MY_ITERATION/publish?predictionId=/subscriptions/ID_OF_MY_AZURE_SUBSCRIPTION/resourceGroups/NAME_OF_MY_RESOURCE_GROUP/providers/Microsoft.CognitiveServices/accounts/NAME_OF_MY_CUSTOM_VISION_PREDICTION_RESOURCEamp;publishName=NAME_OF_MY_ITERATION

ДЕМОНСТРАЦИЯ: Пример со страницы пользовательского видения

Итак, да, значение «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 (здесь)

 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

Комментарии:

1. Я попробовал заменить «/» на «% 2F», но это не сработало, я получу ту же ошибку. Вы имеете в виду, что при «вызове в консоли» есть консоль пользовательского видения, где вы видите команды, которые выполняются на странице, или вы просто выполняете свою команду внутри консоли?

2. Я говорил о ваших инструментах разработчика navigator, где вы можете видеть сетевые вызовы. Извините за опечатку в моем ответе: поле predictionId должно указывать на название ресурса прогнозирования, а не обучающего!

3. Извините, я ничего не знаю обо всем этом. Что вы имеете в виду под инструментами разработчика Navigator, где я могу его найти? Конечная точка моего ресурса прогнозирования — это ресурс прогнозирования -> xxx-prediciton.

4. Я отредактировал свой ответ, чтобы показать инструменты разработчика navigator. Это не связано с Azure или Cognitive Services, это действительно инструменты разработчика вашего веб-браузера (см. Добавленный мной снимок). Кроме того, будет сложно добавить дополнительную справку, не проверив точный запрос и имена ресурсов Azure…

5. Я добавил демонстрационную версию C #, которую я тестировал на своей стороне, она работает