exponenta event banner

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

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

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

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

Предпосылки

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

  • Пакет поддержки Toolbox™ HDL для Intel FPGA и SoC

  • Глубокое обучение Toolbox™

  • Глубокое обучение HDL Toolbox™

  • Компьютерное зрение 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

Активации возвращаются в виде массива 3-D, при этом третье измерение индексирует канал на maxpool_1 слой. Чтобы показать эти активации с помощью imtile измените форму массива на 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 измените размер выходных данных канала и просмотрите активизации.

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

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

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

Связанные темы