Классификация велосипедистов и пешеходов при помощи ПЛИС

Этот пример показывает, как развернуть пользовательскую обученную сеть серии для обнаружения пешеходов и велосипедистов на основе их микродопплеровских сигнатур. Эта сеть взята из классификации пешеходов и бициклистов с помощью глубокого обучения пример из набора Phased Array Toolbox. Для получения дополнительной информации о сетевом обучении и входных данных смотрите Классификацию пешеходов и бициклистов с использованием глубокого обучения.

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

  • Xilinx™ Vivado™ Design Suite 2019.2

  • Набор для оценки UltraScale+™ Zynq ® ZCU102 MPSoC

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

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

  • Deep Learning Toolbox™

  • Deep Learning 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 класс. Когда вы создаете объект, задайте сеть и имя битового потока. Укажите сохраненную предварительно обученную последовательную сеть, 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"

Программируйте Bitstream на 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, правильно предсказывает, что изображение имеет два бициклиста.