Спасибо cthrash за расширенную помощь и общение со мной в чате.Используя его пост вместе с небольшим устранением неполадок, я выяснил, что работает для меня.Код очень неуклюжий, но это было только для того, чтобы проверить и убедиться, что я могу это сделать.Чтобы ответить на вопрос:
Пакеты и классы Nuget
С помощью сообщения cthrash я смог установить как пакеты обучения, так и прогнозирования, которые являются правильными пакетами дляэто конкретное приложение.Мне нужны были следующие классы:
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
Конечная точка Root
Следуя некоторым шагам Здесь , я определил, что URL-адрес конечной точки должен быть только корневым, а не полный URL-адрес, предоставленный на портале Custom Vision.Например,
https://southcentralus.api.cognitive.microsoft.com/customvision/v2.0/Prediction/
было изменено на
https://southcentralus.api.cognitive.microsoft.com
Я использовали ключ, и конечная точка портала Custom Vision и внесение этого изменения, я смог использовать клиент обучения и прогнозирования для извлечения проектов и итераций.
Получение идентификатора проекта
Чтобы использовать CustomVisionPredictionClient.PredictImageAsync
, вам нужен Guid
для идентификатора проекта и идентификатор итерации, если на портале не задана итерация по умолчанию.
Я протестировал два способа получить идентификатор проекта,
Использование строки идентификатора проекта с портала
- Получение строки идентификатора проекта с портала в настройках проекта.
- Для первогоаргумент
PredictImageAsync
pass Guid.Parse(projectId)
Использование обучающего клиента
- Создатьновый
CustomVisionTrainingClient
Для получения списка <Project>
используйте
TrainingClient.GetProjects().ToList()
В моем случае у меня был только одинпроект, поэтому мне просто нужен первый элемент.
Guid projectId = projects[0].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;
}