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

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

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

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

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

  • Набор для разработки Xilinx ZCU102 SoC

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

  • Deep Learning Toolbox™

  • Deep Learning 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');

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

Создайте объект 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]

Программа Bitstream на 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'

Похожие темы