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 y los nombres de las clases correspondientes usando la función imagePretrainedNetwork. 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 Redes neuronales profundas preentrenadas.

[net,classNames] = imagePretrainedNetwork("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

Visualice 10 de los nombres de las clases al azar.

numClasses = numel(classNames);
disp(classNames(randperm(numClasses,10)))
    "hartebeest"
    "streetcar"
    "hair slide"
    "entertainment center"
    "wreck"
    "Siamese cat"
    "racket"
    "purse"
    "marmoset"
    "fountain"

Leer una imagen

Lea y muestre la imagen que desea clasificar.

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

Cambiar el tamaño de una imagen y clasificarla

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.

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

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.

Utilice la red neuronal para hacer una predicción. Para hacer una predicción con una sola imagen, utilice la función predict. La imagen tiene el tipo de datos uint8. Para hacer predicciones con la red neuronal, convierta la imagen al tipo de datos single. Para usar una GPU, convierta los datos a gpuArray. Para utilizar una GPU se requiere una licencia de Parallel Computing Toolbox™ y un dispositivo GPU compatible. Para obtener información sobre los dispositivos compatibles, consulte GPU Computing Requirements (Parallel Computing Toolbox). De lo contrario, la función usa la CPU.

X = single(X);
if canUseGPU
    X = gpuArray(X);
end
scores = predict(net,X);

La función predict devuelve las probabilidades de cada clase. Para convertir las puntuaciones de clasificación en una etiqueta categórica, utilice la función scores2label.

[label,score] = scores2label(scores,classNames);

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

figure
imshow(I)
title(string(label) + ", " + score)

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 = 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