В этом примере показано, как сгенерировать и развернуть код для предсказания на устройстве на базе ARM ® без использования пакета аппаратной поддержки.
Когда вы генерируете код для предсказания с помощью ARM Compute Library и пакета аппаратной поддержки, codegen генерирует код на хост-компьютер, копирует сгенерированные файлы в целевой компьютер и создает исполняемый файл на целевой компьютер. Без пакета аппаратной поддержки codegen генерирует код на хост-компьютер. Необходимо запустить команды, чтобы скопировать файлы и создать исполняемую программу на целевом компьютере.
Этот пример использует packNGo функция, чтобы упаковать все релевантные файлы в сжатый zip-файл. Используйте этот пример, чтобы узнать, как развернуть сгенерированный код на целевых устройствах ARM Neon, которые не имеют пакета аппаратной поддержки при помощи packNGo.
Процессор ARM, поддерживающий расширение NEON
ARM Compute Library (на целевом оборудовании ARM)
Библиотека компьютерного зрения с открытым исходным кодом (Open CV)
Переменные окружения для компиляторов и библиотек
MATLAB ® Coder™
Пакет поддержки MATLAB Coder Interface для глубокого обучения
Deep Learning Toolbox™
Версия библиотеки ARM Compute, которую использует этот пример, может быть не последней версией, которая поддержки генерацию кода. Для поддерживаемых версий библиотек и для получения информации о настройке переменных окружения, смотрите Необходимые условия для глубокого обучения с MATLAB Coder.
Этот пример не поддерживается для MATLAB Online.
Этот пример использует сеть DAG SqueezeNet, чтобы показать классификацию изображений с помощью библиотеки ARM Compute Library. Предварительно обученный SqueezeNet для MATLAB доступен в Deep Learning Toolbox. The squeezenet_predict функция загружает сеть SqueezeNet в объект постоянной сети. При последующих вызовах функции постоянный объект используется повторно.
type squeezenet_predict
% Copyright 2018 The MathWorks, Inc.
function out = squeezenet_predict(in)
%#codegen
% A persistent object mynet is used to load the DAG network object.
% At the first call to this function, the persistent object is constructed and
% set up. When the function is called subsequent times, the same object is reused
% to call predict on inputs, avoiding reconstructing and reloading the
% network object.
persistent mynet;
if isempty(mynet)
mynet = coder.loadDeepLearningNetwork('squeezenet','squeezenet');
end
out = mynet.predict(in);
Когда вы генерируете код, нацеленный на устройство на основе ARM и не используете пакет аппаратной поддержки, создайте объект строения для библиотеки. Не создавайте объект строения для исполняемой программы.
Настройте объект строения только для генерации кода С++ и генерации кода.
cfg = coder.config('lib'); cfg.TargetLang = 'C++'; cfg.GenCodeOnly = true;
Создайте coder.ARMNEONConfig объект. Укажите версию библиотеки и архитектуру целевого процессора ARM. Например, предположим, что целевой платой является плата HiKey/Rock960 с ARMv8 архитектурой и ARM Compute Library версии 19.05.
dlcfg = coder.DeepLearningConfig('arm-compute'); dlcfg.ArmComputeVersion = '19.05'; dlcfg.ArmArchitecture = 'armv8';
Установите DeepLearningConfig свойство объекта строения генерации кода объекту строения глубокого обучения.
cfg.DeepLearningConfig = dlcfg;
codegencodegen -config cfg squeezenet_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- файла и извлеките его в папку и удалите 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
Скопируйте эти вспомогательные файлы из хоста-компьютера в целевой компьютер:
Входное изображение, coffeemug.png
Make-файл для генерации библиотеки, squeezenet_predict_rtw.mk
Make-файл для создания исполняемой программы, makefile_squeezenet_arm_generic.mk
Словарь Synset, synsetWords.txt
В следующих командах замените:
password с вашим паролем
username с вашим именем пользователя
targetname с именем вашего устройства
targetloc с целевой папкой для файлов
Выполните следующие шаги, чтобы скопировать все необходимые файлы при запуске из Linux
if isunix, system('sshpass -p password scp squeezenet_predict_rtw.mk username@targetname:targetloc/arm_compute/'), end if isunix, system('sshpass -p password scp coffeemug.png username@targetname:targetloc/arm_compute/'), end if isunix, system('sshpass -p password scp makefile_squeezenet_arm_generic.mk username@targetname:targetloc/arm_compute/'), end if isunix, system('sshpass -p password scp synsetWords.txt username@targetname:targetloc/arm_compute/'), end
Выполните следующие шаги, чтобы скопировать все необходимые файлы при запуске из Windows
if ispc, system('pscp.exe -pw password squeezenet_predict_rtw.mk username@targetname:targetloc/arm_compute/'), end if ispc, system('pscp.exe -pw password coffeemug.png username@targetname:targetloc/arm_compute/'), end if ispc, system('pscp.exe -pw password makefile_squeezenet_arm_generic.mk username@targetname:targetloc/arm_compute/'), end if ispc, system('pscp.exe -pw password synsetWords.txt username@targetname:targetloc/arm_compute/'), end
Чтобы создать библиотеку на целевом компьютере, выполните сгенерированный make-файл на оборудовании ARM.
Убедитесь, что вы задаете переменные окружения ARM_COMPUTELIB и LD_LIBRARY_PATH на целевой компьютер. Смотрите Необходимые условия для глубокого обучения с MATLAB Coder. ARM_ARCH переменная используется в Make-файле для передачи флагов компилятора на основе Arm Architecture. ARM_VER переменная используется в Make-файле, чтобы скомпилировать код на основе версии Arm Compute. Замените аппаратные учетные данные и пути аналогично вышеописанным шагам.
Выполните следующие действия, чтобы создать библиотеку из Linux.
if isunix, system('sshpass -p password scp main_squeezenet_arm_generic.cpp username@targetname:targetloc/arm_compute/'), end if isunix, system(['sshpass -p password ssh username@targetname "make -C targetloc/arm_compute/ -f squeezenet_predict_rtw.mk ARM_ARCH=' dlcfg.ArmArchitecture ' ARM_VER=' dlcfg.ArmComputeVersion ' "']), end
Выполните следующие действия, чтобы создать библиотеку из окон.
if ispc, system('pscp.exe -pw password main_squeezenet_arm_generic.cpp username@targetname:targetloc/arm_compute/'), end if ispc, system(['plink.exe -l username -pw password targetname "make -C targetloc/arm_compute/ -f squeezenet_predict_rtw.mk ARM_ARCH=' dlcfg.ArmArchitecture ' ARM_VER=' dlcfg.ArmComputeVersion ' "']), end
Создайте библиотеку с исходным основным файлом оболочки, чтобы создать исполняемый файл. main_squeezenet_arm_generic.cpp - основной файл оболочки C++, который вызывает squeezenet_predict функцию для создания исполняемого файла.
Выполните команду ниже, чтобы создать исполняемый файл из Linux.
if isunix, system('sshpass -p password ssh username@targetname "make -C targetloc/arm_compute/ -f makefile_squeezenet_arm_generic.mk targetDirName=targetloc/arm_compute"'), end
Выполните команду ниже, чтобы создать исполняемый файл из Windows.
if ispc, system('plink.exe -l username -pw password targetname "make -C targetloc/arm_compute/ -f makefile_squeezenet_arm_generic.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/; ./squeezenet coffeemug.png"'), end
Run the executable from Windows using below command.
if ispc, system('plink.exe -l username -pw password targetname "cd targetloc/arm_compute/; ./squeezenet coffeemug.png"'), end
Top 5 Predictions: ----------------------------- 88.299% coffee mug 7.309% cup 1.098% candle 0.634% paper towel 0.591% water jug

coder.ARMNEONConfig | coder.DeepLearningConfig | coder.HardwareImplementation | packNGo