codegen
В этом примере показано, как использовать codegen
для создания кода для приложения классификации логотипов, использующего глубокое изучение процессоров ARM ®. В приложении классификации логотипов используется LogoNet
series network для распознавания логотипов по изображениям. Созданный код использует преимущества вычислительной библиотеки ARM для компьютерного зрения и машинного обучения.
Процессор ARM, поддерживающий расширение NEON
Библиотека компьютерного зрения с открытым исходным кодом (OpenCV) версии 3.1
Переменные среды для вычислительных библиотек ARM и OpenCV
MATLAB ® Coder™ для генерации кода C++
Пакет поддержки MATLAB Coder Interface для глубокого обучения
Toolbox™ глубокого обучения для использования SeriesNetwork
объект
Версия библиотеки вычислений ARM, используемая в этом примере, может не быть последней версией, поддерживаемой при создании кода. Поддерживаемые версии библиотек и сведения о настройке переменных среды см. в разделе Предварительные условия для глубокого обучения с помощью кодера MATLAB.
Этот пример поддерживается платформами Linux ® и Windows ® и не поддерживается MATLAB Online.
Загрузить предварительно подготовленное LogoNet
сеть и сохраните ее как logonet.mat
, если он не существует. Сеть была разработана в MATLAB ® и ее архитектура аналогична архитектуре AlexNet. Эта сеть распознает 32 логотипа при различных условиях освещения и углах камеры.
net = getLogonet();
Сеть содержит 22 уровня, включая сверточные, полностью соединенные и классификационные выходные уровни.
net.Layers
ans = 22×1 Layer array with layers: 1 'imageinput' Image Input 227×227×3 images with 'zerocenter' normalization and 'randfliplr' augmentations 2 'conv_1' Convolution 96 5×5×3 convolutions with stride [1 1] and padding [0 0 0 0] 3 'relu_1' ReLU ReLU 4 'maxpool_1' Max Pooling 3×3 max pooling with stride [2 2] and padding [0 0 0 0] 5 'conv_2' Convolution 128 3×3×96 convolutions with stride [1 1] and padding [0 0 0 0] 6 'relu_2' ReLU ReLU 7 'maxpool_2' Max Pooling 3×3 max pooling with stride [2 2] and padding [0 0 0 0] 8 'conv_3' Convolution 384 3×3×128 convolutions with stride [1 1] and padding [0 0 0 0] 9 'relu_3' ReLU ReLU 10 'maxpool_3' Max Pooling 3×3 max pooling with stride [2 2] and padding [0 0 0 0] 11 'conv_4' Convolution 128 3×3×384 convolutions with stride [2 2] and padding [0 0 0 0] 12 'relu_4' ReLU ReLU 13 'maxpool_4' Max Pooling 3×3 max pooling with stride [2 2] and padding [0 0 0 0] 14 'fc_1' Fully Connected 2048 fully connected layer 15 'relu_5' ReLU ReLU 16 'dropout_1' Dropout 50% dropout 17 'fc_2' Fully Connected 2048 fully connected layer 18 'relu_6' ReLU ReLU 19 'dropout_2' Dropout 50% dropout 20 'fc_3' Fully Connected 32 fully connected layer 21 'softmax' Softmax softmax 22 'classoutput' Classification Output crossentropyex with 'adidas' and 31 other classes
На целевом оборудовании ARM убедитесь, что ARM_COMPUTELIB установлен и что LD_LIBRARY_PATH содержит путь к папке «Библиотека вычислений ARM».
См. раздел Предварительные условия для глубокого обучения с помощью кодера MATLAB.
logonet_predict.m
функция точки входа принимает ввод изображения и выполняет прогнозирование изображения с использованием сети глубокого обучения, сохраненной в LogoNet
MAT-файл. Функция загружает сетевой объект из LogoNet.mat
в логонет постоянной сетевой переменной. При последующих вызовах функции постоянный объект используется повторно.
type logonet_predict
function out = logonet_predict(in) %#codegen % Copyright 2017-2020 The MathWorks, Inc. persistent logonet; if isempty(logonet) logonet = coder.loadDeepLearningNetwork('LogoNet.mat','logonet'); end out = logonet.predict(in); end
При создании кода, предназначенного для устройства на базе ARM и не использующего пакет поддержки оборудования, создайте объект конфигурации для библиотеки. Не создавать объект конфигурации для исполняемой программы.
Настройте объект конфигурации для генерации кода C++ и только для генерации кода.
cfg = coder.config('lib'); cfg.TargetLang = 'C++'; cfg.GenCodeOnly = true;
Создать coder.ARMNEONConfig
объект. Укажите версию библиотеки и архитектуру целевого процессора ARM. Например, предположим, что целевая плата является платой HiKey/Rock960 с архитектурой ARMv8 и вычислительной библиотекой ARM версии 19.05.
dlcfg = coder.DeepLearningConfig('arm-compute'); dlcfg.ArmComputeVersion = '19.05'; dlcfg.ArmArchitecture = 'armv8';
Установите DeepLearningConfig
свойство объекта конфигурации генерации кода для объекта конфигурации глубокого обучения.
cfg.DeepLearningConfig = dlcfg;
codegen
codegen -config cfg logonet_predict -args {ones(227, 227, 3, 'single')} -d arm_compute
Код генерируется в arm_compute
в текущей рабочей папке на хост-компьютере.
packNGo
функцияФункция packNGo упаковывает все соответствующие файлы в сжатый zip-файл.
zipFileName = 'arm_compute.zip'; bInfo = load(fullfile('arm_compute','buildInfo.mat')); packNGo(bInfo.buildInfo, {'fileName', zipFileName,'minimalHeaders', false, 'ignoreFileMissing',true});
Скопируйте ZIP-файл и извлеките его в папку. Удалите ZIP-файл с целевого оборудования.
В следующих командах замените:
password
с вашим паролем
username
с именем пользователя
targetname
с именем устройства
targetloc
с конечной папкой для файлов
Выполните эти команды для копирования и извлечения zip-файла из Linux.
if isunix, system(['sshpass -p password scp -r ' fullfile(pwd,zipFileName) ' username@targetname:targetloc/']), end if isunix, system('sshpass -p password ssh username@targetname "if [ -d targetloc/arm_compute ]; then rm -rf targetloc/arm_compute; fi"'), end if isunix, system(['sshpass -p password ssh username@targetname "unzip targetloc/' zipFileName ' -d targetloc/arm_compute"']), end if isunix, system(['sshpass -p password ssh username@targetname "rm -rf targetloc' zipFileName '"']), end
Выполните эти команды для копирования и извлечения zip-файла из Windows.
if ispc, system(['pscp.exe -pw password -r ' fullfile(pwd,zipFileName) ' username@targetname:targetloc/']), end if ispc, system('plink.exe -l username -pw password targetname "if [ -d targetloc/arm_compute ]; then rm -rf targetloc/arm_compute; fi"'), end if ispc, system(['plink.exe -l username -pw password targetname "unzip targetloc/' zipFileName ' -d targetloc/arm_compute"']), end if ispc, system(['plink.exe -l username -pw password targetname "rm -rf targetloc' zipFileName '"']), end
Скопируйте эти поддерживающие файлы с хост-компьютера на целевое оборудование:
Входное изображение, coderdemo_google.png
Makefile для создания библиотеки, logonet_predict_rtw.mk
Makefile для построения исполняемой программы, makefile_arm_logo.mk
Словарь синсета, synsetWordsLogoDet.txt
В следующих командах замените:
password
с вашим паролем
username
с именем пользователя
targetname
с именем устройства
targetloc
с конечной папкой для файлов
Выполните следующие действия для копирования всех необходимых файлов при запуске из Linux.
if isunix, system('sshpass -p password scp logonet_predict_rtw.mk username@targetname:targetloc/arm_compute/'), end if isunix, system('sshpass -p password scp coderdemo_google.png username@targetname:targetloc/arm_compute/'), end if isunix, system('sshpass -p password scp makefile_arm_logo.mk username@targetname:targetloc/arm_compute/'), end if isunix, system('sshpass -p password scp synsetWordsLogoDet.txt username@targetname:targetloc/arm_compute/'), end
Выполните следующие действия для копирования всех необходимых файлов при запуске из Windows
if ispc, system('pscp.exe -pw password logonet_predict_rtw.mk username@targetname:targetloc/arm_compute/'), end if ispc, system('pscp.exe -pw password coderdemo_google.png username@targetname:targetloc/arm_compute/'), end if ispc, system('pscp.exe -pw password makefile_arm_logo.mk username@targetname:targetloc/arm_compute/'), end if ispc, system('pscp.exe -pw password synsetWordsLogoDet.txt username@targetname:targetloc/arm_compute/'), end
Чтобы создать библиотеку на целевом оборудовании, выполните созданный make-файл на оборудовании ARM.
Убедитесь, что на целевом оборудовании установлены переменные среды ARM_COMPUTELIB и LD_LIBRARY_PATH. См. раздел Предварительные условия для глубокого обучения с помощью кодера MATLAB. Переменная ARM_ARCH используется в Makefile для передачи флагов компилятора на основе архитектуры Arm. ARM_VER переменная используется в Makefile для компиляции кода на основе Arm Compute Version. Замените учетные данные оборудования и пути в этих командах аналогично предыдущему разделу.
Выполните следующие действия для создания библиотеки из Linux.
if isunix, system('sshpass -p password scp main_arm_logo.cpp username@targetname:targetloc/arm_compute/'), end if isunix, system(['sshpass -p password ssh username@targetname "make -C targetloc/arm_compute/ -f logonet_predict_rtw.mk ARM_ARCH=' dlcfg.ArmArchitecture ' ARM_VER=' dlcfg.ArmComputeVersion ' "']), end
Выполните следующие действия, чтобы создать библиотеку из окон.
if ispc, system('pscp.exe -pw password main_arm_logo.cpp username@targetname:targetloc/arm_compute/'), end if ispc, system(['plink.exe -l username -pw password targetname "make -C targetloc/arm_compute/ -f logonet_predict_rtw.mk ARM_ARCH=' dlcfg.ArmArchitecture ' ARM_VER=' dlcfg.ArmComputeVersion ' "']), end
Создайте библиотеку с исходным файлом основной оболочки для создания исполняемого файла. main_arm_logo.cpp
является основным файлом оболочки C++, который вызывает logonet_predict
функция.
Выполните приведенную ниже команду для создания исполняемого файла из Linux.
if isunix, system('sshpass -p password ssh username@targetname "make -C targetloc/arm_compute/ -f makefile_arm_logo.mk targetDirName=targetloc/arm_compute"'), end
Выполните приведенную ниже команду для создания исполняемого файла из Windows.
if ispc, system('plink.exe -l username -pw password targetname "make -C targetloc/arm_compute/ -f makefile_arm_logo.mk targetDirName=targetloc/arm_compute"'), end
Run the executable from Linux using below command.
if isunix, system('sshpass -p password ssh username@targetname "cd targetloc/arm_compute/; ./logonet coderdemo_google.png"'), end
Run the executable from Windows using below command.
if ispc, system('plink.exe -l username -pw password targetname "cd targetloc/arm_compute/; ./logonet coderdemo_google.png"'), end
Top 5 Predictions: ----------------------------- 99.992% google 0.003% corona 0.003% singha 0.001% esso 0.000% fedex
cnncodegen
| coder.DeepLearningConfig
| coder.loadDeepLearningNetwork