Нейронная сеть выводит промежуточную карту признаков

В процессе обучения нейронной сети будет генерироваться различная информация о картах объектов.Эти карты объектов содержат большой объем информации об изображении, такой как информация о контурах, подробная информация и т. д. Однако обычно мы получаем только окончательный выходной результат, как для карта промежуточных признаков. Ей уделяется мало внимания.

Мой младший брат внезапно задал этот вопрос два дня назад, но я понятия не имел. Позже, после исследования этого вопроса с младшим братом, у меня, вероятно, появилась идея.

То есть каждый модуль извлечения признаков будет выводить карту признаков. Каждый пиксель этих карт признаков на самом деле представляет собой некоторое числовое значение. Дальше вам нужно только сохранить эти числовые значения и затем отобразить их в виде изображений.

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

Исходное изображение:

Вставьте сюда описание изображения

Выходная карта объектов:

Вставьте сюда описание изображения
Так как же действовать?
Прежде всего необходимо уточнить, какой этап изображений объектов вы хотите вывести.Блогер выбрал выходные результаты четырех этапов магистральной сети.Размеры выходных карт объектов:

x的shape: torch.Size([1, 64, 200, 300])
x的shape: torch.Size([1, 128, 100, 150])
x的shape: torch.Size([1, 320, 50, 75])
x的shape: torch.Size([1, 512, 25, 38])

Код

После модуля вывода карты объектов карта объектов сохраняется в формате numpy:

sb = x.cpu().data.numpy()
np.save('matric'+str(i)+'.npy', sb)#这里的i是对应四个阶段的id

Прочитайте данные формата numpy и преобразуйте их в карту объектов:

import numpy as np
import os
import matplotlib.pyplot as plt
import torch
import torch.nn as nn

def normalization(data):  # NORMALIZE TO [0,1]
    _range = np.max(data) - np.min(data)
    data = (data - np.min(data)) / _range  # [0,1]
    return data

def fm_vis(feats, save_dir, save_name):
    save_dir = os.path.join(save_dir, save_name)
    if not os.path.exists(save_dir):
        os.makedirs(save_dir)

    feats = normalization(feats[0].cpu().data.numpy())
    for idx in range(min(feats.shape[0], 200*300)):  # CHANNLE NUMBER
        fms = feats[idx, :, :]
        plt.imshow(fms)
        plt.savefig(os.path.join(save_dir, save_name + '_' + str(idx) + ".png"))
        
for i in range(0,4):
    s_b1 = np.load('matric'+str(i)+'.npy')
    print(s_b1)
    s_b2 = torch.from_numpy(s_b1)
    out_dir = "outputs"
    s_b = s_b2.reshape(1, 64, 200, 300)
    fm_vis(s_b, out_dir, "s_b_vis"+str(i))

Конечный результат: выводятся четыре этапа карт признаков, и блоггер выбрал несколько из них:

Вставьте сюда описание изображения
Вставьте сюда описание изображения

Вставьте сюда описание изображения
Вставьте сюда описание изображения

рекомендация

отblog.csdn.net/pengxiang1998/article/details/132773036
рекомендация