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 Cargar redes preentrenadas.
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.
[2] BVLC GoogLeNet Model. https://github.com/BVLC/caffe/tree/master/models/bvlc_googlenet
Consulte también
DAGNetwork
| googlenet
| classify
| predict
| squeezenet