Визуализация активаций Нейронной сети для глубокого обучения при помощи LogoNet

В этом примере показано, как передать изображение в сверточную нейронную сеть и отобразить активации различных слоев сети. Исследуйте активации и обнаружите, какие функции учит сеть, сравнивая области активации с оригинальным изображением. Каналы в более ранних слоях учатся простым функциям, таким как цвет и ребра, в то время как каналы в более глубоких слоях учатся сложным функциям. Идентификация функций таким образом может помочь вам понять, чему научилась сеть.

Сеть распознавания логотипов

Логотипы помогают в идентификации и распознавании бренда. Многие компании включают свои логотипы в рекламные, документационные материалы и рекламные акции. Сеть распознавания логотипов (LogoNet) была разработана в MATLAB ® и может распознавать 32 логотипа при различных условиях подсветки и движениях камеры. Поскольку эта сеть фокусируется только на распознавании, ее можно использовать в приложениях, где локализация не требуется.

Необходимые условия

  • Arria10 комплект для разработки на базе SoC

  • Deep Learning HDL Toolbox™ поддержки для Intel FPGA и SoC

  • Deep Learning Toolbox™

  • Deep Learning HDL Toolbox™

  • Computer Vision Toolbox™

Загрузка предварительно обученной последовательной сети

Для загрузки предварительно обученной сети LogoNet введите:

snet = getLogoNetwork();

Создайте целевой объект

Создайте целевой объект, который имеет пользовательское имя для вашего целевого устройства и интерфейс для подключения вашего целевого устройства к хосту-компьютеру. Опции интерфейса JTAG и Ethernet. Чтобы использовать JTAG, установите Intel™ Quartus™ Prime Standard Edition 18.1. Настройте путь к установленному исполняемому файлу Intel Quartus Prime, если он еще не установлен. Для примера, чтобы задать траекторию инструмента, введите:

% hdlsetuptoolpath('ToolName', 'Altera Quartus II','ToolPath', 'C:\altera\18.1\quartus\bin64');

Чтобы создать целевой объект, введите:

hTarget = dlhdl.Target('Intel','Interface','JTAG');

Создание объекта рабочего процесса

Создайте объект dlhdl.Workflow класс. Когда вы создаете объект, задайте сеть и имя битового потока. Укажите сохраненную предварительно обученную нейронную сеть LogoNet, snet, как сеть. Убедитесь, что имя битового потока соответствует типу данных и плате FPGA, на которую вы нацелены. В этом примере целевой платой FPGA является плата Intel Arria10 SOC. Битовый поток использует один тип данных.

hW = dlhdl.Workflow('network', snet, 'Bitstream', 'arria10soc_single','Target',hTarget);

Чтение и отображение изображения. Сохраните его размер для будущего использования.

im = imread('ferrari.jpg');
imshow(im)

imgSize = size(im);
imgSize = imgSize(1:2);

Просмотр сетевой архитектуры

Проанализируйте сеть, чтобы увидеть, какие слои вы можете просмотреть. Сверточные слои выполняют свертки с помощью настраиваемых параметров. Сеть учится идентифицировать полезные функции, часто включая по одной функции на канал. Первый сверточный слой имеет 64 канала.

analyzeNetwork(snet)

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

Показать активации первого слоя Maxpool

Исследуйте функции, наблюдая, какие области в слоях maxpool активируются на изображении, и сравнивая это изображение с соответствующими областями в оригинальных изображениях. Каждый слой сверточной нейронной сети состоит из многих 2-D массивов, называемых каналами. Передайте изображение через сеть и исследуйте выходные активации maxpool_1 слой.

act1 = hW.activations(single(im),'maxpool_1','Profiler','on');
          offset_name          offset_address     allocated_space 
    _______________________    ______________    _________________

    "InputDataOffset"           "0x00000000"     "24.0 MB"        
    "OutputResultOffset"        "0x01800000"     "136.0 MB"       
    "SystemBufferOffset"        "0x0a000000"     "64.0 MB"        
    "InstructionDataOffset"     "0x0e000000"     "8.0 MB"         
    "ConvWeightDataOffset"      "0x0e800000"     "4.0 MB"         
    "EndOffset"                 "0x0ec00000"     "Total: 236.0 MB"

### Programming FPGA Bitstream using JTAG...
### Programming the FPGA bitstream has been completed successfully.
### Finished writing input activations.
### Running single input activations.


              Deep Learning Processor Profiler Performance Results

                   LastLayerLatency(cycles)   LastLayerLatency(seconds)       FramesNum      Total Latency     Frames/s
                         -------------             -------------              ---------        ---------       ---------
Network                   10182024                  0.06788                       1           10182034             14.7
    conv_module           10182024                  0.06788 
        conv_1             7088885                  0.04726 
        maxpool_1          3093166                  0.02062 
 * The clock frequency of the DL processor is: 150MHz

Активации возвращаются как трехмерный массив с третьей размерностью, индексирующим канал на maxpool_1 слой. Чтобы показать эти активации с помощью imtile function, измените форму массива на 4-D. Третья размерность во входе для imtile представляет цвет изображения. Установите третью размерность равным 1, поскольку активация не имеет цвета. Четвертая размерность индексирует канал.

sz = size(act1);
act1 = reshape(act1,[sz(1) sz(2) 1 sz(3)]);

Отображение активаций. Каждая активация может взять любое значение, поэтому нормализуйте выход с помощью mat2gray. Все активации масштабируются так, чтобы минимальная активация равнялась 0, а максимальная активация равнялась 1. Отобразите 96 изображений на сетке 12 на 8, по одному для каждого канала в слое.

I = imtile(mat2gray(act1),'GridSize',[12 8]);
imshow(I)

Исследуйте активации в определенных каналах

Каждый мозаик в сетке активаций является выходом канала в maxpool_1 слой. Белые пиксели представляют сильные положительные активации, а черные пиксели представляют сильные отрицательные активации. Канал, который в основном серый, не активируется так сильно на вход изображении. Положение пикселя в активации канала соответствует тому же положению в оригинальном изображении. Белый пиксель в местоположении в канале указывает, что канал сильно активирован в этом положении.

Измените размер активаций в канале 33 так, чтобы они совпадали с размером оригинального изображения, и отобразите активации.

act1ch33 = act1(:,:,:,22);
act1ch33 = mat2gray(act1ch33);
act1ch33 = imresize(act1ch33,imgSize);

I = imtile({im,act1ch33});
imshow(I)

Нахождение самого сильного канала активации

Найти интересные каналы путем программного исследования каналов с большими активациями. Найдите канал, который имеет самую большую активацию при помощи max function, изменить размер выходного сигнала канала и отобразить активации.

[maxValue,maxValueIndex] = max(max(max(act1)));
act1chMax = act1(:,:,:,maxValueIndex);
act1chMax = mat2gray(act1chMax);
act1chMax = imresize(act1chMax,imgSize);

I = imtile({im,act1chMax});
imshow(I)

Сравните самое сильное изображение канала активации с оригинальным изображением. Этот канал активируется на ребрах. Он активируется положительно на светлых левых / правых ребрах и отрицательно на тёмных левых / светлых правых ребрах.

Похожие темы