Этот пример показывает, как развернуть пользовательскую обученную сеть серии для обнаружения пешеходов и велосипедистов на основе их микродопплеровских сигнатур. Эта сеть взята из классификации пешеходов и бициклистов с помощью глубокого обучения
пример из набора 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);
Установите путь к установленному исполняемому файлу 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.Workflo
w объект.
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"
Чтобы развернуть сеть на оборудовании 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, правильно предсказывает, что изображение имеет два бициклиста.