Scale-Invariant Feature Transform (SIFT)
La trasformata di caratteristiche invarianti alla scala (SIFT) è un algoritmo classico che individua punti chiave e crea descrittori di 128 valori stabili rispetto a scala e rotazione.
La trasformata di caratteristiche invarianti alla scala (SIFT) è un classico algoritmo di visione artificiale che individua punti chiave locali distintivi in un'immagine e descrive ciascuno con un vettore di 128 numeri che rimane pressoché invariato quando l'immagine viene ridimensionata o ruotata. Confrontare questi descrittori consente al software di collegare due foto della stessa scena scattate da distanze e angolazioni diverse, permettendo di unire foto sovrapposte in un panorama. SIFT è una forma di estrazione di caratteristiche progettata manualmente, a differenza delle mappe di caratteristiche apprese da una rete neurale convoluzionale.
Origini e idea di base#
David Lowe, dell'Università della Columbia Britannica, introdusse SIFT nel 1999 nell'articolo dell'ICCV Riconoscimento di oggetti da caratteristiche locali invarianti alla scala e ne presentò un'analisi completa nell'articolo "Caratteristiche distintive delle immagini da punti chiave invarianti alla scala", pubblicato sull'International Journal of Computer Vision nel 2004. Le caratteristiche SIFT sono invarianti rispetto alla scala e alla rotazione e si abbinano in modo robusto anche in presenza di notevoli distorsioni affini, variazioni del punto di vista 3D, rumore e cambiamenti di illuminazione. Il metodo era brevettato e il brevetto è scaduto nel 2020. OpenCV ha spostato SIFT dal proprio repository contrib alla libreria principale nella versione 4.4.0.
Un oggetto non ha dimensioni fisse in una foto, quindi un rilevatore deve cercare strutture a tutte le scale. SIFT crea uno spazio delle scale applicando ripetutamente una sfocatura gaussiana di intensità crescente e riducendo la risoluzione in gruppi chiamati ottave.
Come funziona SIFT#
L'algoritmo si articola in quattro fasi:
- Rilevamento degli estremi nello spazio delle scale: Le differenze tra livelli di sfocatura adiacenti (differenza di gaussiane) approssimano un rilevatore di blob. Un pixel è un candidato se è il massimo o il minimo tra i suoi 26 vicini nello spazio e nella scala.
- Localizzazione dei punti chiave: I candidati vengono raffinati fino alla precisione subpixel. I punti a basso contrasto e quelli situati lungo i bordi vengono scartati perché instabili.
- Assegnazione dell'orientamento: Un istogramma delle direzioni locali del gradiente attorno a ogni punto chiave determina un orientamento dominante, rispetto al quale vengono misurate tutte le operazioni successive. Questo garantisce l'invarianza alla rotazione.
- Creazione del descrittore: Il vicinato viene suddiviso in una griglia 4 x 4 e ogni cella contiene un istogramma del gradiente a 8 bin. Si ottengono così 4 x 4 x 8 = 128 valori, normalizzati per ridurre la sensibilità alle variazioni di illuminazione.
Il confronto tra descrittori si basa sulla distanza euclidea. Il test del rapporto di Lowe mantiene una corrispondenza solo se il vicino più prossimo è nettamente più vicino del secondo. Una ricerca dei k vicini più prossimi con k = 2 fornisce entrambe le distanze.
import cv2
from ultralytics.utils import ASSETS
# Load a sample image in grayscale and a half-size copy
img = cv2.imread(str(ASSETS / "bus.jpg"), cv2.IMREAD_GRAYSCALE)
small = cv2.resize(img, None, fx=0.5, fy=0.5)
# Detect keypoints and compute 128-dimensional descriptors
sift = cv2.SIFT_create()
kp1, des1 = sift.detectAndCompute(img, None)
kp2, des2 = sift.detectAndCompute(small, None)
# Match half-size descriptors to full-size ones, then apply Lowe's ratio test
pairs = cv2.BFMatcher().knnMatch(des2, des1, k=2)
good = [m for m, n in pairs if m.distance < 0.8 * n.distance]
print(f"{len(good)} of {len(kp2)} half-size keypoints matched at full size")Il conteggio visualizzato indica quanti punti chiave individuati a metà risoluzione vengono riconosciuti di nuovo nell'immagine a piena risoluzione: è l'invarianza alla scala in azione.
Applicazioni#
SIFT è diventato la caratteristica locale predefinita per le attività di visione geometrica:
- Creazione di panorami: Il metodo automatico di Brown e Lowe per la creazione di panorami (IJCV 2007) abbina le caratteristiche SIFT tra foto sovrapposte e stima una omografia per allinearle, in una fase chiamata registrazione delle immagini.
- Ricostruzione 3D: Photo Tourism (Snavely, Seitz e Szeliski, 2006) abbina le caratteristiche SIFT tra foto turistiche e usa la geometria epipolare per ricavare le pose delle telecamere e una struttura 3D sparsa.
- Localizzazione dei robot: Se, Lowe e Little (2001) hanno usato punti di riferimento SIFT per localizzare e mappare robot mobili, anticipando la moderna SLAM visiva.
- Riconoscimento di istanze: Nell'articolo del 2004, Lowe riconosce un trenino giocattolo e una rana in una scena caotica e parzialmente occlusa, usando appena 3 caratteristiche abbinate.
Nel tracciamento degli oggetti con Ultralytics YOLO, BoT-SORT compensa il movimento della telecamera tra i fotogrammi e, impostando gmc_method: sift nella configurazione del tracker, usa le corrispondenze SIFT per la stima invece del flusso ottico sparso predefinito.
Confronto tra SIFT e metodi correlati#
SIFT abbina gli stessi punti fisici tra diverse viste, una caratteristica utile per la corrispondenza e la geometria. Il rilevamento degli oggetti, invece, predice la categoria e la posizione degli oggetti. Il confronto di modelli fa scorrere una patch fissa e non funziona quando cambiano la scala o la rotazione.
SIFT è lento rispetto a ORB, un descrittore binario introdotto da Rublee e colleghi nel 2011 come alternativa a SIFT e SURF. Inoltre, ha difficoltà con le superfici prive di texture e con variazioni molto ampie del punto di vista; per il riconoscimento a livello di categoria è stato in gran parte sostituito da modelli appresi.
Nei test di Lowe del 2004, scartare le corrispondenze con un rapporto tra le distanze superiore a 0,8 ha eliminato il 90% delle corrispondenze errate, scartando meno del 5% di quelle corrette, su immagini con variazioni casuali di scala e rotazione, 30 gradi di rotazione in profondità e il 2% di rumore, confrontate con 40.000 punti chiave.










