Salta el contingut

Visió artificial amb IA

Visió artificial per a robòtica

La visió artificial proporciona als robots "ulls" per percebre el món. Les aplicacions en robòtica inclouen: - Localització i mapeig simultani (SLAM): construir un mapa de l'entorn i localitzar el robot simultàniament - Detecció d'objectes: identificar i localitzar objectes per a tasques de manipulació - Seguiment de persones: cobots que segueixen un operari o li eviten el pas - Inspecció de qualitat: detectar defectes en superfícies, soldadures o components

YOLO — You Only Look Once

YOLO és la família de models de detecció d'objectes en temps real més popular. La seva gràcia és que detecta totes les caixes englobants i classes en una sola passada per la xarxa neuronal (d'aquí el nom), a diferència dels models de dues fases (R-CNN) que primer proposen regions d'interès i després les classifiquen.

Evolució de YOLO:

YOLOv1 (2016) → YOLOv3 (2018) → YOLOv5 (2020) → YOLOv8 (2023) → YOLOv9/v10 (2024)
     10fps          30fps           100fps            200fps+          200fps+

YOLOv8 (Ultralytics, 2023) és el model recomanat per a la majoria de casos d'ús el 2025: - Detecció d'objectes (bounding boxes) - Segmentació d'instàncies (màscares pixel a pixel) - Estimació de pose (keypoints del cos humà) - Classificació d'imatges - Tracking multi-objecte

# Detecció d'objectes amb YOLOv8
# pip install ultralytics

from ultralytics import YOLO
import cv2

# Carregar model preentrenat (descarrega automàticament si no existeix)
model = YOLO('yolov8n.pt')  # 'n' = nano (més petit), 's', 'm', 'l', 'x' (més gran)

# Inferència sobre una imatge
resultats = model('imatge_magatzem.jpg', conf=0.5)  # conf = llindar de confiança

# Mostrar i guardar els resultats
for resultat in resultats:
    # Coordenades de les caixes: [x1, y1, x2, y2, confiança, classe]
    per a cada caixa en resultat.boxes:
        x1, y1, x2, y2 = caixa.xyxy[0].tolist()
        conf = caixa.conf[0].item()
        classe = model.names[int(caixa.cls[0].item())]
        print(f"Detectat: {classe} ({conf:.2%}) a [{x1:.0f},{y1:.0f},{x2:.0f},{y2:.0f}]")

    # Guardar imatge amb les deteccions anotades
    resultat.save('deteccions_magatzem.jpg')

# Inferència en temps real (càmera)
model.predict(source=0, show=True, conf=0.5)  # source=0 = càmera web

# Fine-tuning sobre dades pròpies (exemple de peça de fàbrica)
model_custom = YOLO('yolov8n.pt')
model_custom.train(
    data='dades_peces_fabbrica.yaml',  # Fitxer de configuració del dataset
    epochs=100,
    imgsz=640,
    batch=16,
    name='detector_peces_joan_garcia'
)

SLAM — Simultaneous Localization and Mapping

El SLAM resol el problema de "l'ou i la gallina" de la navegació robòtica: per construir un mapa cal saber on ets, i per saber on ets cal tenir un mapa. SLAM resol ambdues tasques simultàniament.

Components principals: - Sensors: LiDAR (làser 2D/3D), càmeres (monoculars, estèreo, RGB-D) - Frontend: extracció de característiques de cada mesura, estimació del moviment - Backend: optimització global del mapa i la trajectòria (pose graph optimization)

Algorismes SLAM populars: - GMapping: SLAM 2D basat en partícules, clàssic i robust - Cartographer (Google): SLAM 2D/3D, molt usat en producció - ORB-SLAM3: SLAM visual (càmera), altament precís - RTAB-Map: SLAM RGB-D i LiDAR, amb bucle de tancament

Processament de vídeo en temps real i seguiment d'objectes (tracking)

Detectar objectes imatge a imatge (vist a l'apartat YOLO) no és suficient quan el robot ha de seguir un objecte concret al llarg del temps (per exemple, un operari que camina pel magatzem o una peça que es mou en una cinta transportadora). Cal passar d'un pipeline d'imatge estàtica a un pipeline de vídeo:

graph LR
    CAM[Camera / stream RTSP] --> FRAME[Frame a frame]
    FRAME --> DET[Deteccio YOLO per frame]
    DET --> TRACK[Algorisme de tracking]
    TRACK --> ID[Assignacio d-ID persistent]
    ID --> ACT[Accio del robot]

El repte del tracking: la detecció per si sola no sap que la "caixa" del frame 10 i la "caixa" del frame 11 corresponen al mateix objecte físic. Els algorismes de tracking resolen aquesta associació:

  • SORT / DeepSORT: combinen un filtre de Kalman (predicció de la posició següent) amb una mètrica de similitud visual (DeepSORT hi afegeix un embedding d'aparença) per associar deteccions consecutives al mateix identificador.
  • ByteTrack (2022): millora SORT reaprofitant fins i tot les deteccions de baixa confiança, reduint la pèrdua d'identificador quan un objecte queda parcialment ocult.
  • YOLOv8 + tracker integrat: Ultralytics inclou ByteTrack i BoT-SORT llestos per usar amb una sola crida.
# Seguiment d'objectes en un stream de video amb YOLOv8 + ByteTrack
# pip install ultralytics opencv-python
from ultralytics import YOLO
import cv2

model = YOLO('yolov8n.pt')

# source pot ser un fitxer de video, una camera (0) o un stream RTSP
resultats = model.track(
    source='rtsp://192.168.1.50:554/stream',
    tracker='bytetrack.yaml',
    persist=True,   # manté els mateixos IDs entre frames
    conf=0.5,
)

for resultat in resultats:
    for caixa in resultat.boxes:
        if caixa.id is None:
            continue
        track_id = int(caixa.id.item())
        classe = model.names[int(caixa.cls[0].item())]
        x1, y1, x2, y2 = caixa.xyxy[0].tolist()
        print(f"ID {track_id}: {classe} a [{x1:.0f},{y1:.0f},{x2:.0f},{y2:.0f}]")

Aplicacions en robòtica: - Seguiment de persones: un cobot que ajusta la seva velocitat segons la distància a un operari concret (no només "hi ha algú a prop", sinó "aquesta persona concreta s'apropa"). - Comptatge d'objectes en cinta: comptar peces que passen per una cinta sense comptar-les dues vegades (problema resolt gràcies a l'ID persistent). - Bin picking seqüencial: prioritzar quina peça agafar primer d'una safata amb diverses peces detectades simultàniament.

Miniactivitat — AC5071/04/04 (CA4.3) — Tracking sobre un vídeo propi

Grava un vídeo curt (15-30 segons) amb el mòbil on hi hagi almenys dos objectes o persones en moviment. Aplica model.track() amb YOLOv8 i ByteTrack sobre el vídeo. Comprova si els identificadors es mantenen estables quan un objecte queda parcialment tapat per un altre i explica per què creus que passa (o no) una pèrdua d'identificador.