Main Content

Clasificar imágenes de una webcam mediante deep learning

Este ejemplo muestra cómo clasificar imágenes de una webcam en tiempo real usando una red neuronal convolucional profunda preentrenada, GoogLeNet.

Use MATLAB®, una webcam sencilla y una red neuronal profunda para identificar objetos de su entorno. Este ejemplo usa GoogLeNet, una red neuronal convolucional profunda preentrenada (CNN o ConvNet) que 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). Puede descargar GoogLeNet y utilizar MATLAB para procesar continuamente las imágenes de la cámara en tiempo real.

GoogLeNet ha aprendido representaciones ricas en características para una amplia gama de imágenes. Toma la imagen como entrada y, a continuación, proporciona una etiqueta para el objeto en la imagen y las probabilidades para cada una de las categorías de objetos. Puede experimentar con objetos de su entorno para comprobar la precisión con la que GoogLeNet clasifica las imágenes. Para obtener más información sobre la clasificación de objetos de la red, puede mostrar las puntuaciones para las cinco clases principales en tiempo real en lugar de solamente la decisión final sobre la clase.

Cargar una cámara y una red preentrenada

Conéctese a la cámara y cargue una red GoogLeNet preentrenada. Puede utilizar cualquier red preentrenada en este paso. El ejemplo requiere el MATLAB Support Package for USB Webcams y Deep Learning Toolbox™ Model for GoogLeNet Network. Si no ha instalado los paquetes de soporte requeridos, el software proporciona un enlace de descarga.

camera = webcam;
net = googlenet;

Si desea volver a ejecutar el ejemplo, ejecute primero el comando clear camera, donde camera es la conexión a la webcam. De lo contrario, verá un error porque no puede crear otra conexión a la misma webcam.

Clasificar instantáneas de la cámara

Para clasificar una imagen, debe cambiar su tamaño para que coincida con el tamaño de entrada de la red. Obtenga los dos primeros elementos de la propiedad InputSize de la capa de entrada de imágenes de la red. La capa de entrada de imágenes es la primera capa de la red.

inputSize = net.Layers(1).InputSize(1:2)
inputSize =

   224   224

Muestre la imagen de la cámara con la etiqueta predicha y su probabilidad. Debe cambiar el tamaño de la imagen para que coincida con el tamaño de entrada de la red antes de llamar a classify.

figure
im = snapshot(camera);
image(im)
im = imresize(im,inputSize);
[label,score] = classify(net,im);
title({char(label),num2str(max(score),2)});

Clasificar imágenes de la cámara de forma continua

Para clasificar imágenes de la cámara de forma continua, incluya los pasos anteriores en un bucle. Ejecute el bucle mientras la figura está abierta. Para detener la predicción en tiempo real, solo tiene que cerrar la figura. Use drawnow al final de cada iteración para actualizar la figura.

h = figure;

while ishandle(h)
    im = snapshot(camera);
    image(im)
    im = imresize(im,inputSize);
    [label,score] = classify(net,im);
    title({char(label), num2str(max(score),2)});
    drawnow
end

Mostrar las predicciones principales

Las clases predichas pueden cambiar rápidamente. Por lo tanto, puede ser útil mostrar las predicciones principales juntas. Puede mostrar las cinco predicciones principales y sus probabilidades representando las clases con las puntuaciones de predicción más elevadas.

Clasifique una instantánea de la cámara. Muestre la imagen de la cámara con la etiqueta predicha y su probabilidad. Muestre un histograma de las probabilidades de las cinco predicciones principales mediante la salida score de la función classify.

Cree la ventana de figura. En primer lugar, cambie el tamaño de la ventana para que tenga el doble de ancho y cree dos subgráficas.

h = figure;
h.Position(3) = 2*h.Position(3);
ax1 = subplot(1,2,1);
ax2 = subplot(1,2,2);

En la subgráfica izquierda, muestre la imagen y la clasificación juntas.

im = snapshot(camera);
image(ax1,im)
im = imresize(im,inputSize);
[label,score] = classify(net,im);
title(ax1,{char(label),num2str(max(score),2)});

Seleccione las cinco predicciones principales seleccionando las clases con las puntuaciones más elevadas.

[~,idx] = sort(score,'descend');
idx = idx(5:-1:1);
classes = net.Layers(end).Classes;
classNamesTop = string(classes(idx));
scoreTop = score(idx);

Muestre las cinco predicciones principales a modo de histograma.

barh(ax2,scoreTop)
xlim(ax2,[0 1])
title(ax2,'Top 5')
xlabel(ax2,'Probability')
yticklabels(ax2,classNamesTop)
ax2.YAxisLocation = 'right';

Clasificar imágenes de forma continua y mostrar las predicciones principales

Para clasificar imágenes de la cámara de forma continua y mostrar las predicciones principales, incluya los pasos anteriores en un bucle. Ejecute el bucle mientras la figura está abierta. Para detener la predicción en tiempo real, solo tiene que cerrar la figura. Use drawnow al final de cada iteración para actualizar la figura.

Cree la ventana de figura. En primer lugar, cambie el tamaño de la ventana para que tenga el doble de ancho y cree dos subgráficas. Para evitar que los ejes cambien su tamaño, establezca la propiedad PositionConstraint en 'innerposition'.

h = figure;
h.Position(3) = 2*h.Position(3);
ax1 = subplot(1,2,1);
ax2 = subplot(1,2,2);
ax2.PositionConstraint = 'innerposition';

Muestre y clasifique imágenes de forma continua junto con un histograma de las cinco predicciones principales.

while ishandle(h)
    % Display and classify the image
    im = snapshot(camera);
    image(ax1,im)
    im = imresize(im,inputSize);
    [label,score] = classify(net,im);
    title(ax1,{char(label),num2str(max(score),2)});

    % Select the top five predictions
    [~,idx] = sort(score,'descend');
    idx = idx(5:-1:1);
    scoreTop = score(idx);
    classNamesTop = string(classes(idx));

    % Plot the histogram
    barh(ax2,scoreTop)
    title(ax2,'Top 5')
    xlabel(ax2,'Probability')
    xlim(ax2,[0 1])
    yticklabels(ax2,classNamesTop)
    ax2.YAxisLocation = 'right';

    drawnow
end

Consulte también

| |

Temas relacionados