Creo que en un proyecto real el dataset tendría que ser extraído de un video donde se este utilizando la misma cámara, ángulo, posición e iluminación que se utilizarán en el entorno de producción.
Si quieren probar el modelo en su computador les paso el codigo:
import cv2
import tensorflow as tf
from object_detection.utilsimport visualization_utils as viz_utils
# Carga del modelo
model_path ='C:/Users/Lenovo/Documents/Proyectos_Jupyter_Notebooks/Functions/Dataset/Perros_Gatos_personas/fine_tuned_model/saved_model'model = tf.saved_model.load(model_path)detect_fn = model.signatures['serving_default']# Category_indexcategory_index ={1:{'name':'Perro','id':1},2:{'name':'Gato','id':2},3:{'name':'Persona','id':3}}# Configuración de la cámara web
cap = cv2.VideoCapture(0)whileTrue: ret, frame = cap.read()if not ret:break # Convertir la imagen a un tensor y ejecutar la detección de objetos
input_tensor = tf.convert_to_tensor(frame) input_tensor = input_tensor[tf.newaxis,...] detections =detect_fn(input_tensor) # Extraer los resultados de la detección
num_detections =int(detections.pop('num_detections')) detections ={key: value[0,:num_detections].numpy()for key, value in detections.items()} detections['num_detections']= num_detections
detections['detection_classes']= detections['detection_classes'].astype(int) # Visualización de los resultados
viz_utils.visualize_boxes_and_labels_on_image_array( frame, detections['detection_boxes'], detections['detection_classes'], detections['detection_scores'], category_index, use_normalized_coordinates=True, max_boxes_to_draw=10, min_score_thresh=.5, agnostic_mode=False)try: cv2.imshow('object detection', cv2.resize(frame,(640,480))) except cv2.error:breakif cv2.waitKey(1)==ord('q'):breakcap.release()cv2.destroyAllWindows()
El seguimiento de centroides en OpenCV generalmente se realiza utilizando algoritmos de procesamiento de imágenes para detectar objetos o regiones de interés en cada fotograma y luego calcular su centroide (un punto representativo del centro del objeto). A continuación, te doy un ejemplo básico de cómo realizar un seguimiento de centroides en un video utilizando OpenCV:
### 1. **Instalar OpenCV**
Si aún no has instalado OpenCV, puedes hacerlo con el siguiente comando:
pip install opencv-python
### 2. **Código para Seguimiento de Centroides:**
Este ejemplo detecta objetos en un video utilizando un umbral para detectar cambios en las áreas de la imagen y luego calcula y sigue el centroide de esos objetos a lo largo de los fotogramas.
import cv2
import numpy as np
\# Abre el video
cap = cv2.VideoCapture('video.mp4')whileTrue:  \# Lee el siguiente fotograma  ret, frame = cap.read()  if not ret:  break     \# Convierte el fotograma a escala de grises  gray = cv2.cvtColor(frame, cv2.COLOR\_BGR2GRAY)     \# Aplica un umbral para detectar las áreas de interés  \_, thresh = cv2.threshold(gray, 127, 255, cv2.THRESH\_BINARY)     \# Encuentra los contornos de las áreas detectadas  contours, \_ = cv2.findContours(thresh, cv2.RETR\_EXTERNAL, cv2.CHAIN\_APPROX\_SIMPLE)     \# Dibuja los contornos y calcula los centroides  for contour in contours:  if cv2.contourArea(contour) > 500: # Filtra contornos pequeños  \# Calcula el momento (centroide) del contorno  M = cv2.moments(contour)  if M\["m00"] != 0: # Evita la división por cero  cX = int(M\["m10"] / M\["m00"])  cY = int(M\["m01"] / M\["m00"])     \# Dibuja el centroide en el fotograma  cv2.circle(frame, (cX, cY), 7, (0, 255, 0), -1)  cv2.putText(frame, f"({cX}, {cY})", (cX + 10, cY), cv2.FONT\_HERSHEY\_SIMPLEX, 0.5, (0, 255, 0), 2)     \# Muestra el fotograma con los centroides  cv2.imshow("Centroides", frame)     \# Salir si se presiona 'q'  if cv2.waitKey(1) & 0xFF == ord('q'):  break
\# Libera los recursos
cap.release()cv2.destroyAllWindows()
### Explicación del Código:
1. **Abrir Video**: Usamos cv2.VideoCapture para abrir un archivo de video (también puede ser una cámara en vivo).
2. **Conversión a Escala de Grises**: Convertimos cada fotograma a escala de grises para simplificar el procesamiento.
3. **Umbralización**: Aplicamos un umbral binario con cv2.threshold para separar las áreas del objeto del fondo. Esto genera una imagen en blanco y negro donde las áreas de interés (por ejemplo, los objetos) se destacan.
4. **Detección de Contornos**: Con cv2.findContours, detectamos los contornos de los objetos encontrados en el umbral.
5. **Cálculo del Centroide**: Para cada contorno detectado, calculamos los momentos con cv2.moments para obtener el centroide (usando las coordenadas del primer y segundo momento).
6. **Dibujo del Centroide**: Usamos cv2.circle para dibujar el centroide y cv2.putText para mostrar las coordenadas en el video.
7. **Salir del Bucle**: Se puede presionar 'q' para salir del bucle de video.
### 3. **Modificaciones adicionales**
- **Filtrado de objetos pequeños**: Usamos cv2.contourArea(contour) > 500 para descartar contornos pequeños, puedes ajustar este valor según las necesidades.
- **Seguimiento más avanzado**: Si deseas un seguimiento más avanzado y robusto, puedes usar técnicas como el filtro de Kalman o el algoritmo de seguimiento de objetos de OpenCV como cv2.Tracker.
Este código te proporciona una base para realizar el seguimiento de centroides en tiempo real en un video. Si quieres trabajar con diferentes tipos de objetos o mejorar la precisión, puedes modificar la segmentación (por ejemplo, usando técnicas como el umbral adaptativo o la segmentación por colores).
No me queda clara la definición de POINT con sus cuatro argumentos…
Tampoco me queda claro si los valores de los argumentos dados en este caso tienen alguna razón de ser en particular... (Será por el posicionamiento de la cámara respecto de la calzada de vehículos??)