exponenta event banner

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

В этом примере показано, как создавать, компилировать и развертывать dlhdl.Workflow объект, имеющий сеть распознавания логотипов в качестве сетевого объекта с использованием пакета поддержки Deep Learning HDL Toolbox™ для Xilinx FPGA и SoC. Используйте MATLAB ® для извлечения результатов прогнозирования из целевого устройства .

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

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

Предпосылки

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

  • Пакет поддержки HDL Toolbox™ глубокого обучения для Xilinx FPGA и SoC

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

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

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

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

snet = getLogoNetwork();

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

analyzeNetwork(snet)

Создание целевого объекта

Создайте целевой объект с пользовательским именем для целевого устройства и интерфейсом для подключения целевого устройства к хост-компьютеру. Опции интерфейса - JTAG и Ethernet. Для использования JTAG установите Xilinx™ Vivado™ Design Suite 2019.2. Чтобы задать траекторию инструмента Xilinx Vivado, введите:

% hdlsetuptoolpath('ToolName', 'Xilinx Vivado', 'ToolPath', 'C:\Xilinx\Vivado\2019.2\bin\vivado.bat');

Для создания целевого объекта введите:

hTarget = dlhdl.Target('Xilinx','Interface','Ethernet');

Создание объекта WorkFlow

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

hW = dlhdl.Workflow('network', snet, 'Bitstream', 'zcu102_single','Target',hTarget);
% If running on Xilinx ZC706 board, instead of the above command, 
% uncomment the command below.
%
% hW = dlhdl.Workflow('Network', snet, 'Bitstream', 'zc706_single','Target',hTarget);

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

Чтобы скомпилировать сеть распознавания логотипов, запустите функцию компиляции dlhdl.Workflow объект.

dn = hW.compile
          offset_name          offset_address     allocated_space 
    _______________________    ______________    _________________

    "InputDataOffset"           "0x00000000"     "24.0 MB"        
    "OutputResultOffset"        "0x01800000"     "4.0 MB"         
    "SystemBufferOffset"        "0x01c00000"     "60.0 MB"        
    "InstructionDataOffset"     "0x05800000"     "12.0 MB"        
    "ConvWeightDataOffset"      "0x06400000"     "32.0 MB"        
    "FCWeightDataOffset"        "0x08400000"     "44.0 MB"        
    "EndOffset"                 "0x0b000000"     "Total: 176.0 MB"
dn = struct with fields:
       Operators: [1×1 struct]
    LayerConfigs: [1×1 struct]
      NetConfigs: [1×1 struct]

Передача битового потока в FPGA и загрузка веса сети

Для развертывания сети на оборудовании Xilinx ZCU102 SoC выполните функцию развертывания dlhdl.Workflow объект. Эта функция использует выходные данные функции компиляции для программирования платы FPGA с помощью файла программирования. Он также загружает веса сети и отклонения. Функция развертывания запускает программирование устройства FPGA, отображает сообщения о ходе выполнения и время, необходимое для развертывания сети.

 hW.deploy
### FPGA bitstream programming has been skipped as the same bitstream is already loaded on the target FPGA.
### Loading weights to FC Processor.
### 33% finished, current time is 28-Jun-2020 12:40:14.
### 67% finished, current time is 28-Jun-2020 12:40:14.
### FC Weights loaded. Current time is 28-Jun-2020 12:40:14

Загрузить пример изображения

Загрузите пример изображения.

image = imread('heineken.png');
inputImg = imresize(image, [227, 227]);
imshow(inputImg);

Выполнить прогнозирование

Выполните функцию прогнозирования на dlhdl.Workflow и отобразите результат:

[prediction, speed] = hW.predict(single(inputImg),'Profile','on');
### Finished writing input activations.
### Running single input activations.
              Deep Learning Processor Profiler Performance Results

                   LastLayerLatency(cycles)   LastLayerLatency(seconds)       FramesNum      Total Latency     Frames/s
                         -------------             -------------              ---------        ---------       ---------
Network                   38865102                  0.17666                       1           38865144              5.7
    conv_module           34299592                  0.15591 
        conv_1             6955899                  0.03162 
        maxpool_1          3306384                  0.01503 
        conv_2            10396300                  0.04726 
        maxpool_2          1207215                  0.00549 
        conv_3             9269094                  0.04213 
        maxpool_3          1367650                  0.00622 
        conv_4             1774679                  0.00807 
        maxpool_4            22464                  0.00010 
    fc_module              4565510                  0.02075 
        fc_1               2748478                  0.01249 
        fc_2               1758315                  0.00799 
        fc_3                 58715                  0.00027 
 * The clock frequency of the DL processor is: 220MHz
[val, idx] = max(prediction);
snet.Layers(end).ClassNames{idx}
ans = 
'heineken'

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