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.
Paso 1: Arquivos necesarios para este reto
Importante: > Para que este reto funcione en Google Colab é necesario que subas tres arquivos: > 1. A imaxe na que queres detectar obxectos. > 2. O arquivo de definición do modelo: MobileNetSSD_deploy.prototxt.txt > 3. O arquivo cos pesos do modelo: MobileNetSSD_deploy.caffemodel > > Podes descargar estes dous últimos desde Internet (buscaralos cos seus nomes). Asegúrate de telos para subilos a Colab con este código:
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
Paso 2: Cargar o modelo con OpenCV
Este código fai que teñamos a disposición o modelo para que traballe para nós e tamén lle dicimos como queremos que lle chame a cada obxecto( como non el os ten en inglés) que pode detectar o modelo:
# ------------------------------------------------------------------
# 2. Cargar o modelo preentrenado usando OpenCV
# ------------------------------------------------------------------
rede = cv2.dnn.readNetFromCaffe(ruta_prototxt, ruta_modelo)
# ------------------------------------------------------------------
# 3. Definir as clases(tipos de obxectos) 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"]
Paso 3: Preparar a imaxe para que poda "probar" o modelo
Preparar a imaxe para o modelo: Transfórmase a imaxe nun "blob" (unha maneira de transformar a imaxe para que a rede neuronal enténdaa).
Obter as deteccións: Pásase o "blob" polo modelo e este devolve a información sobre que obxectos atopou e onde están na imaxe.
# ------------------------------------------------------------------
# 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()
Paso 4: Obter o nivel de certeza na detección e debuxar os rectángulos na imaxe
Percórrese a lista de deteccións e, para cada obxecto que o modelo atopou con suficiente seguridade (máis do 20%), debúxase un rectángulo azul ao seu redor e escríbese o nome do obxecto e a porcentaxe de certeza.
# ------------------------------------------------------------------
# 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)
Paso 5: Agora tócache a tÍ !!!!
Propoñoche:
- Proba o programa completo para comprender o seu funcionamento con distintas imaxes
- Proba a cambiar as cores do rectángulo e do texto
- Que ocorre se cambiamos o límite de confianza?Proba coa mesma imaxe varios límites máis altos e baixos e razona sobre o resultado
- Neste momento, cada vez que queres probar o programa, tes que subir os 3 arquivos e esperar un pouco...que che parece se usamos Python básico para:
- Crear unha función def procesar_imaxe(rede, CLASES) para subir a imaxe, preparala e pasala polo modelo, procesar as detección, debuxar os rectángulos e mostrar os resultados
- Procesar imaxes con while True: de xeito iterativo, para poder decidir se queremos ou non procesar máis imaxes.
Ánimo! Só é mover uns bloqueciños de código!
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)
RESPOSTA-Límite de confianza
Se cambiamos o límite de confianza no programa, afectará directamente ás deteccións mostradas:
-
Límite máis baixo (por exemplo, 0.1 ou 0.05):
-
O modelo será menos estrito e aceptará deteccións con menor nivel de certeza.
-
Isto pode provocar máis obxectos detectados, incluíndo algúns que non son correctos (falsos positivos).
-
Por exemplo, pode identificar unha sombra como "cadeira" ou un reflexo como "botella".
-
É útil se queremos asegurarnos de non perder ningún obxecto importante, pero aumenta o risco de erros.
-
-
Límite máis alto (por exemplo, 0.5 ou 0.8):
-
O modelo será máis estrito e só mostrará deteccións nas que estea moi seguro.
-
Isto pode reducir os falsos positivos, pero tamén eliminará obxectos que teñan unha confianza menor pero que realmente están presentes na imaxe.
-
Útil cando se prioriza a precisión sobre a cantidade de deteccións.
-
RESPOSTA-Programa iterativo para subir e procesar tantas imaxes como queramos
Código Python: Detección de obxectos en máis dunha imaxe
import cv2
import numpy as np
from google.colab import files
from google.colab.patches import cv2_imshow
# Función para procesar a imaxe e recoñecer obxectos
def procesar_imaxe(rede, CLASES):
print("Sube a imaxe:")
uploaded = files.upload()
for ficheiro in uploaded.keys():
imaxe = cv2.imread(ficheiro)
# Preparar a imaxe para o modelo
(h, w) = imaxe.shape[:2]
blob = cv2.dnn.blobFromImage(cv2.resize(imaxe, (300, 300)),
0.007843, (300, 300), 127.5)
# Pasar o blob polo modelo para obter as deteccións
rede.setInput(blob)
deteccións = rede.forward()
# Procesar as deteccións e debuxar os rectángulos e etiquetas
for i in np.arange(0, deteccións.shape[2]):
confianza = deteccións[0, 0, i, 2]
if confianza > 0.2:
idx = int(deteccións[0, 0, i, 1])
etiqueta = CLASES[idx]
caixa = deteccións[0, 0, i, 3:7] * np.array([w, h, w, h])
(startX, startY, endX, endY) = caixa.astype("int")
cv2.rectangle(imaxe, (startX, startY), (endX, endY), (255, 255, 0), 2)
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, 255, 0), 2)
# Amosar a imaxe cos obxectos recoñecidos
cv2_imshow(imaxe)
# ------------------------------------------------------------------
# 1. Subir os arquivos necesarios:
# ------------------------------------------------------------------
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
# Cargar o modelo preentrenado usando OpenCV
rede = cv2.dnn.readNetFromCaffe(ruta_prototxt, ruta_modelo)
# Definir as clases que o modelo pode detectar
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"]
# ------------------------------------------------------------------
# 2. Procesar imaxes de forma iterativa
# ------------------------------------------------------------------
while True:
procesar_imaxe(rede, CLASES)
# Preguntar ao usuario se quere subir outra imaxe
continuar = input("Queres subir outra imaxe? (si/non): ").strip().lower()
if continuar != "si":
print("Actividade rematada. Grazas!")
break