PTENES
MÓDULO 3.3 · PRÁCTICA

🔍 Detectar objetos con YOLO26

La máscara de color encuentra «el rojo». Un detector encuentra a la persona, la botella, el gato, con una caja y un nivel de certeza. Ejecutas Ultralytics YOLO26 en el Pi 5, exportas a NCNN y mides la mejora, conoces el AI HAT+, entrenas un modelo con tus propias fotos y aprendes dónde falla la detección.

6
Temas
Intermedio
Nivel
Práctica
Tipo
yolo26n
Modelo
0%
0 de 0 temas leídos · Sección 1 de 6

Contenido detallado

1

🔍 Qué es la detección de objetos

Un detector de objetos recibe una imagen y devuelve una lista: para cada cosa que reconoció, una caja (dónde está), una clase (qué es) y una confianza (de 0 a 1, cuánto cree el modelo en eso). YOLO ("you only look once") hace esto mirando la imagen una sola vez; por eso es lo bastante rápido para los robots. Los modelos listos de Ultralytics ya reconocen las 80 clases del conjunto COCO, como persona, auto, perro, botella y silla.

🌱 ¿Eres nuevo aquí?

Una red neuronal es un programa con millones de números ajustables (los pesos) que aprende patrones a partir de ejemplos. Entrenar es ajustar esos pesos mostrándole miles de imágenes ya etiquetadas. Inferencia es usar el modelo listo en una imagen nueva, que es lo que hace el robot. El archivo yolo26n.pt guarda esos pesos; la "n" significa nano, la versión más pequeña y rápida.

persona 0.91 botella 0.67 lo que recibe el código clase: persona conf: 0.91 xyxy: 90,62, 172,222 + una línea por objeto escena ilustrativa · caja = (x1, y1) esquina superior, (x2, y2) esquina inferior

Cómo leer: cada caja de color es un objeto encontrado, con la etiqueta "clase confianza". El recuadro morado de la derecha es lo que llega a tu programa para la persona: solo números. La botella tiene menor confianza (0,67) porque es pequeña y está parcialmente oscura; ahí es donde aparecen los errores (tema 6).

🏷️ Clasificación

"Esta foto tiene un gato." Una respuesta por imagen, sin indicar dónde.

📦 Detección

"Gato aquí, persona allá." Caja + clase + confianza. Es lo que el robot necesita para apuntar.

✂️ Segmentación

El contorno exacto, píxel por píxel. Es más precisa y requiere más recursos; sirve para recoger objetos con el brazo.

Por qué aprender

La máscara de color falla con objetos de colores comunes o cuando cambia la luz. El detector reconoce la forma, así que sigue a una persona con una camiseta de cualquier color. A cambio, requiere mucho más procesamiento. Saber qué significa cada salida es lo que te permite usarla para controlar el robot.

Conceptos clave

Caja (bbox)
x1, y1, x2, y2
Clase
qué es (80 en COCO)
Confianza
0 a 1
Inferencia
usar el modelo listo
2

🚀 YOLO26 en Pi 5 con Ultralytics

O YOLO26 es la generación actual de la familia YOLO de Ultralytics, sucesora de YOLO11. Aún circulan tutoriales con versiones antiguas, pero hoy se usa el paquete ultralytics con los pesos yolo26n.pt. Viene en tamaños n, s, m, l e x: cada nivel mejora un poco la precisión y funciona mucho más lento. En Pi 5, empieza siempre por el n. En PyTorch, con una imagen de 640 px, tarda alrededor de 130 ms por cuadro; es decir, como máximo, cerca de 7 cuadros por segundo.

n s m l x Pi 5: empieza aquí más alto = más preciso y lento rápidopreciso

Cómo leer: cada nivel corresponde a un tamaño de YOLO26. La "n", resaltada, es la única que permite que el robot reaccione a tiempo usando solo el procesador de la Pi. Los tamaños mayores sirven para hacer comparaciones en la PC o para ejecutarlos con un acelerador.

Objetivo: instalar Ultralytics en el venv y detectar objetos en vivo con la cámara, mostrando la clase, la confianza y el tiempo de cada cuadro. La instalación descarga bastantes cosas: usa una tarjeta con espacio libre y ten paciencia.

terminal del Pi
source ~/robo-venv/bin/activate
pip install ultralytics                        # instala también PyTorch para ARM
yolo predict model=yolo26n.pt source="https://ultralytics.com/images/bus.jpg"   # prueba rápida
~/robo/yolo_camera.py
# YOLO26 en vivo con Camera Module 3: muestra lo que ve y el tiempo de cada cuadro
import sys, time
from picamera2 import Picamera2
from ultralytics import YOLO

MODELO = sys.argv[1] if len(sys.argv) > 1 else "yolo26n.pt"   # cámbialo por NCNN en el tema 3
modelo = YOLO(MODELO)

picam2 = Picamera2()
picam2.configure(picam2.create_preview_configuration(main={"size": (640, 480), "format": "RGB888"}))
picam2.start(); time.sleep(1)
print(f"Modelo {MODELO} cargado. Ctrl+C para salir.")
try:
    while True:
        quadro = picam2.capture_array()                 # BGR, como lo espera Ultralytics
        t0 = time.perf_counter()
        r = modelo(quadro, imgsz=640, conf=0.5, verbose=False)[0]
        ms = (time.perf_counter() - t0) * 1000
        achados = [f"{r.names[int(c)]} {float(p):.2f}" for c, p in zip(r.boxes.cls, r.boxes.conf)]
        print(f"{ms:6.0f} ms | {1000 / ms:4.1f} FPS | {', '.join(achados) or 'nada'}")
except KeyboardInterrupt:
    picam2.stop()

Cómo verificar

  • ✓La prueba del autobús crea una carpeta runs/detect/predict con la foto marcada (bus, person).
  • ✓En vivo, apareces como person 0.8x y el tiempo queda entre 100–200 ms por cuadro.
  • ✗¿"Illegal instruction" o un error en PyTorch? Comprueba que el sistema sea de 64 bits (uname -m = aarch64) y que el venv esté activo.

💡 La primera ejecución es más lenta

La primera vez, Ultralytics descarga los pesos yolo26n.pt de internet, y el primer cuadro tarda mucho más que los siguientes. Mide la velocidad solo después de unos diez cuadros.

Por qué aprender

Con unas veinte líneas tienes un robot que reconoce personas y objetos cotidianos. Ese mismo ciclo (capturar, inferir, leer las cajas) es la base del proyecto 3.6 y vuelve a aparecer en la Trilha 5, cuando el brazo necesita encontrar el objeto antes de recogerlo.

Conceptos clave

ultralytics
paquete de YOLO26
yolo26n.pt
pesos del nano
conf=0.5
umbral de confianza
r.boxes
cajas, clases, confianza
3

⚡ Exportar a NCNN y medir la velocidad

El formato .pt es excelente para entrenar, pero no es el más rápido para ejecutarse en un procesador ARM. Ultralytics exporta el mismo modelo a otros formatos; según la guía oficial para Raspberry Pi, NCNN es el más rápido en la CPU de la Pi. Las cajas y las clases siguen siendo las mismas; solo cambia el "motor" que hace los cálculos. La otra opción es cambiar el tamaño de entrada: imgsz=320 procesa una cuarta parte de los píxeles que 640 y pierde precisión con objetos pequeños.

🌱 ¿Eres nuevo aquí?

NCNN es un motor de inferencia abierto, diseñado para celulares y placas ARM. Exportar es convertir los pesos de un formato a otro sin volver a entrenar. El parámetro imgsz es el tamaño al que se cambia la imagen antes de introducirla en la red; debe ser múltiplo de 32 (320, 416, 640).

PyTorch .pt · 640~130 ms NCNN · 640menos: mide el tuyo NCNN · 320aún menos tiempo por cuadro (barra más corta = mejor) · ilustrativo, excepto el valor de referencia de PyTorch

Cómo leer: solo la barra superior tiene un número de referencia (la guía de Ultralytics para Pi 5). Las demás muestran la dirección de la mejora; para saber el valor exacto, ejecuta el script de abajo en tu Pi, con tu cooler y tu cámara.

Objetivo: exportar yolo26n a NCNN y comparar los dos formatos en la misma imagen, con números.

terminal del Pi
cd ~/robo && source ~/robo-venv/bin/activate
yolo export model=yolo26n.pt format=ncnn       # crea la carpeta yolo26n_ncnn_model/
python yolo_camera.py yolo26n_ncnn_model       # el mismo script del tema 2, ahora con NCNN
~/robo/compara.py
# Compara PyTorch x NCNN (640 y 320) en la misma imagen: promedio de 20 inferencias
import time
from ultralytics import YOLO

IMAGEM = "https://ultralytics.com/images/bus.jpg"   # o la ruta de una foto tuya
testes = [("yolo26n.pt", 640), ("yolo26n_ncnn_model", 640), ("yolo26n_ncnn_model", 320)]

for caminho, tamanho in testes:
    modelo = YOLO(caminho, task="detect")
    for _ in range(3):                              # calentamiento: no cuenta
        modelo(IMAGEM, imgsz=tamanho, verbose=False)
    tempos = []
    for _ in range(20):
        r = modelo(IMAGEM, imgsz=tamanho, verbose=False)[0]
        tempos.append(r.speed["inference"])           # ms, solo la red
    media = sum(tempos) / len(tempos)
    print(f"{caminho:22s} imgsz={tamanho}: {media:6.1f} ms  ({1000 / media:4.1f} FPS)  objetos={len(r.boxes)}")

Cómo verificar

  • ✓Existe la carpeta yolo26n_ncnn_model/ y el script imprime tres líneas.
  • ✓La línea de NCNN 640 tiene un tiempo menor que la de .pt, con una cantidad similar de objetos.
  • ✓Con 320, el tiempo baja más y pueden desaparecer objetos pequeños (las personas al fondo).

✓ Hazlo

  • ✓Exportar en la propia Pi y guardar la carpeta NCNN junto al código.
  • ✓Medir después del calentamiento y con el cooler encendido.
  • ✓Elegir el imgsz según el tamaño del objeto que importa.

✗ No lo hagas

  • ✗Comparar formatos usando el primer cuadro (incluye cargar el modelo).
  • ✗Cambiar a un modelo más grande antes de agotar NCNN e imgsz.
  • ✗Creer en los FPS de video de internet: mide en tu Pi.

Por qué aprender

Duplicar los FPS sin gastar nada marca la diferencia entre un robot que sigue a la persona y uno que la pierde en cada curva. Y el hábito de medir antes y después sirve para cualquier optimización que hagas de aquí en adelante.

Conceptos clave

NCNN
más rápido en la CPU ARM
exportación
convierte sin entrenar
imgsz
múltiplo de 32
Calentamiento
ignora los primeros
4

🧩 Acelerar con AI HAT+ (Hailo)

Cuando NCNN e imgsz no son suficientes, el siguiente paso es sacar la red neuronal del procesador. La AI HAT+ es una placa que se coloca sobre la Pi 5 y se conecta mediante el conector PCIe; lleva un chip Hailo diseñado exclusivamente para inferencia. Hay dos generaciones: AI HAT+ con Hailo-8L (13 TOPS) o Hailo-8 (26 TOPS), orientado a la visión, y AI HAT+ 2 con Hailo-10H (40 TOPS en INT4) y 8 GB de memoria propia, que también ejecuta modelos pequeños de lenguaje y de visión-lenguaje. Ambos funcionan solo con Pi 5; el antiguo «AI Kit» dejó de fabricarse.

🌱 ¿Eres nuevo aquí?

Una NPU (unidad de procesamiento neuronal) es un chip especializado en los cálculos de las redes neuronales. TOPS son billones de operaciones por segundo: dan una idea de la capacidad, pero solo sirven para comparar chips similares. INT4/INT8 significa que los números del modelo se almacenan con pocos bits; esto hace que todo sea más rápido, con una pequeña pérdida de precisión. El modelo debe estar compilado para el formato del chip (en Hailo, archivos .hef).

solo CPU capturared neuronal (pesada)lee las cajas, decideCPU al máximo, caliente con AI HAT+ capturalee las cajasCPU desocupada NPUHailo PCIe el modelo debe estar compilado para el chip (.hef)

Cómo leer: a la izquierda, la CPU realiza las tres tareas y la del medio (roja) domina. A la derecha, la parte pesada se envía a la NPU por PCIe y solo vuelve el resultado. La CPU queda libre para el resto del robot: servidor de video, comunicación con el ESP32, registros.

OpciónPara quéCosto y esfuerzo
CPU + NCNNEmpezar; seguir a una persona despacioCero; solo exportar
AI HAT+ (Hailo-8L/8)Detección en tiempo real, varios objetosPlaca adicional; modelo compilado para Hailo
AI HAT+ 2 (Hailo-10H)Visión + modelos pequeños de lenguaje (Trilha 5)Alrededor de US$ 130 en tiendas de EE. UU. (2026); consulta el precio en Brasil
AI Camera (Sony IMX500)Inferencia dentro de la propia cámaraCámara específica; modelos en su formato

Paso a paso (visión general)

1

Monta con la Pi apagada

Conecta el cable plano del PCIe, los separadores y la placa sobre la Pi 5. El cooler activo queda debajo.

2

Instala el software indicado en la documentación

Actualiza el sistema e instala los paquetes Hailo correspondientes al modelo exacto de tu placa, siguiendo la página «AI» de la documentación oficial de Raspberry Pi. Los nombres cambian entre generaciones: cópialos de ahí, no de un tutorial antiguo.

3

Confirma y ejecuta un ejemplo listo

Verifica la placa con el comando de abajo y ejecuta los ejemplos de detección de la propia documentación. Tus modelos deben compilarse a .hef con las herramientas de Hailo, en una PC.

terminal del Pi
lspci | grep -i hailo        # ¿aparece la placa en el bus PCIe?
vcgencmd get_throttled       # 0x0: la fuente de alimentación puede con el conjunto Pi + HAT + cámara

Cómo verificar

  • ✓O lspci muestra una línea con «Hailo»; si no aparece, revisa el cable PCIe y la conexión.
  • ✓El ejemplo de detección de la documentación funciona con FPS muy por encima de los de tu prueba en CPU.

Por qué aprender

El acelerador no es obligatorio para esta ruta: el proyecto 3.6 funciona con CPU y NCNN. Pero entender cuándo conviene (muchos objetos, FPS alto, IA de lenguaje en el mismo robot) evita comprarlo demasiado pronto o insistir demasiado tiempo con la CPU.

Conceptos clave

NPU
chip solo para inferencia
PCIe
conexión rápida de la Pi 5
TOPS
capacidad aproximada
.hef
modelo compilado para Hailo
5

🏷️ Entrenar con tus propias imágenes

COCO no tiene «mi taza», «cono naranja de la pista» o «pieza de la competencia». Para eso, haces un ajuste fino: partes de yolo26n, que ya sabe reconocer formas, y le muestras unos cientos de fotos tuyas con las cajas marcadas. El entrenamiento se ejecuta en una PC con GPU NVIDIA o en Google Colab (GPU gratuita en el navegador); la Pi solo recibe el resultado listo. Entrenar en la Pi funciona, pero es demasiado lento como para que valga la pena.

🌱 ¿Eres nuevo aquí?

Etiquetar es dibujar una caja alrededor de cada objeto en cada foto e indicar la clase. El conjunto de fotos etiquetadas es el dataset; se divide en entrenamiento (el modelo aprende con ellas) y validación (fotos que el modelo nunca vio, usadas para medir si aprendió de verdad). Una época es una pasada completa por todas las fotos de entrenamiento.

1 fotografiaren el lugar real 2 etiquetarcaja + clase 3 entrenarPC o Colab 4 en el Pibest.pt → NCNN los errores en la prueba se convierten en fotos nuevas: el dataset crece donde falla el modelo

Cómo leer: los pasos morados ocurren fuera del robot; el cian es el robot usando el modelo. El retorno con línea discontinua es el secreto: el primer modelo siempre se equivoca en algún caso, y cada error fotografiado y etiquetado mejora el siguiente entrenamiento.

Paso a paso

1

Toma fotos con la cámara del robot

Empieza con 150 a 300 fotos por clase, tomadas con la propia Camera Module 3, en el lugar y con la luz donde trabajará el robot: cerca, lejos, de lado, parcialmente oculto y con distintos fondos.

2

Etiqueta y exporta en formato YOLO

Usa una herramienta de etiquetado como Label Studio, CVAT o Roboflow y exporta en formato YOLO: una carpeta de imágenes y un .txt por imagen, con una línea por objeto (clase, centro x, centro y, ancho, alto, todo de 0 a 1). Separa cerca del 20% para validación.

3

Entrena, lleva el best.pt y exporta

Ejecuta el entrenamiento de abajo en la PC o en Colab, copia best.pt al Pi con scp y exporta a NCNN como en el tema 3.

Objetivo: describir el dataset y entrenar un detector de dos clases a partir de yolo26n. Cambia la ruta y los nombres de las clases por los tuyos.

mi_dataset/data.yaml
# Estructura esperada:
#   mi_dataset/images/train/*.jpg   mi_dataset/labels/train/*.txt
#   mi_dataset/images/val/*.jpg     mi_dataset/labels/val/*.txt
path: /caminho/para/meu_dataset
train: images/train
val: images/val
names:
  0: caneca
  1: cone
en la PC con GPU o en una celda de Colab
pip install ultralytics
yolo detect train data=meu_dataset/data.yaml model=yolo26n.pt epochs=100 imgsz=640 batch=16
# al final: runs/detect/train/weights/best.pt  (el mejor modelo en la validación)
yolo detect val model=runs/detect/train/weights/best.pt data=meu_dataset/data.yaml

# después, en el Pi:
# scp best.pt <tu_usuario>@robo.local:~/robo/
# yolo export model=best.pt format=ncnn   →   python yolo_camera.py best_ncnn_model

Cómo verificar

  • ✓O val muestra la métrica mAP50 por clase; por encima de 0,8 es un buen comienzo para objetos simples.
  • ✓En el Pi, yolo_camera.py con tu modelo imprime "taza" y "cono" en tiempo real.
  • ✗¿Buena nota en el entrenamiento y errores en el robot? Las fotos de validación se parecían demasiado a las de entrenamiento: toma fotos otro día y en otro lugar.

Por qué aprender

Aquí es donde la visión del robot empieza a servir a tu proyecto, y no al revés: competencias, separación de piezas, un robot que busca un objeto específico. Y el proceso (recopilar, etiquetar, entrenar, probar, volver) es el mismo que usas en la Ruta 5 para enseñar el brazo mediante demostraciones.

Conceptos clave

Ajuste fino
parte de yolo26n
Entrenamiento / validación
aprende / mide
data.yaml
carpetas y clases
best.pt
el mejor modelo
6

⚠️ Límites: luz, distancia, falsos positivos

Un detector no "ve" como tú: hace una predicción estadística en cada cuadro. Con poca luz, el objeto se ve oscuro y borroso; de lejos, ocupa pocos píxeles después del redimensionamiento; y a veces una mochila se convierte en "persona" durante un cuadro. El umbral de confianza es el botón que controlas: si está demasiado alto, el robot pierde el objetivo; si está demasiado bajo, persigue fantasmas. Por eso el código del robot nunca reacciona a un solo cuadro.

🌱 ¿Eres nuevo aquí?

Un falso positivo es cuando el modelo encuentra algo que no está ahí. Un falso negativo es cuando no encuentra algo que sí está. Bajar el umbral cambia falsos negativos por falsos positivos, y subirlo hace lo contrario: no existe un valor que elimine ambos. Persistencia es exigir que el objeto aparezca en varios cuadros seguidos antes de actuar.

00,4 a 0,61 umbral bajopersigue fantasmas(falsos positivos) empieza aquí+ 3 cuadros seguidosantes de actuar umbral altopierde el objetivo(falsos negativos) ajusta con tu objeto, tu luz y la distancia de trabajo

Cómo leer: la escala es el valor de conf. A la izquierda (rojo), el robot reacciona a todo; a la derecha (cian), solo a objetos muy nítidos. El marco morado es un punto de partida razonable, que se vuelve mucho más estable cuando exiges que el objeto aparezca en algunos cuadros seguidos.

Objetivo: convertir las detecciones sin procesar en una decisión estable: solo la clase que interesa, solo cajas lo bastante grandes y solo después de 3 cuadros seguidos. El resultado es el error horizontal, igual que el del módulo 3.2.

~/robo/alvo_estavel.py
# Decisión estable a partir de YOLO26: clase, tamaño mínimo y persistencia
import time
from picamera2 import Picamera2
from ultralytics import YOLO

ALVO = "person"          # nombre de la clase en el modelo (COCO usa nombres en inglés)
CONF_MIN = 0.5
AREA_MIN = 0.02          # la caja ocupa al menos el 2% de la imagen
QUADROS_SEGUIDOS = 3
LARGURA, ALTURA = 640, 480

modelo = YOLO("yolo26n_ncnn_model", task="detect")
picam2 = Picamera2()
picam2.configure(picam2.create_preview_configuration(main={"size": (LARGURA, ALTURA), "format": "RGB888"}))
picam2.start(); time.sleep(1)
contador = 0
try:
    while True:
        r = modelo(picam2.capture_array(), imgsz=640, conf=CONF_MIN, verbose=False)[0]
        melhor = None
        for (x1, y1, x2, y2), c in zip(r.boxes.xyxy.tolist(), r.boxes.cls.tolist()):
            area = (x2 - x1) * (y2 - y1) / (LARGURA * ALTURA)
            if r.names[int(c)] == ALVO and area >= AREA_MIN:
                if melhor is None or area > melhor[1]:
                    melhor = ((x1 + x2) / 2, area)          # centro x y tamaño
        contador = contador + 1 if melhor else 0
        if contador >= QUADROS_SEGUIDOS:
            cx, area = melhor
            print(f"OBJETIVO firme  error={cx - LARGURA / 2:+5.0f}  tamaño={area:.2f}")
        else:
            print(f"sin objetivo firme ({contador}/{QUADROS_SEGUIDOS}) → robot detenido")
except KeyboardInterrupt:
    picam2.stop()

Cómo verificar

  • ✓Cuando te pongas frente a la cámara, aparecen 1/3, 2/3 y luego "OBJETIVO firme", con el error cambiando de signo a medida que caminas.
  • ✓Una detección falsa en un solo cuadro no llega a convertirse en "OBJETIVO firme".
  • ✗¿Desaparece cuando te alejas unos metros? Reduce AREA_MIN o acepta que esa es la distancia útil de tu cámara.

✓ Hazlo

  • ✓El robot se detiene cuando pierde el objetivo, en vez de continuar con el último comando.
  • ✓El ultrasonido o el bumper siguen activos para evitar chocar con algo.
  • ✓Probar con luz de mañana, de tarde y de noche.

✗ No lo hagas

  • ✗Confiar solo en la cámara para detenerse antes de una persona o una escalera.
  • ✗Reaccionar a un solo cuadro con alta confianza.
  • ✗Grabar o seguir a personas sin que lo sepan y estén de acuerdo.

Por qué aprender

El robot que sigue a una persona es el proyecto de la ruta, y solo es seguro si sabes dónde falla la visión. El umbral, el tamaño mínimo, la persistencia y la detención cuando se pierde el objetivo son las cuatro protecciones que separan una demostración bonita de un robot confiable.

Conceptos clave

Falso positivo
detecta lo que no existe
Falso negativo
no detecta lo que existe
Umbral
confunde uno con otro
Persistencia
N cuadros seguidos

✅ Resumen del módulo

✓
Detección = cuadro + clase + confianza, para cada objeto, en cada cuadro.
✓
YOLO26n en Pi 5: pip install ultralytics en el venv y veinte líneas con picamera2.
✓
NCNN e imgsz: la mejora de velocidad gratis, siempre medida después del calentamiento.
✓
AI HAT+ cuando lo necesites: NPU Hailo en el PCIe; AI HAT+ 2 también ejecuta modelos de lenguaje pequeños.
✓
Tu modelo, tus límites: ajuste fino en la PC/Colab y una decisión estable con umbral, tamaño y persistencia.

Para profundizar

Siguiente módulo

3.4 · IA dentro del microcontrolador: modelos pequeños, cuantizados y ejecutándose en el propio ESP32-S3.