В этом примере показано, как развернуть пользовательскую обученную серийную сеть, чтобы обнаружить пешеходов и велосипедистов на основе их 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);
Создайте путь к своему установленному Набору Проекта 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.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 при помощи программирования 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.
Классифицируйте вход того от демонстрационного набора тестовых данных при помощи предсказать функции 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 правильно, предсказывает, что изображение имеет двух велосипедистов.