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.