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)