exponenta event banner

Классификация велосипедистов и пешеходов с использованием FPGA

В этом примере показано, как развернуть специализированную обучаемую сеть для обнаружения пешеходов и велосипедистов на основе их микродоплеровских подписей. Эта сеть взята из классификации пешеходов и велосипедистов с использованием глубокого обучения пример из панели инструментов «Поэтапный массив». Более подробную информацию о сетевом обучении и входных данных см. в разделе Классификация пешеходов и велосипедистов с использованием глубокого обучения.

Предпосылки

  • Xilinx™ Vivado™ Design Suite 2019.2

  • Оценочный комплект Zynq ® UltraScale+™ MPSoC ZCU102

  • Пакет поддержки HDL Verifier™ для плат XIlinx FPGA

  • MATLAB™ Интерфейс Coder ™ для библиотек глубокого обучения

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

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

В этом примере используются следующие файлы данных:

  • Файл MAT trainedNetBicPed.mat содержит модель, обученную набору данных обучения trainDataNoCar и его набор меток trainLabelNoCar.

  • Файл MAT testDataBicPed.mat содержит набор тестовых данных testDataNoCar и его набор меток testLabelNoCar.

Загрузить данные и сеть

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

load('trainedNetBicPed.mat','trainedNetNoCar')
load('testDataBicPed.mat')

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

analyzeNetwork(trainedNetNoCar);

Настройка траектории инструментов HDL

Настройте путь к установленному исполняемому файлу Xilinx™ Vivado™ Design Suite 2019.2, если он еще не настроен. Например, чтобы задать траекторию движения инструмента, введите:

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

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

Создайте целевой объект для целевого устройства с именем поставщика и интерфейсом для подключения целевого устройства к хост-компьютеру. Опции интерфейса - JTAG (по умолчанию) и Ethernet. Варианты поставщиков - Intel или Xilinx. Для программирования устройства используйте установленный пакет Xilinx Vivado Design Suite по Ethernet-соединению.

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

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

Создание объекта dlhdl.Workflow класс. При создании объекта укажите сеть и имя битового потока. Укажите сохраненную сеть серии Pre-Trained, trainedNetNoCar, как сеть. Убедитесь, что имя битового потока соответствует типу данных и целевой плате FPGA. В этом примере целевой платой FPGA является ZCU102 плата Zynq UltraScale + MPSoC. Битовый поток использует один тип данных..

hW = dlhdl.Workflow('Network', trainedNetNoCar, 'Bitstream', 'zcu102_single', 'Target', hT);

Собрать trainedNetNoCar Сеть серии

Для компиляции trainedNetNoCar series network, запустите функцию компиляции dlhdl.Workflow объект.

dn = hW.compile;
### Optimizing series network: Fused 'nnet.cnn.layer.BatchNormalizationLayer' into 'nnet.cnn.layer.Convolution2DLayer'
          offset_name          offset_address    allocated_space 
    _______________________    ______________    ________________

    "InputDataOffset"           "0x00000000"     "28.0 MB"       
    "OutputResultOffset"        "0x01c00000"     "4.0 MB"        
    "SystemBufferOffset"        "0x02000000"     "28.0 MB"       
    "InstructionDataOffset"     "0x03c00000"     "4.0 MB"        
    "ConvWeightDataOffset"      "0x04000000"     "4.0 MB"        
    "FCWeightDataOffset"        "0x04400000"     "4.0 MB"        
    "EndOffset"                 "0x04800000"     "Total: 72.0 MB"

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

Для развертывания сети на оборудовании Zynq ® UltraScale+™ MPSoC ZCU102 запустите функцию развертывания dlhdl.Workflow объект. Эта функция использует выходные данные функции компиляции для программирования платы FPGA с помощью файла программирования. Функция также загружает веса сети и смещения. Функция развертывания проверяет наличие инструмента Xilinx Vivado и поддерживаемой версии инструмента. Затем он начинает программировать устройство FPGA с помощью битового потока, отображает сообщения о ходе выполнения и время, необходимое для развертывания сети.

hW.deploy;
### FPGA bitstream programming has been skipped as the same bitstream is already loaded on the target FPGA.
### Deep learning network programming has been skipped as the same network is already loaded on the target FPGA.

Прогон прогнозов на микро-доплеровских сигнатурах

Классифицируйте один вход из набора тестовых данных с помощью функции прогнозирования dlhdl.Workflow и отобразить метку. Входы в сеть соответствуют сонограммам микродоплеровских подписей для пешехода или велосипедиста или их комбинации.

testImg = single(testDataNoCar(:, :, :, 1));
testLabel = testLabelNoCar(1);
classnames = trainedNetNoCar.Layers(end).Classes;

% Get predictions from network on single test input
score = hW.predict(testImg, '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                    9430692                  0.04287                       1            9430707             23.3
    conv_module            9411355                  0.04278 
        conv_1             4178753                  0.01899 
        maxpool_1          1394883                  0.00634 
        conv_2             1975197                  0.00898 
        maxpool_2           706156                  0.00321 
        conv_3              813598                  0.00370 
        maxpool_3           121790                  0.00055 
        conv_4              148165                  0.00067 
        maxpool_4            22255                  0.00010 
        conv_5               41999                  0.00019 
        avgpool2d             8674                  0.00004 
    fc_module                19337                  0.00009 
        fc                   19337                  0.00009 
 * The clock frequency of the DL processor is: 220MHz
score = 1×5 single row vector

    0.9956    0.0000    0.0000    0.0044    0.0000

[~, idx1] = max(score);
predTestLabel = classnames(idx1)
predTestLabel = categorical
     ped 

Загрузите пять случайных изображений из набора тестовых данных выборки и выполните функцию прогнозирования dlhdl.Workflow для отображения меток рядом с сигнатурами. Прогнозы будут происходить сразу, так как вход конкатенируется по четвертому измерению.

numTestFrames = size(testDataNoCar, 4);
numView = 5;
listIndex = randperm(numTestFrames, numView);
testImgBatch = single(testDataNoCar(:, :, :, listIndex));
testLabelBatch = testLabelNoCar(listIndex);

% Get predictions from network using DL HDL Toolbox on FPGA
[scores, speed] = hW.predict(testImgBatch, '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                    9446929                  0.04294                       5           47138869             23.3
    conv_module            9427488                  0.04285 
        conv_1             4195175                  0.01907 
        maxpool_1          1394705                  0.00634 
        conv_2             1975204                  0.00898 
        maxpool_2           706332                  0.00321 
        conv_3              813499                  0.00370 
        maxpool_3           121869                  0.00055 
        conv_4              148063                  0.00067 
        maxpool_4            22019                  0.00010 
        conv_5               42053                  0.00019 
        avgpool2d             8684                  0.00004 
    fc_module                19441                  0.00009 
        fc                   19441                  0.00009 
 * The clock frequency of the DL processor is: 220MHz
[~, idx2] = max(scores, [], 2);
predTestLabelBatch = classnames(idx2);

% Display the micro-doppler signatures along with the ground truth and
% predictions.
for k = 1:numView
    index = listIndex(k);
    imagesc(testDataNoCar(:, :, :, index));
    axis xy
    xlabel('Time (s)')
    ylabel('Frequency (Hz)')
    title('Ground Truth: '+string(testLabelNoCar(index))+', Prediction FPGA: '+string(predTestLabelBatch(k)))
    drawnow;
    pause(3);
end

Изображение показывает микро-доплеровские сигнатуры двух бициклистов (bic + bic), что является основной правдой. Основная истина - это классификация изображения, с которой сравнивается предсказание сети. Предсказание сети, полученное из FPGA, правильно предсказывает, что изображение имеет два бициклиста.