Feature Maps
Карта признаков — это сетка откликов фильтра по всему изображению, которая показывает, где встречается распознаваемый им шаблон. Рассматриваются вычисление, формы и визуализация.
Карта признаков — это выход одного фильтра в слое свёрточной нейронной сети (CNN): двумерная сетка чисел, показывающая, насколько сильно шаблон фильтра проявляется в каждой точке входных данных. Свёрточный слой с 64 фильтрами создаёт 64 карты признаков, объединённые в тензор формы «каналы × высота × ширина», который становится входом следующего слоя. Карты признаков ранних слоёв выделяют границы, цвета и текстуры, а карты глубоких слоёв реагируют на части объектов и целые объекты. Карта активаций — синоним; весь объединённый тензор слоя также часто называют его картой признаков.
Как вычисляется карта признаков#
Фильтр, также называемый ядром, — это небольшая сетка обученных весов модели, обычно размером 3×3 для каждого входного канала. Свёртка перемещает его по входным данным. В каждой позиции значения в области перекрытия перемножаются поэлементно, затем суммируются вместе со смещением, образуя одно выходное число. Высокие значения показывают участки, где входные данные соответствуют шаблону фильтра. Высота и ширина выходных данных зависят от размера входа, размера ядра k, дополнения p и шага s по формуле floor((input + 2p - k) / s) + 1. Поэтому при шаге 1 ядро 3×3 с дополнением 1 сохраняет размер, а при шаге 2 уменьшает его вдвое.
Приведённый ниже фрагмент применяет ядро для обнаружения вертикальных границ к небольшому изображению, у которого левая часть тёмная, а правая — светлая.
import torch
import torch.nn.functional as F
# Чёрно-белое изображение 8x8: левая половина тёмная, правая светлая, поэтому на нём есть одна вертикальная граница
image = torch.zeros(1, 1, 8, 8)
image[..., 4:] = 1.0
# Ядро Собеля 3x3, реагирующее на вертикальные границы
kernel = torch.tensor([[-1.0, 0.0, 1.0], [-2.0, 0.0, 2.0], [-1.0, 0.0, 1.0]]).view(1, 1, 3, 3)
# Перемещаем ядро по изображению, чтобы получить карту признаков
feature_map = F.conv2d(image, kernel)
print(feature_map.shape)
print(feature_map[0, 0, 0])Выводятся torch.Size([1, 1, 6, 6]) и tensor([0., 0., 4., 4., 0., 0.]). Без дополнения изображение 8×8 даёт карту размером 6×6 (8 − 3 + 1 = 6), ненулевые значения которой находятся только в двух столбцах, где ядро пересекает границу. Обученные CNN усваивают множество фильтров первого слоя, работающих подобно этому ядру Собеля, а также фильтров, настроенных на цвета и текстуры.
Карты признаков в слоях сети#
По мере прохождения данных через CNN карты признаков обычно уменьшаются по высоте и ширине, а число каналов растёт. Каждый шаг уменьшения разрешения вдвое увеличивает рецептивное поле исходного изображения, которое обобщает каждая позиция глубокой карты. Детекторы используют карты с нескольких уровней глубины, поскольку у этого компромисса есть обе стороны: карта с шагом 8 для изображения 640×640 — это сетка 80×80, достаточно подробная для обнаружения маленьких объектов, а карта с шагом 32 — сетка 20×20, ячейки которой охватывают достаточно большую часть изображения для распознавания крупных объектов. Пирамида признаков (FPN) объединяет карты с разных уровней, чтобы каждый масштаб получал и точное положение, и высокоуровневый смысл. Бэкбон, создающий эти карты, — основной этап извлечения признаков модели.
Карты признаков и смежные понятия#
- Фильтр: содержит обученные веса, а карта признаков — это результат их применения к одному входному изображению. Один фильтр создаёт одну карту признаков для каждого изображения.
- Функция активации: Функция, например ReLU, применяемая к карте признаков поэлементно после свёртки. Карта существует и до, и после применения функции — в виде значений до активации и после активации.
- Эмбеддинги: Обычно эмбеддинг — это одномерный вектор, полученный пулингом или разворачиванием карты признаков. Он сохраняет информацию о содержимом изображения, отбрасывая сведения о расположении. Эмбеддинги используются для поиска по сходству и кластеризации, а пространственные карты признаков — для задач, требующих информации о местоположении, таких как семантическая сегментация.
- Карты значимости: Карта значимости — это отдельная тепловая карта, которая объясняет одно предсказание и часто вычисляется по картам признаков и их градиентам.
Изучение и визуализация карт признаков#
Построение отдельных каналов в виде изображений в оттенках серого показывает, на какие сигналы реагирует каждый фильтр. Карты первых слоёв напоминают копии фотографии, обработанные фильтрами выделения границ, а карты глубоких слоёв выглядят как размытые пятна поверх частей объектов. В PyTorch зарегистрированный с помощью register_forward_hook прямой хук сохраняет карты признаков любого слоя во время инференса. В глубоких слоях сотни каналов, поэтому инструменты объяснимого ИИ обычно сводят их к одной тепловой карте. Grad-CAM взвешивает каждый канал поздней карты признаков по среднему градиенту оценки класса и суммирует каналы, выделяя области изображения, повлиявшие на предсказание. В nano-модели YOLO26 изображение размером 640×640 поступает в голову обнаружения в виде трёх карт признаков размером 64×80×80, 128×40×40 и 256×20×20, а предсказание с помощью visualize=True сохраняет наложение LayerCAM _cam.jpg, в котором каждая позиция этих карт взвешивается по её положительному градиенту относительно каждого предсказанного класса.










