В этом примере показано, как сгенерировать и развернуть код для предсказания на устройстве на базе 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 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;
codegen
codegen -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 (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