Logo de CursoIA
CursoIA Curso de Inteligencia Artificial

Visión por computador en tiempo real, Unidad 5 — Modelos para tiempo real, 5.2 — Detectores rápidos ·

Trade-offs prácticos

Trade-offs prácticos: Elegir modelos de detección rápida para visión por computador en tiempo real

Introducción

La elección adecuada del modelo de detección es crucial cuando se trabaja con visión por computador (Vc) en tiempo real. Los modelos de detección rápidos deben equilibrar la precisión y el rendimiento, ya que ambos factores influyen directamente en cómo funcionará nuestro sistema. En esta unidad, exploraremos algunos trade-offs prácticos al elegir modelos para aplicaciones en tiempo real, con un enfoque especial en YOLO (You Only Look Once) y SSD (Single Shot MultiBox Detector).

Explicación principal

La detección rápida es una tarea compleja que requiere un equilibrio preciso entre velocidad y precisión. Modelos como YOLO y SSD son populares por su capacidad para detectar objetos en tiempo real, pero cada uno tiene sus propias fortalezas y debilidades.

YOLO

YOLO vuelve a procesar la imagen completa múltiples veces (generalmente 3-4) para hacer predicciones. Este método es muy rápido porque no necesita dividir la imagen en sub-regiones para detectar objetos, lo que reduce el tiempo de inferencia.

Ejemplo de código:

import cv2

def yolo_detection(image):
    net = cv2.dnn.readNet("yolov4.weights", "yolov4.cfg")
    blob = cv2.dnn.blobFromImage(image, 0.00392, (416, 416), (0, 0, 0), True, crop=False)
    net.setInput(blob)
    outs = net.forward(get_output_layers(net))
    class_ids = []
    confidences = []
    boxes = []

    for out in outs:
        for detection in out:
            scores = detection[5:]
            class_id = np.argmax(scores)
            confidence = scores[class_id]
            if confidence > 0.5:  # Threshold
                center_x = int(detection[0] * width)
                center_y = int(detection[1] * height)
                w = int(detection[2] * width)
                h = int(detection[3] * height)
                x = center_x - w / 2
                y = center_y - h / 2
                class_ids.append(class_id)
                confidences.append(float(confidence))
                boxes.append([x, y, w, h])

    return (class_ids, confidences, boxes)

def get_output_layers(net):
    layer_names = net.getLayerNames()
    output_layers = [layer_names[i[0] - 1] for i in net.getUnconnectedOutLayers()]
    return output_layers

SSD

SSD en cambio, divide la imagen en regiones y aplica un detector a cada una. Esto le permite realizar múltiples detecciones paralelas, lo que reduce el tiempo de inferencia.

Ejemplo de código:

import cv2

def ssd_detection(image):
    net = cv2.dnn.readNetFromCaffe("deploy.prototxt", "ssd_iter_10000.caffemodel")
    blob = cv2.dnn.blobFromImage(image, 0.007843, (300, 300), (127.5, 127.5, 127.5))
    net.setInput(blob)
    detections = net.forward()

    class_ids = []
    confidences = []

    for i in range(detections.shape[2]):
        confidence = detections[0, 0, i, 2]
        if confidence > 0.5:
            box = detections[0, 0, i, 3:7] * np.array([width, height, width, height])
            (centerX, centerY, endX, endY) = box.astype("int")
            x = int(centerX - (endX / 2))
            y = int(centerY - (endY / 2))
            class_ids.append(int(detections[0, 0, i, 1]))
            confidences.append(float(confidence))

    return (class_ids, confidences)

def preprocess_image(image):
    image = cv2.resize(image, (300, 300))
    image = image.astype("float") / 255.0
    image = np.transpose(image, (2, 0, 1))
    image = np.expand_dims(image, axis=0)
    return image

Errores típicos / trampas

1. Malentendidos sobre el rendimiento real vs teórico

Es fácil confundirse con la velocidad de inferencia teórica del modelo en comparación con su rendimiento real. Factores como la implementación, el hardware y la optimización pueden afectar significativamente las prestaciones.

2. Ignorar la precisión en favor de la velocidad

Una detección rápida puede resultar en malas predicciones si se sacrifica demasiado la precisión. Es importante encontrar un equilibrio adecuado entre ambos factores para garantizar que el sistema funcione correctamente.

3. Falta de consideración para el tamaño del modelo

Un modelo más pequeño y ligero puede ser más rápido, pero a veces ofrece una menor precisión. En contraste, un modelo más grande puede proporcionar mejores resultados en términos de detección, aunque su tiempo de inferencia puede ser más lento.

Checklist accionable

  • Analiza las características del modelo: Revisa el número de capas, tamaño del modelo y la arquitectura general.
  • Prueba con datos reales: Asegúrate de probar los modelos en conjuntos de datos similares a los que se espera manejar durante el despliegue real.
  • Mide y optimiza el rendimiento: Utiliza herramientas como PyTorch, TensorFlow o OpenCV para medir la precisión y velocidad del modelo.
  • Considera la implementación: La forma en que se implementa el modelo puede afectar su rendimiento. Optimiza según sea necesario.
  • Mantén actualizado tu hardware: Las mejoras en los dispositivos de hardware pueden beneficiar significativamente el desempeño del modelo.

Cierre

La elección del modelo adecuado para detecciones rápidas es crucial para sistemas de visión por computador en tiempo real. Al comprender las fortalezas y debilidades de YOLO y SSD, así como los trade-offs que conllevan, puedes tomar decisiones más informadas sobre cuál modelo elegir. Recuerda siempre medir y optimizar el rendimiento del modelo para asegurar su funcionalidad en entornos reales.

Siguientes pasos

  • Investiga modelos alternativos: Considera otros modelos como Faster R-CNN, RetinaNet o EfficientDet.
  • Optimiza con hardware especializado: Investiga GPUs, TPUs y acceleradores de visión para mejorar el rendimiento del modelo.
  • Despliega en producción: Implementa el modelo elegido en un sistema de producción y continúa monitoreando su desempeño.

Contacto

Indica tu objetivo (ChatGPT, RAG, agentes, automatización) y tu stack (web/backend).