Saliency Maps
Карты значимости — это тепловые карты, показывающие, насколько каждый пиксель повлиял на предсказание модели. Градиентные методы, CAM и методы возмущений, их ограничения и сферы применения.
Карта значимости — это тепловая карта, которая показывает, насколько каждый пиксель входного изображения повлиял на результат нейронной сети, обычно на оценку одного предсказанного класса. Это один из самых распространённых инструментов объяснимого ИИ (XAI) в компьютерном зрении: если карта выделяет объект, это подтверждает предсказание; если водяной знак, фон или край изображения — обнаруживает использование побочного признака. Карта значимости связывает результат с пикселями входного изображения, что отличает её от внутренних карт признаков сети и весов внимания визуального трансформера, которые показывают, откуда слой получает информацию. В исследованиях восприятия этим термином называют сходную идею — карту областей сцены, к которым обращено внимание человека, как в модели зрительного внимания Итти — Коха.
Как работает градиентная значимость#
Карта градиентной значимости, предложенная Симоняном, Ведальди и Циссерманом (2013), использует обратное распространение ошибки, чтобы вычислить градиент оценки одного класса по входному изображению, а не по весам модели. Модуль градиента для пикселя показывает, насколько небольшое изменение этого пикселя повлияло бы на оценку; наибольший абсолютный градиент среди трёх цветовых каналов даёт одно значение для каждого пикселя. Для классификатора ImageNet это требует одного прямого и одного обратного прохода в 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]}")Код выводит Explained class: minibus и сохраняет зернистую карту размером 224 × 224 для центрального фрагмента, который анализировал классификатор: исходные градиенты сильно различаются от пикселя к пикселю, и последующие методы уменьшают этот шум усреднением или используют карты признаков.
Методы построения карт значимости#
- SmoothGrad: Усреднение карт градиентов для множества копий изображения с добавленным шумом устраняет значительную часть зернистости.
- Интегральные градиенты: Накопление градиентов вдоль пути от исходного изображения, например чёрного изображения, к входному приводит к тому, что оценки пикселей в сумме равны разнице оценок двух классов.
- Grad-CAM: Взвешивание карт признаков последнего свёрточного слоя по усреднённому градиенту с последующим увеличением разрешения результата даёт грубые, но специфичные для класса области. В LayerCAM (2021) веса рассчитываются отдельно для каждой позиции, поэтому пригодные карты дают и более ранние слои с высоким разрешением.
- Окклюзия и другие методы возмущения: Чтобы оценить, насколько снизится показатель, достаточно скрывать фрагменты изображения; градиенты не нужны, но для каждого фрагмента требуется отдельный прямой проход.
Ultralytics YOLO строит карты LayerCAM для задач обнаружения объектов и других задач: в режиме предсказания с visualize=True алгоритм взвешивает каждую позицию карт признаков, поступающих в голову детектора, по её положительному градиенту относительно оценки класса каждого уверенного предсказания и сохраняет одну объединённую тепловую карту для каждого изображения.
from ultralytics import YOLO
# Сохрани тепловую карту LayerCAM, показывающую основания для обнаружений YOLO26
model = YOLO("yolo26n.pt")
results = model("https://ultralytics.com/images/bus.jpg", visualize=True)Код записывает bus_cam.jpg в каталог сохранения запуска. На карте показано до 16 самых сильных исходных предсказаний YOLO26 выше порога уверенности, до того как NMS удалит дубликаты. Добавив classes=[0], ты получишь карту только для людей.
Ограничения карт значимости#
Карта значимости показывает, к каким областям чувствителен результат, но не объясняет ход рассуждений модели; этим занимается механистическая интерпретируемость. В проверках на адекватность 2018 года Адебайо и его коллеги обнаружили, что некоторые популярные методы, например управляемое обратное распространение ошибки, строят почти одинаковые карты даже после рандомизации весов модели. Значит, такие карты отражают скорее контуры изображения, чем работу обученной модели. Карты также могут резко меняться при небольших возмущениях входных данных, которые не изменяют предсказание.
Примеры применения в реальных условиях#
- Обнаружение побочных признаков: Тепловые карты показали, что классификатор, обученный на датасете PASCAL VOC, распознавал лошадей отчасти по отметке об авторских правах, которая встречалась на многих фотографиях лошадей. При этом по точности было не заметно, что модель использует такое поведение по типу «умного Ганса».
- Медицинская визуализация: Разработчики классификаторов рентгеновских снимков грудной клетки проверяют, что модель опирается на признаки в лёгких, а не на текст со сканера или медицинские устройства, например плевральные дренажи. Было показано, что классификаторы пневмоторакса могут использовать именно такие побочные признаки.
- Кадрирование изображений: Twitter кадрировал превью изображений вокруг точки, на которую, согласно модели значимости для человеческого внимания, зрители должны были взглянуть в первую очередь. В проверке 2021 года исследователи компании обнаружили, что кадрирование систематически отдавало предпочтение одним группам людей перед другими.










