#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, выполнив те же действия.
Например, когда я пытаюсь опубликовать итерацию проекта, я вижу следующий вызов в консоли:
Итак, да, значение «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:
Комментарии:
1. Я попробовал заменить «/» на «% 2F», но это не сработало, я получу ту же ошибку. Вы имеете в виду, что при «вызове в консоли» есть консоль пользовательского видения, где вы видите команды, которые выполняются на странице, или вы просто выполняете свою команду внутри консоли?
2. Я говорил о ваших инструментах разработчика navigator, где вы можете видеть сетевые вызовы. Извините за опечатку в моем ответе: поле predictionId должно указывать на название ресурса прогнозирования, а не обучающего!
3. Извините, я ничего не знаю обо всем этом. Что вы имеете в виду под инструментами разработчика Navigator, где я могу его найти? Конечная точка моего ресурса прогнозирования — это ресурс прогнозирования -> xxx-prediciton.
4. Я отредактировал свой ответ, чтобы показать инструменты разработчика navigator. Это не связано с Azure или Cognitive Services, это действительно инструменты разработчика вашего веб-браузера (см. Добавленный мной снимок). Кроме того, будет сложно добавить дополнительную справку, не проверив точный запрос и имена ресурсов Azure…
5. Я добавил демонстрационную версию C #, которую я тестировал на своей стороне, она работает