Main Content

Esta página es para la versión anterior. La página correspondiente en inglés ha sido eliminada en la versión actual.

Exportar una red de clasificación de imágenes de Deep Network Designer a Simulink

En este ejemplo se muestra cómo exportar un clasificador de imágenes entrenado mediante Deep Network Designer a Simulink®.

Cargar datos

Cargue los datos de dígitos de muestra. El conjunto de datos de dígitos está compuesto de 10.000 imágenes sintéticas a escala de grises de dígitos manuscritos. Cada imagen mide 28 por 28 píxeles y tiene una etiqueta asociada que determina a qué dígito representa (0-9).

digitDatasetPath = fullfile(matlabroot,"toolbox","nnet","nndemos", ...
    "nndatasets","DigitDataset");

Cree un almacén de datos de imágenes. La función imageDatastore etiqueta automáticamente las imágenes en función de los nombres de carpeta.

imds = imageDatastore(digitDatasetPath, ...
    IncludeSubfolders=true, ...
    LabelSource="foldernames");

Divida los datos en conjuntos de prueba y de entrenamiento mediante splitEachLabel.

[imdsTrain,imdsTest] = splitEachLabel(imds,0.9,"randomize");

Definir la arquitectura de red

Defina la arquitectura de la red neuronal convolucional. Puede crear esta red en la línea de comandos o utilizando Deep Network Designer de forma interactiva.

Especifique el tamaño de las imágenes en la capa de entrada de la red y el número de clases en la capa totalmente conectada antes de la capa de clasificación.

inputSize = [28 28 1];
numClasses = 10;
layers = [
    imageInputLayer(inputSize)
    convolution2dLayer(5,20)
    batchNormalizationLayer
    reluLayer
    fullyConnectedLayer(numClasses)
    softmaxLayer
    classificationLayer];

Visualice la red en Deep Network Designer.

deepNetworkDesigner(layers)

Importar datos

Para importar el almacén de datos de imágenes, seleccione la pestaña Data y haga clic en Import Data > Import Image Classification Data. Seleccione imdsTrain como el origen de los datos. Reserve el 30% de los datos de entrenamiento para utilizarlos como datos de validación. Para asignar observaciones de forma aleatoria a los conjuntos de entrenamiento y validación, seleccione Randomize.

Importe los datos haciendo clic en Import.

Entrenar la red

Especifique las opciones de entrenamiento y entrene la red.

En la pestaña Training, haga clic en Training Options. Para este ejemplo, establezca el número máximo de épocas en cinco y conserve el resto de valores predeterminados. Establezca las opciones de entrenamiento haciendo clic en OK.

Entrene la red haciendo clic en Train.

La precisión es la fracción de etiquetas que la red predice correctamente. En este caso, más del 98% de las etiquetas predichas coincide con las etiquetas verdaderas del conjunto de validación.

Exportar red a Simulink

Para exportar la red entrenada a Simulink®, en la pestaña Training, haga clic en Export > Export to Simulink.

Guarde la red en la ubicación que prefiera.

Deep Network Designer crea bloques de Simulink® que son compatibles con la red entrenada. En este ejemplo, la app crea un bloque Predict y un bloque Image Classifier.

Crear modelos de Simulink

Puede utilizar los bloques generados y crear un modelo de Simulink para predecir y clasificar imágenes. En este ejemplo, utilice el bloque Image Classifier para clasificar una selección de imágenes de prueba.

Este ejemplo proporciona el modelo de Simulink digitsClassifier.slx, que utiliza una red de clasificación de dígitos preentrenada adjunta como un archivo de soporte. Puede abrir el modelo de Simulink (proporcionado en este ejemplo) o crear un modelo utilizando los bloques generados por Deep Network Designer.

Abra digitsClassifier.slx para ver el modelo preconstruido.

model = "digitsClassifier";
open_system(model);

Para crear este modelo usando los bloques que ha generado con Deep Network Designer, siga los pasos que aparecen a continuación.

1. Elimine el bloque Predict.

2. Seleccione el bloque Image Classifier. En Outputs, seleccione Classification y Predictions. El software rellenará automáticamente la ruta del archivo con la ruta a la red entrenada en Deep Network Designer.

3. Inserte un bloque From Workspace. Conecte este bloque a la entrada del bloque Image Classifier. Seleccione el bloque From Workspace y establezca Sample time en 1. Desactive la casilla Interpolate data y establezca From output after final data value by en Holding final value.

4. Inserte dos bloques Outport y conéctelos a la salida de scores y labels del bloque Image Classifier.

5. (Opcional) Inserte un bloque Display y conéctelo a la salida ypred del bloque Image Classifier.

6. Guarde el modelo como digitsClassifier.slx.

La funcionalidad de deep learning de Simulink® usa el bloque MATLAB® Function, que requiere un compilador compatible. La mayoría de plataformas incluyen un compilador de C predeterminado con la instalación de MATLAB. Cuando usa el lenguaje C++, debe instalar un compilador de C++ compatible. Para ver una lista de los compiladores compatibles, consulte Supported and Compatible Compilers.

Cargar imágenes de prueba

Cargue imágenes de prueba para clasificarlas con el modelo.

I = [];
numImages = 6;

for i = 1:numImages
    idx = randi(length(imdsTest.Labels));
    I(:,:,1,i) = readimage(imdsTest,idx);
    trueLabel(i) = imdsTest.Labels(idx);
end

Para importar estos datos en el modelo de Simulink, debe especificar una variable estructural que contenga los datos de la imagen de entrada y un vector de tiempo vacío.

simin.time = [];
simin.signals.values = I;
simin.signals.dimensions = size(I);

Predicciones con modelos de Simulink

Simule el modelo y guarde la salida de la simulación como out.

set_param(model,SimulationMode="Normal");
out = sim(model);

La red clasifica las seis imágenes.

Puede mejorar la velocidad de simulación de sus modelos de deep learning de Simulink utilizando los modos del acelerador del producto Simulink. Para obtener más información, consulte Acceleration for Simulink Deep Learning Models.

Mostrar las predicciones principales

Extraiga los resultados de cada imagen de prueba y ordénelos de más a menos probable.

scores = out.yout{1}.Values(:,:,1);
scores = scores.Data(:,:,1);
labels = out.yout{2}.Values(:,:,1);
labels = labels.Data(:,:,1);

[~,idx] = sort(scores,2,"descend");
idx = idx(:,5:-1:1);
scoresTop = rand([numImages,5]);
for i = 1:numImages
    scoresTop(i,:) = scores(i,idx(i,:));
end

labelsTop = split(string(labels(idx)),{'x','_'});
labelsTop = labelsTop(:,:,2);

Muestre las cinco etiquetas predichas principales y las probabilidades asociadas a ellas a modo de histograma para cada imagen de prueba.

figure
tiledlayout(3,4,TileSpacing="compact")
for i = 1:numImages
    nexttile
    imshow(uint8(I(:,:,:,i)))
    predSubtitle = "Pred: "+labelsTop(i,5)+ ...
    " ("+string(round(100*scoresTop(i,5),2)+"%)");
    trueSubtitle = "True: "+string(trueLabel(i));
    title({trueSubtitle,predSubtitle});

    nexttile
    barh(scoresTop(i,:))
    xlim([0 1])
    title("Top 5 Predictions")
    xlabel("Probability")
    yticklabels(labelsTop(i,:))
end

Consulte también

| |

Temas relacionados