Saliency Maps
Le mappe di salienza sono mappe di calore che indicano quanto ogni pixel ha influenzato la predizione di un modello. Metodi basati su gradiente, CAM e perturbazioni, limiti e applicazioni.
Una mappa di salienza è una mappa termica che indica quanto ogni pixel di un'immagine di input abbia influenzato l'output di una rete neurale, di solito il punteggio di una classe prevista. È uno degli strumenti più comuni dell'IA spiegabile (XAI) nella visione artificiale: una mappa che evidenzia l'oggetto supporta la previsione, mentre una che evidenzia una filigrana, lo sfondo o il bordo dell'immagine rivela una scorciatoia. La mappa di salienza collega l'output ai pixel di input, distinguendosi dalle mappe delle caratteristiche interne della rete e dai pesi di attenzione di un vision Transformer, che mostrano dove un layer raccoglie informazioni. Nella ricerca sulla percezione, il termine indica un concetto affine: una mappa delle aree della scena verso cui è attirato lo sguardo umano, come nel modello Itti-Koch dell'attenzione visiva.
Come funziona la salienza basata sul gradiente#
La mappa di salienza basata sul gradiente di Simonyan, Vedaldi e Zisserman (2013) usa la retropropagazione per calcolare il gradiente del punteggio di una classe rispetto all'immagine di input, anziché rispetto ai pesi del modello. L'ampiezza del gradiente in un pixel indica quanto una sua piccola variazione sposterebbe il punteggio; il valore assoluto massimo tra i tre canali di colore fornisce un unico valore per pixel. Per un classificatore ImageNet, richiede un passaggio forward e uno backward in PyTorch:
import urllib.request
from PIL import Image
from torchvision.models import ResNet50_Weights, resnet50
from torchvision.utils import save_image
# Load an ImageNet classifier and track gradients on the input pixels
weights = ResNet50_Weights.DEFAULT
model = resnet50(weights=weights).eval()
image = Image.open(urllib.request.urlopen("https://ultralytics.com/images/bus.jpg"))
x = weights.transforms()(image).unsqueeze(0).requires_grad_()
# Backpropagate the top class score to the pixels
scores = model(x)
top = scores.argmax().item()
scores[0, top].backward()
# Saliency: largest absolute gradient across the color channels, scaled for display
saliency = x.grad.abs().amax(dim=1)
save_image((saliency / saliency.quantile(0.99)).clamp(max=1), "saliency.png")
print(f"Explained class: {weights.meta['categories'][top]}")Stampa Explained class: minibus e salva una mappa sgranata di 224 × 224 del ritaglio centrale visto dal classificatore: i gradienti grezzi sono rumorosi da un pixel all'altro, un problema che i metodi successivi riducono calcolando medie o lavorando sulle mappe delle caratteristiche.
Metodi di salienza#
- SmoothGrad: calcola la media delle mappe di gradiente ottenute da molte copie dell'immagine a cui è stato aggiunto rumore, eliminando gran parte della granulosità.
- Gradienti integrati: accumula i gradienti lungo un percorso da un riferimento, come un'immagine nera, all'input; così i punteggi dei pixel sommano alla differenza tra i punteggi delle due classi.
- Grad-CAM: applica un peso alle mappe delle caratteristiche dell'ultimo layer convoluzionale in base al gradiente medio e ingrandisce il risultato, ottenendo regioni grossolane ma specifiche per classe. LayerCAM (2021) assegna un peso a ogni posizione separatamente, così anche i layer precedenti a risoluzione maggiore producono mappe utili.
- Occlusione e altri metodi di perturbazione: nascondere parti dell'immagine e misurare quanto diminuisce il punteggio non richiede gradienti, ma comporta un passaggio forward per ogni parte.
Ultralytics YOLO calcola mappe LayerCAM per il rilevamento degli oggetti e altre attività: con visualize=True in modalità di predizione, assegna un peso a ogni posizione delle mappe delle caratteristiche che entrano nella testa di rilevamento, in base al gradiente positivo rispetto al punteggio di classe di ogni previsione affidabile, e salva una mappa termica combinata per immagine.
from ultralytics import YOLO
# Salva una mappa termica LayerCAM delle evidenze alla base dei rilevamenti di YOLO26
model = YOLO("yolo26n.pt")
results = model("https://ultralytics.com/images/bus.jpg", visualize=True)Scrive bus_cam.jpg nella directory di salvataggio dell'esecuzione, evidenziando fino alle 16 previsioni grezze più forti di YOLO26 che superano la soglia di confidenza, prima che NMS rimuova i duplicati; aggiungendo classes=[0], le mappe evidenziano solo le persone.
Limiti delle mappe di salienza#
Una mappa di salienza mostra a quali input è sensibile l'output, non come ragiona il modello: quest'ultimo è l'obiettivo dell'interpretabilità meccanicistica. I controlli di sanità del 2018 di Adebayo e colleghi hanno rilevato che alcuni metodi diffusi, come la retropropagazione guidata, producono mappe quasi identiche anche dopo la randomizzazione dei pesi del modello; queste mappe riflettono quindi più i bordi dell'immagine che il modello addestrato. Le mappe possono inoltre cambiare drasticamente in seguito a piccole perturbazioni dell'input che non modificano la previsione.
Applicazioni nel mondo reale#
- Individuare le scorciatoie: le mappe termiche hanno mostrato che un classificatore addestrato sul dataset PASCAL VOC riconosceva i cavalli anche grazie a un'etichetta di copyright presente in molte foto di cavalli: un comportamento da «Clever Hans» invisibile nell'accuratezza.
- Imaging medico: gli sviluppatori di classificatori per radiografie toraciche verificano che le evidenze si trovino nei polmoni e non sul testo dello scanner o su dispositivi di trattamento come i drenaggi toracici, che è stato dimostrato essere utilizzati dai classificatori per il pneumotorace.
- Ritaglio delle immagini: Twitter ritagliava le anteprime delle immagini attorno al punto in cui un modello di salienza basato sull'attenzione umana prevedeva che gli utenti avrebbero guardato per primo; una verifica del 2021 condotta dai ricercatori dell'azienda ha rilevato che i ritagli favorivano sistematicamente alcuni gruppi di persone rispetto ad altri.










