В этом примере показано, как передать изображение в сверточную нейронную сеть и отобразить активации различных слоев сети. Исследуйте активации и обнаружите, какие функции учит сеть, сравнивая области активации с оригинальным изображением. Каналы в более ранних слоях учатся простым функциям, таким как цвет и ребра, в то время как каналы в более глубоких слоях учатся сложным функциям. Идентификация функций таким образом может помочь вам понять, чему научилась сеть.
Логотипы помогают в идентификации и распознавании бренда. Многие компании включают свои логотипы в рекламные, документационные материалы и рекламные акции. Сеть распознавания логотипов (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 активируются на изображении, и сравнивая это изображение с соответствующими областями в оригинальных изображениях. Каждый слой сверточной нейронной сети состоит из многих 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)
Сравните самое сильное изображение канала активации с оригинальным изображением. Этот канал активируется на ребрах. Он активируется положительно на светлых левых / правых ребрах и отрицательно на тёмных левых / светлых правых ребрах.