В этом примере показано, как скомпилировать сгенерированный код глубокого обучения для создания библиотеки или исполняемого файла, а затем развернуть библиотеку или исполняемый файл на цели ARM ®, такой как Hikey 960 или Rock 960. Этот пример использует codegen
команда.
Кросс-компиляция кода глубокого обучения для целей ARM ® включает следующие шаги:
Сконфигурируйте установленный набор инструментов кросс-компилятора для выполнения компиляции на хосте MATLAB ®. Компиляция происходит, когда вы запускаете codegen
команда в MATLAB в хост-компьютер.
Используйте codegen
Команда, чтобы создать сгенерированный код и создать библиотеку или исполняемый файл на хост-компьютер.
Скопируйте сгенерированную библиотеку или исполняемый файл и другие вспомогательные файлы на целевой компьютер. Если вы генерируете библиотеку на хост-компьютер, скомпилируйте скопированный make-файл на целевой файл, чтобы создать исполняемый файл.
Запустите сгенерированный исполняемый файл на целевом оборудовании ARM.
Можно использовать этот рабочий процесс для любой цели ARM Neon, которая поддерживает набор инструкций Neon 'SIMD. Этот пример поддерживается только для хост-платформ Linux ® .
Процессор ARM, поддерживающий расширение Neon 'SIMD
ARM Compute Library (на хост-компьютер)
MATLAB ® Coder™
Пакет поддержки MATLAB Coder Interface для глубокого обучения
Deep Learning Toolbox™
Пакет поддержки Deep Learning Toolbox Model для Inception-v3 Network
Image Processing Toolbox™
Для развертывания на объекте armv7 (32-разрядная архитектура Arm Architecture), g++-arm-linux-gnueabihf GNU/GCC
toolchain
Для развертывания на объекте armv8 (64-разрядная архитектура Arm Architecture), GNU/GCC g++-aarch64-linux-gnu
toolchain
Окружение переменные для перекрестных компиляторов и библиотек
Для получения информации о том, как установить набор инструментов кросс-компилятора и настроить связанную переменную окружения, смотрите Cross-Compile Deep Learning Code Который использует ARM Compute Library (MATLAB Coder).
Версия библиотеки ARM Compute, которую использует этот пример, может быть не последней версией, которая поддержки генерацию кода. Для получения информации о поддерживаемых версиях библиотек и о переменных окружения, смотрите Необходимые условия для глубокого обучения с MATLAB Coder (MATLAB Coder).
Код, линии в этом примере, комментируется. Раскомментируйте их перед запуском примера.
Этот пример не поддерживается в MATLAB Online.
inception_predict_arm
Функция точки входаЭтот пример использует Inception-V3 сеть классификации изображений. Предварительно обученная сеть Inception-V3 для MATLAB доступна в пакете поддержки Deep Learning Toolbox Model for Inception-V3 Network. The inception_predict_arm
функция точки входа загружает Inception-V3 сеть в объект постоянной сети. При последующих вызовах функции постоянный объект используется повторно.
type inception_predict_arm
function out = inception_predict_arm(in) persistent net; if isempty(net) net = coder.loadDeepLearningNetwork('inceptionv3','inceptionv3'); end out = net.predict(in); end
Создайте coder.ARMNEONConfig
объект. Укажите версию библиотеки ARM Compute.
dlcfg = coder.DeepLearningConfig('arm-compute'); dlcfg.ArmComputeVersion = '19.05';
Для классификации входа изображения peppers.png
преобразуйте изображение в текстовый файл.
% generateImagetoTxt('peppers.png');
В этом подходе вы сначала скомпилируете сгенерированный код, чтобы создать статическую библиотеку на хост-компьютер. Затем сгенерированная статическая библиотека, файлы библиотеки ARM Compute, make-файл и другие вспомогательные файлы передаются на целевой компьютер. Вы запускаете make-файл на целевом компьютере, чтобы сгенерировать исполняемый файл. Наконец, исполняемый файл запускается на целевом компьютере.
Создайте объект строения генерации кода для статической библиотеки. Задайте целевой язык как C++.
cfg = coder.config('lib'); cfg.TargetLang = 'C++';
Присоедините объект строения глубокого обучения к объекту строения генерации кода.
cfg.DeepLearningConfig = dlcfg;
Сконфигурируйте набор инструментов кросс-компилятора на основе архитектуры ARM целевого устройства.
% cfg.Toolchain = 'Linaro AArch64 Linux v6.3.1';% When the Arm Architecture is armv8 % cfg.Toolchain = 'Linaro AArch32 Linux v6.3.1';% When the Arm Architecture is armv7
Используйте codegen
команда, чтобы сгенерировать код для функции точки входа, создать сгенерированный код и создать статическую библиотеку для целевой архитектуры ARM.
% codegen -config cfg inception_predict_arm -args {ones(299,299,3,'single')} -d arm_compute_cc_lib -report
Скопируйте статическую библиотеку, файлы интервала и файлы заголовков из сгенерированной папки arm_compute_cc_lib
к целевому оборудованию ARM. В этом коде и других линиях кода линий которые следуют, замените:
пароль с вашим паролем
имя пользователя с именем пользователя
hostname с именем вашего устройства
targetDir с целевой папкой для файлов
% system('sshpass -p password scp -r arm_compute_cc_lib/*.bin arm_compute_cc_lib/*.lib arm_compute_cc_lib/*.h arm_compute_cc_lib/*.hpp username@hostname:targetDir/');
Исполняемый файл использует файлы библиотеки ARM Compute во время выполнения. Целевая плата не нуждается в файлах заголовков при генерации исполняемого файла и запуске исполняемого файла. Скопируйте библиотеку в нужный путь.
% system(['sshpass -p password scp -r ' fullfile(getenv('ARM_COMPUTELIB'),'lib') ' username@hostname:targetDir/']);
Скопируйте эти файлы на целевое оборудование ARM:
Файлы make Makefile_Inceptionv3
чтобы сгенерировать исполняемый файл из статической библиотеки.
Вход изображений inputimage.txt
которые необходимо классифицировать.
Текстовый файл synsetWords.tx
t, который содержит имена классов, возвращенные net.Layers(end).Classes
Основной файл оболочки main_inception_arm.cpp
который вызывает код, сгенерированный для inception_predict_arm
функция.
% system('sshpass -p password scp synsetWords.txt ./Makefile_Inceptionv3 ./inputimage.txt ./main_inception_arm.cpp username@hostname:targetDir/');
Скомпилируйте файл make на целевом компьютере, чтобы сгенерировать исполняемый файл из статической библиотеки. Этот make-файл связывает статическую библиотеку с основным файлом оболочки main_inception_arm.cpp
и генерирует исполняемый файл.
% system('sshpass -p password ssh username@hostname "make -C targetDir -f Makefile_Inceptionv3 arm_inceptionv3 "');
Запустите сгенерированный исполняемый файл в целевой системе. Убедитесь, что экспортируйте LD_LIBRARY_PATH, который указывает на файлы библиотеки ARM Compute, во время выполнения исполняемого файла.
% system('sshpass -p password ssh username@hostname "export LD_LIBRARY_PATH=targetDir/lib; cd targetDir;./inception_predict_arm.elf inputimage.txt out.txt"');
В этом подходе вы сначала скомпилируете сгенерированный код, чтобы создать исполняемый файл на хост-компьютер. Затем сгенерированный исполняемый файл, файлы библиотеки ARM Compute и другие вспомогательные файлы передаются на целевой компьютер. Наконец, исполняемый файл запускается на целевом компьютере.
Создайте объект строения генерации кода для генерации исполняемого файла. Установите целевой язык как C++.
cfg = coder.config('exe'); cfg.TargetLang = 'C++';
Присоедините объект строения глубокого обучения к объекту строения генерации кода.
cfg.DeepLearningConfig = dlcfg;
Объявить основной файл оболочки main_inception_arm.cpp
как пользовательский исходный файл.
cfg.CustomSource = 'main_inception_arm.cpp';
Сконфигурируйте набор инструментов кросс-компилятора на основе архитектуры ARM целевого устройства.
% cfg.Toolchain = 'Linaro AArch64 Linux v6.3.1'; % When the Arm Architecture is armv8, % cfg.Toolchain = 'Linaro AArch32 Linux v6.3.1';% When the Arm Architecture is armv7,
codegen
Используйте codegen
команда для генерации кода для функции точки входа, создания сгенерированного кода и создания исполняемого файла для целевой архитектуры ARM.
% codegen -config cfg inception_predict_arm -args {ones(299,299,3,'single')} -d arm_compute_cc_exe -report
Скопируйте сгенерированный исполняемый файл и файлы интервала на целевое оборудование ARM. В этом коде и других линиях кода линий которые следуют, замените:
пароль с вашим паролем
имя пользователя с именем пользователя
hostname с именем вашего устройства
targetDir
с целевой папкой для файлов
% system('sshpass -p password scp -r arm_compute_cc_exe/*.bin username@hostname:targetDir/'); % system('sshpass -p password scp inception_predict_arm.elf username@hostname:targetDir/');
Исполняемый файл использует файлы библиотеки ARM Compute во время выполнения. Он не использует заголовочные файлы во время выполнения. Скопируйте файлы библиотеки в нужный путь.
% system(['sshpass -p password scp -r ' fullfile(getenv('ARM_COMPUTELIB'),'lib') ' username@hostname:targetDir/']);
Скопируйте эти файлы на целевое оборудование ARM:
Вход изображений inputimage.txt
которые необходимо классифицировать.
Текстовый файл synsetWords.tx
t, который содержит имена классов, возвращенные net.Layers(end).Classes
Основной файл оболочки main_inception_arm.cpp
который вызывает код, сгенерированный для inception_predict_arm
функция.
% system('sshpass -p password scp synsetWords.txt ./inputimage.txt ./main_inception_arm.cpp username@hostname:targetDir/');
Запустите сгенерированный исполняемый файл в целевой системе. Убедитесь, что экспортируйте LD_LIBRARY_PATH, который указывает на файлы библиотеки ARM Compute, во время выполнения исполняемого файла.
% system('sshpass -p password ssh username@hostname "export LD_LIBRARY_PATH=targetDir/lib; cd targetDir;./inception_predict_arm.elf inputimage.txt out.txt"');
Скопируйте сгенерированный выход обратно в текущий Сеанс работы с MATLAB на хост-компьютер.
% system('sshpass -p password scp username@hostname:targetDir/out.txt ./');
Сопоставьте пять лучших счетов предсказания с соответствующими метками в обученной сети.
% outputImage = mapPredictionScores; % Display the overlayed Image with Classification Scores. % imshow(outputImage);
coder.ARMNEONConfig
(MATLAB Coder) | coder.DeepLearningConfig
(MATLAB Coder) | coder.hardware
(MATLAB Coder)