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

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

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

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

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

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

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

  • Deep Learning Toolbox™

  • Deep Learning HDL Toolbox™

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

Загружать предварительно обученную серийную сеть logonet, введите:

snet = getLogoNetwork();

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

analyzeNetwork(snet)

Создайте целевой объект

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

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

Создать целевой объект, введите:

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

Создайте объект WorkFlow

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

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'