В середине 2016 года исследователи из Массачусетского технологического института продемонстрировали, что CNN со слоями GAP (также известные как GAP-CNN), которые были обучены для задачи классификации, также могут использоваться для локализации объектов. То есть GAP-CNN не только сообщает нам, какой объект содержится на изображении, но и сообщает нам, где этот объект находится на изображении, причем без дополнительной работы с нашей стороны! Локализация выражается в виде тепловой карты (называемой картой активации класса), где схема цветового кодирования определяет области, которые относительно важны для GAP-CNN для выполнения задачи идентификации объекта.

Основная идея заключается в том, что каждая из карт активации в последнем слое, предшествующем слою GAP, действует как детектор различных паттернов на изображении, локализованных в пространстве. Чтобы получить карту активации класса, соответствующую изображению, нам нужно только преобразовать эти обнаруженные шаблоны в обнаруженные объекты.

Это преобразование выполняется путем обнаружения того, что каждый узел в слое GAP соответствует другой карте активации, и что веса, соединяющие слой GAP с конечным плотным слоем, кодируют вклад каждой карты активации в прогнозируемый класс объектов. Чтобы получить карту активации класса, мы суммируем вклады каждого из обнаруженных паттернов в карты активации, где обнаруженным паттернам, более важным для прогнозируемого класса объектов, присваивается больший вес.

Как работает код:

Давайте изучим архитектуру ResNet-50, выполнив в терминале следующую строку кода: python -c ‘from keras. Приложения. resnet50 импортировать ResNet50; Реснет50(). краткое содержание ()

Последние несколько строк вывода должны выглядеть следующим образом (обратите внимание, что в отличие от модели VGG-16 большинство обучаемых параметров не расположены в полностью связанных слоях в верхней части сети!):

Слои Activation, AveragePooling2D и Dense ближе к концу сети представляют для нас наибольший интерес. Обратите внимание, что слой AveragePooling2D на самом деле является слоем GAP. Мы начнем со слоя Activation. Этот слой содержит 2048 карт активации, каждая размером 7×7. Пусть Fk представляет k-ю карту активации, где k∈ {1,…,2048}

Следующий слой AveragePooling2D GAP уменьшает размер предыдущего слоя до (1,1,2048), взяв среднее значение каждой карты объектов. Следующий слой Flatten просто сглаживает входные данные, не приводя к каким-либо изменениям в информации, содержащейся в предыдущем слое GAP.

Категория объекта, предсказанная ResNet-50, соответствует одному узлу в последнем плотном слое; и этот единственный узел соединен с каждым узлом в предыдущем слое Flatten. Пусть wk представляет собой вес, соединяющий k-й узел в слое Flatten с выходным узлом, соответствующим предсказанной категории изображения.

Тогда, чтобы получить карту активации класса, нам нужно только вычислить сумму: w1⋅f1+w2⋅f2+…+w2048⋅f2048.

Мы можем построить эти карты активации класса для любого изображения по нашему выбору, чтобы изучить возможности локализации ResNet-50. Чтобы можно было сравнить с исходным изображением, используется билинейная выборка вверх для изменения размера каждой карты активации до 224 × 224. (В результате получается карта активации класса размером 224×224.)