Inicio rápido: Creación de un proyecto de clasificación de imágenes con SDK de Custom Vision para .NETQuickstart: Create an image classification project with the Custom Vision .NET SDK

En este artículo se proporciona información y código de ejemplo para ayudarle a empezar a utilizar el SDK de Custom Vision con C# para crear un modelo de clasificación de imágenes.This article provides information and sample code to help you get started using the Custom Vision SDK with C# to build an image classification model. Después de crearlo, puede agregar etiquetas, cargar imágenes, entrenar el proyecto, obtener la dirección URL predeterminada del punto de conexión de predicción del proyecto y utilizar el punto de conexión para probar una imagen mediante programación.After it's created, you can add tags, upload images, train the project, obtain the project's default prediction endpoint URL, and use the endpoint to programmatically test an image. Utilice este ejemplo como plantilla para crear su propia aplicación de .NET.Use this example as a template for building your own .NET application. Si desea seguir el proceso de creación y utilizar un modelo de clasificación sin código, consulte la guía basada en explorador en su lugar.If you wish to go through the process of building and using a classification model without code, see the browser-based guidance instead.

Requisitos previosPrerequisites

Obtención del SDK de Custom Vision y código de ejemploGet the Custom Vision SDK and sample code

Para escribir una aplicación de .NET que utiliza Custom Vision, necesitará los paquetes NuGet de Custom Vision,To write a .NET app that uses Custom Vision, you'll need the Custom Vision NuGet packages. que están incluidos en el proyecto de ejemplo que descargará, pero puede acceder a ellos individualmente aquí.These packages are included in the sample project you will download, but you can access them individually here.

Clone o descargue el proyecto Ejemplos de .NET de Cognitive Services.Clone or download the Cognitive Services .NET Samples project. Vaya a la carpeta CustomVision/ImageClassification carpeta y abra ImageClassification.csproj en Visual Studio.Navigate to the CustomVision/ImageClassification folder and open ImageClassification.csproj in Visual Studio.

Este proyecto de Visual Studio crea un nuevo proyecto de Custom Vision denominado My New Project, al que se puede acceder en el sitio web de Custom Vision.This Visual Studio project creates a new Custom Vision project named My New Project, which can be accessed through the Custom Vision website. A continuación, carga las imágenes para entrenar y probar un clasificador.It then uploads images to train and test a classifier. En este proyecto, el clasificador pretende determinar si un árbol es un abeto o un cerezo japonés.In this project, the classifier is intended to determine whether a tree is a Hemlock or a Japanese Cherry.

Obtención de las claves de entrenamiento y predicciónGet the training and prediction keys

El proyecto necesita un conjunto válido de claves de suscripción para interactuar con el servicio.The project needs a valid set of subscription keys in order to interact with the service. Para obtener un conjunto de claves de la versión de evaluación gratuita, vaya al sitio web de Custom Vision e inicie sesión con una cuenta Microsoft.To get a set of free trial keys, go to the Custom Vision website and sign in with a Microsoft account. Seleccione el icono de engranaje en la esquina superior derecha.Select the gear icon in the upper right. En la sección Accounts (Cuentas), vea los valores de los campos Training Key (Clave de entrenamiento), Prediction Key (Clave de predicción) y Prediction Resource Id (Id. de recurso de predicción).In the Accounts section, see the values in the Training Key, Prediction Key and Prediction Resource Id fields. Los necesitará más adelante.You will need these later.

Imagen de la interfaz de usuario de claves

Comprendiendo el códigoUnderstand the code

Abra el archivo Program.cs e inspeccione el código.Open the Program.cs file and inspect the code. Inserte las claves de la suscripción en las definiciones pertinentes del método Main.Insert your subscription keys in the appropriate definitions in the Main method.

{
    // Add your training & prediction key from the settings page of the portal
    string trainingKey = "<your training key here>";
    string predictionKey = "<your prediction key here>";

    // Create the Api, passing in the training key
    CustomVisionTrainingClient trainingApi = new CustomVisionTrainingClient()
    {
        ApiKey = trainingKey,
        Endpoint = Endpoint

El parámetro de punto de conexión debe apuntar a la región donde se creó el grupo de recursos de Azure que contiene los recursos de Custom Vision.The Endpoint parameter should point to the region where the Azure resource group containing the Custom Vision resources was created in. En este ejemplo se asume la región Centro-sur de EE. UU. y utilice:For this example, we assume the South Central US region and use:

// Add your Azure Custom Vision subscription key and endpoint to your environment variables.

Las siguientes líneas de código ejecutan la funcionalidad principal del proyecto.The following lines of code execute the primary functionality of the project.

Creación de un proyecto de Custom Vision ServiceCreate a new Custom Vision service project

El proyecto creado se mostrará en el sitio web de Custom Vision que ha visitado anteriormente.The created project will show up on the Custom Vision website that you visited earlier. Consulte el método CreateProject para especificar otras opciones al crear el proyecto (explicadas en la guía del portal web Compilación de un clasificador).See the CreateProject method to specify other options when you create your project (explained in the Build a classifier web portal guide).


// Create a new project
Console.WriteLine("Creating new project:");

Creación de etiquetas en el proyectoCreate tags in the project


// Make two tags in the new project
var hemlockTag = trainingApi.CreateTag(project.Id, "Hemlock");

Carga y etiquetado de imágenesUpload and tag images

Se incluyen las imágenes de este proyecto.The images for this project are included. Se hace referencia a ellas en el método LoadImagesFromDisk de Program.cs.They are referenced in the LoadImagesFromDisk method in Program.cs. Puede cargar hasta 64 imágenes en un único lote.You can upload up to 64 images in a single batch.


// Add some images to the tags
Console.WriteLine("\tUploading images");
LoadImagesFromDisk();

// Images can be uploaded one at a time
foreach (var image in hemlockImages)
{
    using (var stream = new MemoryStream(File.ReadAllBytes(image)))
    {
        trainingApi.CreateImagesFromData(project.Id, stream, new List<Guid>() { hemlockTag.Id });
    }
}

// Or uploaded in a single batch 
var imageFiles = japaneseCherryImages.Select(img => new ImageFileCreateEntry(Path.GetFileName(img), File.ReadAllBytes(img))).ToList();

Entrenar el clasificador y publicarloTrain the classifier and publish

Este código crea la primera iteración del proyecto y, después, publica dicha iteración en el punto de conexión de la predicción.This code creates the first iteration in the project and then publishes that iteration to the prediction endpoint. El nombre que se da a la iteración publicada se puede utilizar para enviar solicitudes de predicción.The name given to the published iteration can be used to send prediction requests. Una iteración no está disponible en el punto de conexión de la predicción hasta que se publica.An iteration is not available in the prediction endpoint until it is published.

var iteration = trainingApi.TrainProject(project.Id);
// The returned iteration will be in progress, and can be queried periodically to see when it has completed
while (iteration.Status == "Training")
{
        Thread.Sleep(1000);

        // Re-query the iteration to get it's updated status
        iteration = trainingApi.GetIteration(project.Id, iteration.Id);
}

// The iteration is now trained. Publish it to the prediction end point.
var publishedModelName = "treeClassModel";
var predictionResourceId = "<target prediction resource ID>";
trainingApi.PublishIteration(project.Id, iteration.Id, publishedModelName, predictionResourceId);
Console.WriteLine("Done!\n");

Establecimiento del punto de conexión de la predicciónSet the prediction endpoint

El punto de conexión de la predicción es la referencia que puede utilizar para enviar una imagen al modelo actual y obtener una predicción de clasificación.The prediction endpoint is the reference that you can use to submit an image to the current model and get a classification prediction.

// Create a prediction endpoint, passing in obtained prediction key
CustomVisionPredictionClient endpoint = new CustomVisionPredictionClient()
{
        ApiKey = predictionKey,
        Endpoint = SouthCentralUsEndpoint
};

Envío de una imagen al punto de conexión de la predicción predeterminadoSubmit an image to the default prediction endpoint

En este script, se carga la imagen de prueba en el método LoadImagesFromDisk y la salida de la predicción del modelo se va a mostrar en la consola.In this script, the test image is loaded in the LoadImagesFromDisk method, and the model's prediction output is to be displayed in the console. El valor de la variable publishedModelName debe corresponder al valor "Published as" (Publicado como) que se encuentra en la pestaña Performance (Rendimiento) del portal de Custom Vision.The value of the publishedModelName variable should correspond to the "Published as" value found on the Custom Vision portal's Performance tab.

// Make a prediction against the new project
Console.WriteLine("Making a prediction:");
var result = endpoint.ClassifyImage(project.Id, publishedModelName, testImage);

// Loop over each prediction and write out the results
foreach (var c in result.Predictions)
{
        Console.WriteLine($"\t{c.TagName}: {c.Probability:P1}");
}

Ejecución de la aplicaciónRun the application

Cuando se ejecuta la aplicación, se debería abrir una ventana de consola y escribir la salida siguiente:As the application runs, it should open a console window and write the following output:

Creating new project:
        Uploading images
        Training
Done!

Making a prediction:
        Hemlock: 95.0%
        Japanese Cherry: 0.0%

Luego puede comprobar que la imagen de prueba (que se encuentra en imágenes/Test/ ) se ha etiquetado correctamente.You can then verify that the test image (found in Images/Test/) is tagged appropriately. Para salir de la aplicación, presione cualquier tecla.Press any key to exit the application. También puede volver al sitio web de Custom Vision y ver el estado actual del proyecto recién creado.You can also go back to the Custom Vision website and see the current state of your newly created project.

Limpieza de recursosClean up resources

Si desea implementar su propio proyecto de clasificación de imágenes (o probar un proyecto de detección de objetos), puede que desee eliminar el proyecto de identificación de árboles de este ejemplo.If you wish to implement your own image classification project (or try an object detection project instead), you may want to delete the tree identification project from this example. Una versión de evaluación gratuita permite dos proyectos de Custom Vision.A free trial allows for two Custom Vision projects.

En el sitio web de Custom Vision, vaya a Proyectos y seleccione la papelera en My New Project.On the Custom Vision website, navigate to Projects and select the trash can under My New Project.

Captura de pantalla de un panel denominado My New Project con el icono de papelera

Pasos siguientesNext steps

Ya ha visto cómo todos los pasos del proceso de clasificación de imágenes se pueden realizar en código.Now you have seen how every step of the image classification process can be done in code. En este ejemplo se ejecuta una sola iteración de entrenamiento, pero a menudo necesitará entrenar y probar su modelo varias veces para hacerlo más preciso.This sample executes a single training iteration, but often you will need to train and test your model multiple times in order to make it more accurate.