Этот пример показывает, как сгенерировать и развернуть код для прогноза на устройстве ARM®-based, не используя пакет аппаратной поддержки.
Когда вы генерируете код для прогноза с помощью ARM, Вычисляют Библиотеку и пакет аппаратной поддержки, codegen
генерирует код по хосту - компьютеру, копирует сгенерированные файлы в целевой компьютер и создает исполняемый файл на целевом компьютере. Без пакета аппаратной поддержки codegen
генерирует код по хосту - компьютеру. Вы должны команды выполнения, чтобы скопировать файлы и создать исполняемую программу на целевом компьютере.
Процессор ARM, который поддерживает расширение NEON
ARM Вычисляет Библиотеку (на целевом оборудовании ARM)
Библиотека компьютерного зрения с открытым исходным кодом
Переменные окружения для компиляторов и библиотек
MATLAB® Coder™
Интерфейс MATLAB Coder пакета поддержки для Глубокого обучения
Deep Learning Toolbox™
Пакет поддержки Модель Deep Learning Toolbox для Сети SqueezeNet
Для поддерживаемых версий библиотек и для получения информации о подготовке переменных окружения, смотрите Предпосылки для Глубокого обучения для MATLAB Coder.
Этот пример поддерживается на платформах Linux® только.
Этот пример использует сеть DAG SqueezeNet, чтобы показать, что классификация изображений с ARM Вычисляет Библиотеку. Предварительно обученный SqueezeNet для MATLAB доступен в пакете поддержки Модель Deep Learning Toolbox для Сети SqueezeNet. Функция 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 series 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 с архитектурой ARMv8, и ARM Вычисляют версию 18.05 Библиотеки.
dlcfg = coder.DeepLearningConfig('arm-compute'); dlcfg.ArmComputeVersion = '18.05'; dlcfg.ArmArchitecture = 'armv8';
Установите свойство DeepLearningConfig
объекта настройки генерации кода к объекту настройки глубокого обучения.
cfg.DeepLearningConfig = dlcfg;
Чтобы сконфигурировать параметры генерации кода, которые характерны для целевого компьютера, устанавливает свойство ProdHWDeviceType
. Например, для архитектуры ARMv8, используйте 'ARM Compatible->ARM 64-bit (LP64)'
. Для архитектуры ARMv7 используйте ''ARM Compatible->ARM Cortex'
.
cfg.HardwareImplementation.ProdHWDeviceType = 'ARM Compatible->ARM 64-bit (LP64)';
Для получения дополнительной информации о специфичных для оборудования настройках, смотрите coder.HardwareImplementation
.
codegen
codegen -config cfg squeezenet_predict -args {ones(227, 227, 3, 'single')} -d arm_compute
Код сгенерирован в arm_compute папке в текущей рабочей папке на хосте - компьютере.
system('sshpass -p password scp -r arm_compute username@targetname:targetloc/');
Скопируйте эти файлы от хоста - компьютера до целевого компьютера:
Основной файл C++, который запускает прогноз на входном изображении, main_squeezenet_arm_generic.cpp
Введите изображение, coffeemug.png
Make-файл для создания исполняемой программы, makefile_squeezenet_arm_generic.mk
Словарь Synset, synsetWords.txt
В makefile_squeezenet_arm_generic.mk
измените CODEGEN_LIB
, ARM_COMPUTELIB
и targetDirName
для вашей цели.
В следующих командах, замене:
password
с вашим паролем
username
с вашим именем пользователя
targetname
с именем вашего устройства
targetloc
с папкой назначения для файлов
system('sshpass -p password scp main_squeezenet_arm_generic.cpp username@targetname:targetloc/arm_compute/'); system('sshpass -p password scp coffeemug.png username@targetname:targetloc/arm_compute/'); system('sshpass -p password scp makefile_squeezenet_arm_generic.mk username@targetname:targetloc/arm_compute/'); system('sshpass -p password scp synsetWords.txt username@targetname:targetloc/arm_compute/');
Чтобы создать библиотеку по целевому компьютеру, выполните сгенерированный make-файл на оборудовании ARM.
Убедитесь, что вы устанавливаете переменные окружения ARM_COMPUTELIB и LD_LIBRARY_PATH на целевом компьютере. Смотрите Предпосылки для Глубокого обучения для MATLAB Coder.
system('sshpass -p password ssh username@targetname "make -C targetloc/arm_compute/ -f squeezenet_predict_rtw.mk"');
system('sshpass -p password ssh username@targetname "make -C targetloc/arm_compute/ -f makefile_squeezenet_arm_generic.mk"');
Run the executable with an input image file.
system('sshpass -p password ssh username@targetname "cd targetloc/arm_compute/; ./squeezenet coffeemug.png"');
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