Велосипедист и пешеходная классификация при помощи FPGA

В этом примере показано, как развернуть пользовательскую обученную серийную сеть, чтобы обнаружить пешеходов и велосипедистов на основе их micro-Doppler подписей. Эта сеть взята из Классификации Пешеходов и Велосипедистов Используя Глубокое обучение пример от Тулбокса Фазированной решетки. Для получения дополнительной информации о сетевом обучении и входных данных, смотрите Классификацию Пешеходов и Велосипедистов Используя Глубокое обучение.

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

  • Набор проекта Xilinx™ Vivado™ 2019.2

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

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

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

  • 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 Toolpath

Создайте путь к своему установленному Набору Проекта Xilinx™ Vivado™ 2 019,2 исполняемых файлов, если это уже не настраивается. Например, чтобы установить toolpath, введите:

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

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

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

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

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

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

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

Скомпилируйте trainedNetNoCar Серийная сеть

Скомпилировать trainedNetNoCar серийная сеть, запуск функция компиляции 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 при помощи программирования file.The, функция также загружает сетевые веса и смещения. Развернуть функция проверяет на инструмент 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.

Запустите предсказания на подписях Micro-Doppler

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

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

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