В этом примере показано, как развернуть пользовательскую обученную серийную сеть, чтобы обнаружить дефекты в объектах, таких как шестиугольные гайки. Пользовательские сети были обучены при помощи передачи обучения. Передача обучения обычно используется в применении глубокого обучения. Можно взять предварительно обученную сеть и использовать ее в качестве начальной точки, чтобы изучить новую задачу. Подстройка сети с передачей обучения обычно намного быстрее и легче, чем обучение сети со случайным образом инициализированными весами с нуля. Можно быстро передать изученные функции новой задаче с помощью меньшего числа учебных сигналов. Этот пример использует две обученных серийных сети trainedDefNet.mat
и trainedBlemDetNet.mat.
Комплект разработчика Xilinx ZCU102 SoC
HDL глубокого обучения пакет Toolbox™Support для FPGA Xilinx и SoC
Deep Learning Toolbox™
Deep Learning HDL Toolbox™
Загружать и загружать пользовательские предварительно обученные серийные сети trainedDefNet
и trainedBlemDetNet
, Введите:
if ~isfile('trainedDefNet.mat') url = 'https://www.mathworks.com/supportfiles/dlhdl/trainedDefNet.mat'; websave('trainedDefNet.mat',url); end net1 = load('trainedDefNet.mat'); snet_defnet = net1.custom_alexnet
snet_defnet = SeriesNetwork with properties: Layers: [25×1 nnet.cnn.layer.Layer] InputNames: {'data'} OutputNames: {'output'}
Анализируйте snet_defnet
слои.
analyzeNetwork(snet_defnet)
if ~isfile('trainedBlemDetNet.mat') url = 'https://www.mathworks.com/supportfiles/dlhdl/trainedBlemDetNet.mat'; websave('trainedBlemDetNet.mat',url); end net2 = load('trainedBlemDetNet.mat'); snet_blemdetnet = net2.convnet
snet_blemdetnet = SeriesNetwork with properties: Layers: [12×1 nnet.cnn.layer.Layer] InputNames: {'imageinput'} OutputNames: {'classoutput'}
analyzeNetwork(snet_blemdetnet)
Создайте целевой объект, который имеет пользовательское имя для вашего целевого устройства и интерфейса, чтобы соединить ваше целевое устройство к хосту - компьютеру. Интерфейсные опции являются JTAG и Ethernet. Чтобы использовать связь JTAG, установите Xilinx(TM) Vivado(TM) Design Suite 2019.2.
Установить Xilinx Vivado toolpath, введите:
% hdlsetuptoolpath('ToolName', 'Xilinx Vivado', 'ToolPath', 'C:\Xilinx\Vivado\2019.2\bin\vivado.bat'); hT = dlhdl.Target('Xilinx','Interface','Ethernet')
hT = Target with properties: Vendor: 'Xilinx' Interface: Ethernet IPAddress: '10.10.10.15' Username: 'root' Port: 22
Создайте объект dlhdl.Workflow
класс. Когда вы создаете объект, задаете сеть и имя потока битов. Задайте сохраненный предварительно обученный trainedDefNet
как сеть. Убедитесь, что имя потока битов совпадает с типом данных и платой FPGA, для которой вы предназначаетесь. В этом примере целевая плата FPGA является платой ZCU102 SOC Xilinx. Поток битов использует один тип данных.
hW = dlhdl.Workflow('Network',snet_defnet,'Bitstream','zcu102_single','Target',hT)
hW = Workflow with properties: Network: [1×1 SeriesNetwork] Bitstream: 'zcu102_single' ProcessorConfig: [] Target: [1×1 dlhdl.Target]
Чтобы скомпилировать trainedDefnet серийную сеть, запустите функцию компиляции dlhdl.Workflow
объект.
hW.compile
offset_name offset_address allocated_space _______________________ ______________ _________________ "InputDataOffset" "0x00000000" "8.0 MB" "OutputResultOffset" "0x00800000" "4.0 MB" "SystemBufferOffset" "0x00c00000" "28.0 MB" "InstructionDataOffset" "0x02800000" "4.0 MB" "ConvWeightDataOffset" "0x02c00000" "12.0 MB" "FCWeightDataOffset" "0x03800000" "84.0 MB" "EndOffset" "0x08c00000" "Total: 140.0 MB"
ans = struct with fields:
Operators: [1×1 struct]
LayerConfigs: [1×1 struct]
NetConfigs: [1×1 struct]
Чтобы развернуть сеть на оборудовании Xilinx ZCU102 SoC, запустите развернуть функцию dlhdl.Workflow
объект. Эта функция использует выход функции компиляции, чтобы программировать плату FPGA при помощи файла программирования. Это также загружает сетевые веса и смещения. Развернуть функция начинает программировать устройство 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.
Загрузите изображение от присоединенного testImages
папка, измените размер изображения, чтобы совпадать с сетевыми входными размерностями слоя изображений и запустить предсказать функцию dlhdl.Workflow
объект получить и отобразить дефектное предсказание от FPGA.
wi = uint32(320); he = uint32(240); ch = uint32(3); filename=[pwd,'\ng1.png']; img=imread(filename); img = imresize(img, [he, wi]); img = mat2ocv(img); % Extract ROI for preprocessing [Iori, imgPacked, num, bbox] = myNDNet_Preprocess(img); % row-major > column-major conversion imgPacked2 = zeros([128,128,4],'uint8'); for c = 1:4 for i = 1:128 for j = 1:128 imgPacked2(i,j,c) = imgPacked((i-1)*128 + (j-1) + (c-1)*128*128 + 1); end end end % Classify detected nuts by using CNN scores = zeros(2,4); for i = 1:num [scores(:,i), speed] = hW.predict(single(imgPacked2(:,:,i)),'Profile','on'); end
### Finished writing input activations. ### Running single input activations. Deep Learning Processor Profiler Performance Results LastLayerLatency(cycles) LastLayerLatency(seconds) FramesNum Total Latency Frames/s ------------- ------------- --------- --------- --------- Network 12199544 0.05545 1 12199586 18.0 conv_module 3292478 0.01497 conv1 412777 0.00188 norm1 173433 0.00079 pool1 58705 0.00027 conv2 656607 0.00298 norm2 128094 0.00058 pool2 53221 0.00024 conv3 780491 0.00355 conv4 600179 0.00273 conv5 409095 0.00186 pool5 19991 0.00009 fc_module 8907066 0.04049 fc6 1759795 0.00800 fc7 7030223 0.03196 fc8 117046 0.00053 * The clock frequency of the DL processor is: 220MHz
Iori = reshape(Iori, [1, he*wi*ch]);
bbox = reshape(bbox, [1,16]);
scores = reshape(scores, [1, 8]);
% Insert an annotation for postprocessing
out = myNDNet_Postprocess(Iori, num, bbox, scores, wi, he, ch);
sz = [he wi ch];
out = ocv2mat(out,sz);
imshow(out)
Создайте объект the dlhdl.Workflow
класс. Когда вы создаете объект, задаете сеть и имя потока битов. Задайте сохраненный предварительно обученный trainedblemDetNet
как сеть. Убедитесь, что имя потока битов совпадает с типом данных и платой FPGA, для которой вы предназначаетесь. В этом примере целевая плата FPGA является платой ZCU102 SOC Xilinx. Поток битов использует один тип данных.
hW = dlhdl.Workflow('Network',snet_blemdetnet,'Bitstream','zcu102_single','Target',hT)
hW = Workflow with properties: Network: [1×1 SeriesNetwork] Bitstream: 'zcu102_single' ProcessorConfig: [] Target: [1×1 dlhdl.Target]
Скомпилировать trainedBlemDetNet
серийная сеть, запуск функция компиляции dlhdl.Workflow
объект.
hW.compile
offset_name offset_address allocated_space _______________________ ______________ ________________ "InputDataOffset" "0x00000000" "8.0 MB" "OutputResultOffset" "0x00800000" "4.0 MB" "SystemBufferOffset" "0x00c00000" "28.0 MB" "InstructionDataOffset" "0x02800000" "4.0 MB" "ConvWeightDataOffset" "0x02c00000" "4.0 MB" "FCWeightDataOffset" "0x03000000" "36.0 MB" "EndOffset" "0x05400000" "Total: 84.0 MB"
ans = struct with fields:
Operators: [1×1 struct]
LayerConfigs: [1×1 struct]
NetConfigs: [1×1 struct]
Чтобы развернуть сеть на оборудовании Xilinx ZCU102 SoC, запустите развернуть функцию dlhdl.Workflow
объект. Эта функция использует выход функции компиляции, чтобы программировать плату FPGA при помощи файла программирования. Это также загружает сетевые веса и смещения. Развернуть функция начинает программировать устройство FPGA, сообщения о ходе выполнения отображений, и время, которое требуется, чтобы развернуть сеть.
hW.deploy
### FPGA bitstream programming has been skipped as the same bitstream is already loaded on the target FPGA. ### Loading weights to FC Processor. ### 50% finished, current time is 28-Jun-2020 12:33:36. ### FC Weights loaded. Current time is 28-Jun-2020 12:33:37
Загрузите изображение от присоединенного testImages
папка, измените размер изображения, чтобы совпадать с сетевыми входными размерностями слоя изображений и запустить предсказать функцию dlhdl.Workflow
объект получить и отобразить дефектное предсказание от FPGA.
wi = uint32(320); he = uint32(240); ch = uint32(3); filename=[pwd,'\ok1.png']; img=imread(filename); img = imresize(img, [he, wi]); img = mat2ocv(img); % Extract ROI for preprocessing [Iori, imgPacked, num, bbox] = myNDNet_Preprocess(img); % row-major > column-major conversion imgPacked2 = zeros([128,128,4],'uint8'); for c = 1:4 for i = 1:128 for j = 1:128 imgPacked2(i,j,c) = imgPacked((i-1)*128 + (j-1) + (c-1)*128*128 + 1); end end end % classify detected nuts by using CNN scores = zeros(2,4); for i = 1:num [scores(:,i), speed] = hW.predict(single(imgPacked2(:,:,i)),'Profile','on'); end
### Finished writing input activations. ### Running single input activations.
Deep Learning Processor Profiler Performance Results LastLayerLatency(cycles) LastLayerLatency(seconds) FramesNum Total Latency Frames/s ------------- ------------- --------- --------- --------- Network 4886257 0.02221 1 4886299 45.0 conv_module 1256664 0.00571 conv_1 467349 0.00212 maxpool_1 191204 0.00087 crossnorm 159553 0.00073 conv_2 397552 0.00181 maxpool_2 41066 0.00019 fc_module 3629593 0.01650 fc_1 3614829 0.01643 fc_2 14763 0.00007 * The clock frequency of the DL processor is: 220MHz
Iori = reshape(Iori, [1, he*wi*ch]);
bbox = reshape(bbox, [1,16]);
scores = reshape(scores, [1, 8]);
% Insert annotation for postprocessing
out = myNDNet_Postprocess(Iori, num, bbox, scores, wi, he, ch);
sz = [he wi ch];
out = ocv2mat(out,sz);
imshow(out)