Main Content

Clasificar imágenes en Simulink con GoogLeNet

En este ejemplo se muestra cómo clasificar una imagen en Simulink® usando el bloque Image Classifier. En este ejemplo se usa la red neuronal convolucional profunda preentrenada GoogLeNet para llevar a cabo una clasificación.

Redes GoogLeNet preentrenadas

GoogLeNet se ha entrenado con más de un millón de imágenes y puede clasificarlas en 1000 categorías de objetos (como teclado, taza de café, lápiz y muchos animales). La red ha aprendido representaciones ricas en características para una amplia gama de imágenes. La red toma una imagen como entrada y, a continuación, emite una etiqueta para el objeto de la imagen junto con las probabilidades de cada una de las categorías de objetos.

net = googlenet;
inputSize = net.Layers(1).InputSize;
classNames = net.Layers(end).ClassNames;
numClasses = numel(classNames);
disp(classNames(randperm(numClasses,10)))
    {'speedboat'    }
    {'window screen'}
    {'isopod'       }
    {'wooden spoon' }
    {'lipstick'     }
    {'drake'        }
    {'hyena'        }
    {'dumbbell'     }
    {'strawberry'   }
    {'custard apple'}

Leer una imagen y cambiar su tamaño

Lea y muestre la imagen que desea clasificar.

I = imread('peppers.png');
figure
imshow(I)

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);

Modelo de Simulink para predicción

Se muestra el modelo de Simulink para clasificar imágenes. El modelo usa un bloque From Workspace para cargar la imagen de entrada, un bloque Image Classifier de la biblioteca Deep Neural Networks que clasifica la entrada y un bloque Display para mostrar la salida predicha.

model = 'googlenet_classifier';
open_system(model);

Ejecutar la simulación

Para validar el modelo de Simulink, ejecute la simulación.

set_param(model,'SimulationMode','Normal');
sim(model);

La red clasifica la imagen como un pimiento morrón.

Mostrar las predicciones principales

Muestre las cinco etiquetas predichas principales y las probabilidades asociadas a ellas a modo de histograma. Debido a que la red clasifica las imágenes en muchas categorías de objetos y muchas de estas son similares, es habitual tener en cuenta la precisión de las cinco principales al evaluar las redes. Hay una alta probabilidad de que la red clasifique la imagen como un pimiento morrón.

scores = yout.signals(1).values(:,:,1);
labels = yout.signals(2).values(:,:,1);
[~,idx] = sort(scores,'descend');
idx = idx(5:-1:1);
scoresTop = scores(idx);
labelsTop = split(string(labels(idx)),'_');
labelsTop = labelsTop(:,:,1);

figure
imshow(I)
title(labelsTop(5) + ", " + num2str(100*scoresTop(5) + "%"));

figure
barh(scoresTop)
xlim([0 1])
title('Top 5 Predictions')
xlabel('Probability')
yticklabels(labelsTop)