Main Content

Clasificar una imagen con GoogLeNet

Este ejemplo muestra cómo clasificar una imagen usando una red neuronal convolucional profunda preentrenada, GoogLeNet.

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.

Cargar una red preentrenada

Cargue la red preentrenada GoogLeNet. Este paso requiere el paquete de soporte Deep Learning Toolbox™ Model for GoogLeNet Network. Si no ha instalado los paquetes de soporte requeridos, el software proporciona un enlace de descarga.

También puede cargar una red preentrenada diferente para clasificar imágenes. Para probar otra red preentrenada, abra este ejemplo en MATLAB® y seleccione una diferente. Por ejemplo, puede probar squeezenet, una red que es incluso más rápida que googlenet. Puede llevar a cabo el ejemplo con más redes preentrenadas. Para obtener una lista de todas las redes disponibles, consulte Load Pretrained Networks.

net = googlenet;

El tamaño de la imagen que desea clasificar debe coincidir con el tamaño de entrada de la red. En GoogLeNet, el primer elemento de la propiedad Layers de la red es la capa de entrada de la imagen. El tamaño de entrada de la red es la propiedad InputSize de la capa de entrada de la imagen.

inputSize = net.Layers(1).InputSize
inputSize = 1×3

   224   224     3

El elemento final de la propiedad Layers es la capa de clasificación de salida. La propiedad ClassNames de esta capa contiene los nombres de las clases que ha aprendido la red. Vea diez nombres de clases al azar del total de 1000.

classNames = net.Layers(end).ClassNames;
numClasses = numel(classNames);
disp(classNames(randperm(numClasses,10)))
    'papillon'
    'eggnog'
    'jackfruit'
    'castle'
    'sleeping bag'
    'redshank'
    'Band Aid'
    'wok'
    'seat belt'
    'orange'

Leer una imagen y cambiar su tamaño

Lea y muestre la imagen que desea clasificar.

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

Muestre el tamaño de la imagen. La imagen tiene 384 por 512 píxeles y tres canales de color (RGB).

size(I)
ans = 1×3

   384   512     3

Cambie el tamaño de la imagen con imresize para que coincida con el tamaño de entrada de la red. Si cambia el tamaño, también se modificará ligeramente la relación de aspecto de la imagen.

I = imresize(I,inputSize(1:2));
figure
imshow(I)

Dependiendo de cuál sea su aplicación, es posible que quiera cambiar el tamaño de la imagen de otra forma. Por ejemplo, puede recortar la esquina superior izquierda de la imagen con I(1:inputSize(1),1:inputSize(2),:). Si tiene Image Processing Toolbox™, puede utilizar la función imcrop.

Clasificar una imagen

Clasifique imágenes y calcule las probabilidades de clase usando classify. La red clasifica la imagen correctamente como un pimiento morrón. Las redes de clasificación se entrenan para generar una única etiqueta para cada imagen de salida, incluso si la imagen contiene varios objetos.

[label,scores] = classify(net,I);
label
label = categorical
     bell pepper 

Muestre la imagen con la etiqueta y las probabilidades predichas de la imagen que tiene esa etiqueta.

figure
imshow(I)
title(string(label) + ", " + num2str(100*scores(classNames == label),3) + "%");

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.

[~,idx] = sort(scores,'descend');
idx = idx(5:-1:1);
classNamesTop = net.Layers(end).ClassNames(idx);
scoresTop = scores(idx);

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

Referencias

[1] Szegedy, Christian, Wei Liu, Yangqing Jia, Pierre Sermanet, Scott Reed, Dragomir Anguelov, Dumitru Erhan, Vincent Vanhoucke, and Andrew Rabinovich. "Going deeper with convolutions." In Proceedings of the IEEE conference on computer vision and pattern recognition, pp. 1-9. 2015.

Consulte también

| | | |

Temas relacionados