В этом примере показано, как накормить изображением сверточную нейронную сеть и отобразить активации различных слоев сети. Исследуйте активации и узнайте, какие функции сеть изучает путем сравнения областей активации к оригинальному изображению. Каналы в более ранних слоях изучают простые функции как цвет и ребра, в то время как каналы в более глубоких слоях изучают комплексные функции. Идентификация функций таким образом может помочь вам изучить то, что изучила сеть.
Логотипы помогают в идентификации бренда и распознавании. Многие компании включают свои логотипы в рекламу, материалы документации и продвижения. Сеть распознавания логотипа (LogoNet) была разработана в MATLAB® и может распознать 32 логотипа при различных условиях освещения и движениях камеры. Поскольку эта сеть фокусируется только на распознавании, можно использовать его в приложениях, где локализация не требуется.
Комплект разработчика Arria10 SoC
Пакет поддержки Deep Learning HDL Toolbox™ для FPGA Intel и SoC
Deep Learning Toolbox™
Deep Learning HDL Toolbox™
Computer Vision Toolbox™
Загружать предварительно обученную серийную сеть LogoNet, введите:
snet = getLogoNetwork();
Создайте целевой объект, который имеет пользовательское имя для вашего целевого устройства и интерфейса, чтобы соединить ваше целевое устройство к хосту - компьютеру. Интерфейсные опции являются JTAG и Ethernet. Чтобы использовать JTAG, установите Intel™ Quartus™ Standard Edition 18.1 Прайма. Создайте путь к своему установленному Intel исполняемый файл Куарта Прайма, если это уже не настраивается. Например, чтобы установить toolpath, введите:
% 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)
Слой Image Input задает входной размер. Прежде, чем передать изображение через сеть, можно изменить размер его. Сеть может также обработать увеличенные изображения.. Если вы питаете сетевые увеличенные изображения, активации также становятся больше. Поскольку сеть обучена на изображениях размера 227 227, это не обучено распознать большие объекты или функции.
Исследуйте функции путем наблюдения, какие области в maxpool слоях активируются на изображении и сравнении того изображения к соответствующим областям в оригинальных изображениях. Каждый слой сверточной нейронной сети состоит из названных каналов многих 2D массивов. Передайте изображение через сеть и исследуйте выходные активации 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
функционируйте, измените размерность массива к 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)
Сравните самое сильное изображение канала активации с оригинальным изображением. Этот канал активируется на ребрах. Это активируется положительно на легких левых/темных правых краях и негативно на темных левых/легких правых краях.