В этом примере показано, как кросс-скомпилировать сгенерированный код глубокого обучения, чтобы создать библиотеку или исполняемый файл, и затем развернуть библиотеку или исполняемый файл на цели ARM®, такой как Hikey 960 или Рок 960. Этот пример использует codegen
команда.
Крест, компилирующий код глубокого обучения для целей ARM®, включает эти шаги:
Сконфигурируйте установленный набор инструментальных средств кросс-компилятора, чтобы выполнить компиляцию на хосте MATLAB®. Компиляция происходит, когда вы запускаете codegen
команда в MATLAB в хосте - компьютере.
Используйте codegen
команда, чтобы создать сгенерированный код и создать библиотеку или исполняемый файл на хосте - компьютере.
Скопируйте сгенерированную библиотеку или исполняемый файл и другие вспомогательные файлы к целевому компьютеру. Если вы генерируете библиотеку по хосту - компьютеру, компилируете скопированный make-файл на цели, чтобы создать исполняемый файл.
Запустите сгенерированный исполняемый файл на целевом оборудовании ARM.
Можно использовать этот рабочий процесс для любой цели Неона ARM, которая поддерживает систему команд Neon|SIMD. Этот пример поддерживается только для хоста платформы Linux®.
Процессор ARM, который поддерживает расширение Neon|SIMD
ARM Вычисляет Библиотеку (на хосте - компьютере)
MATLAB® Coder™
Интерфейс MATLAB Coder пакета поддержки для Глубокого обучения
Deep Learning Toolbox™
Пакет поддержки Модель Deep Learning Toolbox для Сети Inception-v3
Image Processing Toolbox™
Для развертывания на armv7 (Архитектура Руки на 32 бита) цель, GNU/GCC g++-arm-linux-gnueabihf
набор инструментальных средств
Для развертывания на armv8 (Архитектура Руки на 64 бита) цель, GNU/GCC g++-aarch64-linux-gnu
набор инструментальных средств
Переменные окружения для кросс-компиляторов и библиотек
Для получения информации о том, как установить набор инструментальных средств кросс-компилятора и настроить связанную переменную окружения, видит Код Глубокого обучения Кросс-компиляции, Который ARM Использования Вычисляют Библиотеку (MATLAB Coder). Для получения информации о поддерживаемых версиях библиотек и других переменных окружения, смотрите Необходимые условия для Глубокого обучения для MATLAB Coder (MATLAB Coder).
Строки кода в этом примере комментируются. Не прокомментируйте их, прежде чем вы запустите пример.
Этот пример в не поддерживаемый в MATLAB Online.
inception_predict_arm
Функция точки входаЭтот пример использует сеть классификации изображений Inception-v3. Предварительно обученная сеть Inception-V3 для MATLAB доступна в пакете поддержки Модель Deep Learning Toolbox для Сети Inception-v3. 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. В этой строке кода и других строках кода, которые следуют, замена:
пароль с вашим паролем
имя пользователя с вашим именем пользователя
имя узла с именем вашего устройства
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, который содержит ClassNames, возвращенный 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. В этой строке кода и других строках кода, которые следуют, замена:
пароль с вашим паролем
имя пользователя с вашим именем пользователя
имя узла с именем вашего устройства
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, который содержит ClassNames, возвращенный 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)