Saltar navegación

Reto 7: Buscando obxectos en imaxes

Que hai nesta imaxe?

Duración:
50 min
Agrupamento:
2

Agora ides comprobar o verdadeiro potencial de OpenCV ó unilo a un modelo de IA. Usaremos OpenCV para detectar e clasificar obxectos nunha imaxe usando un modelo preentrenado. Neste caso utilizaremos o modelo MobileNet SSD, de dominio público, que xa vén "adestrado" para recoñecer obxectos comúns como persoas, coches, cadeiras, cans etc. Non te preocupes de comprender todas as instrucións, só de que fai cada parte do programa.

Persoas
ast25rulos. Persoas (CC BY-SA)
Resultado do reto
ast25rulos. Resultado do reto (CC BY-SA)

Lembra:A IA está para axudarche, pregúntalle!

Un modelo preentrenado é como un molde que "aprendeu" observando millóns de exemplos de diferentes obxectos.

Por exemplo, este modelo, MobileNetSSD, viu moitas fotos de bicicletas, cans, coches, etc., e analizounas para entender as súas formas e características principais. Agora, cando lle dás unha nova imaxe, o modelo compara esa imaxe cos seus "moldes" e decide se hai algún destes obxectos nela.

No voso caso, o modelo pode recoñecer obxectos como gatos, cadeiras, persoas e máis entre unha lista de 20 categorías. É como un experto que recoñece cousas despois de velas moitas veces antes.

Código Python: Detección de obxectos nunha imaxe

import cv2
import numpy as np
from google.colab import files
from google.colab.patches import cv2_imshow

# ------------------------------------------------------------------
# 1. Subir os arquivos necesarios:
#    Pediráselle ó usuario que suba a imaxe, o arquivo .prototxt e o .caffemodel.
# ------------------------------------------------------------------
print("Sube a imaxe:")
uploaded = files.upload()
for ficheiro in uploaded.keys():
    imaxe = cv2.imread(ficheiro)

print("Sube o arquivo MobileNetSSD_deploy.prototxt.txt:")
uploaded = files.upload()
for ficheiro in uploaded.keys():
    ruta_prototxt = ficheiro

print("Sube o arquivo MobileNetSSD_deploy.caffemodel:")
uploaded = files.upload()
for ficheiro in uploaded.keys():
    ruta_modelo = ficheiro

# ------------------------------------------------------------------
# 2. Cargar o modelo preentrenado usando OpenCV
# ------------------------------------------------------------------
rede = cv2.dnn.readNetFromCaffe(ruta_prototxt, ruta_modelo)

# ------------------------------------------------------------------
# 3. Definir as clases que o modelo pode detectar.
#    A primeira clase é "background", que non nos interesa, despois veñen os obxectos.
# ------------------------------------------------------------------
CLASES = ["background", "avión", "bicicleta", "paxaro", "barco",
          "botella", "autobús", "coche", "gato", "cadeira", "vaca",
          "mesa de comedor", "can", "cabalo", "moto", "persoa",
          "planta en maceta", "ovella", "sofá", "tren", "monitor"]

# ------------------------------------------------------------------
# 4. Preparar a imaxe para o modelo
#    Créase un "blob", que é como transformar a imaxe a un formato que entende o modelo.
#    A imaxe redimensionase a 300x300 píxeles e normalízase.
# ------------------------------------------------------------------
(h, w) = imaxe.shape[:2]
blob = cv2.dnn.blobFromImage(cv2.resize(imaxe, (300, 300)),0.007843, (300, 300), 127.5)

# ------------------------------------------------------------------
# 5. Pasar o blob polo modelo para obter as deteccións
# ------------------------------------------------------------------
rede.setInput(blob)
deteccións = rede.forward()

# ------------------------------------------------------------------
# 6. Procesar as deteccións e debuxar os rectángulos e etiquetas
# ------------------------------------------------------------------
for i in np.arange(0, deteccións.shape[2]):
    # Obter a confianza (o nivel de certeza do modelo na detección)
    confianza = deteccións[0, 0, i, 2]

    # Só consideramos deteccións cunha confianza maior do 20%
    if confianza > 0.2:
        # Obter o índice da clase detectada e o nome (exemplo: "persoa")
        idx = int(deteccións[0, 0, i, 1])
        etiqueta = CLASES[idx]

        # Calcular as coordenadas do rectángulo (adaptándoas á imaxe orixinal)
        caixa = deteccións[0, 0, i, 3:7] * np.array([w, h, w, h])
        (startX, startY, endX, endY) = caixa.astype("int")

        # Debuxar o rectángulo na imaxe (cor azul)
        cv2.rectangle(imaxe, (startX, startY), (endX, endY), (255, 0,0), 2)

        # Escribir a etiqueta e a confianza sobre o rectángulo
        y = startY - 15 if startY - 15 > 15 else startY + 15
        texto = "{}: {:.2f}%".format(etiqueta, confianza * 100)
        cv2.putText(imaxe, texto, (startX, y),cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255,0 , 0), 2)

# ------------------------------------------------------------------
# 7. Amosar a imaxe cos obxectos recoñecidos
# ------------------------------------------------------------------
cv2_imshow(imaxe)
    

Rúbrica de avaliación

Rúbrica Reto 7: Que hai nesta imaxe?
Criterio Excelente (9-10) Bo (7-8) Aceptable (5-6) Mellorable (3-4) Moi mellorable (0-2)
Carga dos arquivos necesarios Sube e carga correctamente a imaxe e os arquivos do modelo. Arquivos correctamente subidos pero con pequenos problemas na carga. Carga parcial dos arquivos con dificultades na súa manipulación. Erro na carga de algún dos ficheiros. Non realiza a carga dos arquivos necesarios.
Configuración do modelo Carga correctamente o modelo MobileNet SSD e define as clases axeitadas. Configuración correcta pero con pequenos erros na definición das clases. Configuración feita pero con dificultades na comprensión do modelo. Erro na carga do modelo. Non realiza esta configuración.
Preparación da imaxe Transforma a imaxe correctamente nun "blob" e pasa polo modelo. Transformación e paso polo modelo correctos pero con pequenos erros. Preparación da imaxe con dificultades na conversión. Erro na conversión da imaxe. Non realiza esta transformación.
Detección de obxectos Identifica obxectos correctamente con confianza superior ao 20%. Detección adecuada pero con pequenas imprecisións. Detección parcial con dificultades na fiabilidade dos resultados. Erro na identificación dos obxectos. Non realiza a detección dos obxectos.
Debuxo de rectángulos e etiquetas Rectángulos correctamente debuxados e etiquetas claras con porcentaxe de confianza. Debuxo de rectángulos correcto pero con pequenas dificultades na presentación. Etiquetas mal posicionadas ou con problemas de formato. Erro na debuxar os rectángulos ou mostrar as etiquetas. Non realiza esta etapa.
Visualización de imaxes Mostra correctamente as imaxes con deteccións en Google Colab. Imáxes ben mostradas pero con pequenos problemas. Visualización parcial con dificultades na interpretación. Erro ao mostrar algunhas imaxes. Non realiza a visualización das imaxes.
Optimización do código e iteración Implementa funcións e iteracións para procesar múltiples imaxes eficientemente. Uso correcto de iteracións pero con pequenas melloras posibles. Código funcional pero sen optimización para múltiples imaxes. Uso deficiente de iteracións ou problemas na reusabilidade. Non realiza melloras na estrutura do código.
Actitude ante os problemas Busca solucións e optimiza os procesos de detección. Resolve os problemas con esforzo e consulta documentación. Resolve con dificultades pero sen explorar melloras. Resígnase ante os erros sen buscar alternativas. Non intenta resolver os problemas ou abandona o traballo.
Traballo colaborativo Comunicación eficaz e traballo equilibrado en parella. Traballo en equipo con pequenas dificultades. Interacción mínima, traballo case independente. Pouca colaboración, realízase gran parte do traballo de forma individual. Non colabora coa parella nin contribúe ao traballo conxunto.