В этом примере показано, как выполнить перекрестную компиляцию созданного кода глубокого обучения для создания библиотеки или исполняемого файла, а затем развернуть библиотеку или исполняемый файл на цели ARM ®, такой как Hikey 960 или Rock 960. В этом примере используется codegen команда.
Перекрестная компиляция кода глубокого обучения для целей ARM ® включает следующие шаги:
Настройте установленную цепочку инструментов кросс-компилятора для выполнения компиляции на сервере MATLAB ®. Компиляция происходит при запуске codegen в MATLAB на хост-компьютере.
Используйте codegen для создания созданного кода и библиотеки или исполняемого файла на хост-компьютере.
Скопируйте созданную библиотеку или исполняемые и другие вспомогательные файлы на целевое оборудование. При создании библиотеки на хост-компьютере скомпилируйте скопированный make-файл на целевом компьютере для создания исполняемого файла.
Запустите созданный исполняемый файл на целевом оборудовании ARM.
Этот рабочий процесс можно использовать для любого целевого объекта ARM Neon, поддерживающего набор инструкций Neon 'SIMD. Этот пример поддерживается только для серверных платформ Linux ® .
Процессор ARM, поддерживающий расширение Neon 'SIMD
Вычислительная библиотека ARM (на хост-компьютере)
MATLAB ® Coder™
Пакет поддержки MATLAB Coder Interface для глубокого обучения
Глубокое обучение Toolbox™
Пакет поддержки Deep Learning Toolbox Model для Inception-v3 сети
Toolbox™ обработки изображений
Для развертывания на цели armv7 (32-разрядная архитектура Arm), GNU/GCC g++-arm-linux-gnueabihf toolchain
Для развертывания на цели armv8 (64-разрядная архитектура Arm), GNU/GCC g++-aarch64-linux-gnu toolchain
Переменные среды для перекрестных компиляторов и библиотек
Сведения об установке цепочки инструментов кросс-компилятора и настройке связанной переменной среды см. в разделе Cross-Compile Deep Learning Code That Uses ARM Compute Library.
Версия библиотеки вычислений ARM, используемая в этом примере, может не быть последней версией, поддерживаемой при создании кода. Сведения о поддерживаемых версиях библиотек и переменных среды см. в разделе Предварительные условия для глубокого обучения с помощью кодера MATLAB.
Строки кода в этом примере комментируются. Раскомментируйте их перед запуском примера.
Этот пример в не поддерживается в MATLAB Online.
inception_predict_arm Функция точки входаВ этом примере используется сеть классификации изображений Inception-V3. Предварительно подготовленная Inception-V3 сеть для MATLAB доступна в пакете поддержки Deep Learning Toolbox Model for Inception-V3 Network. inception_predict_arm функция точки входа загружает Inception-V3 сеть в постоянный сетевой объект. При последующих вызовах функции постоянный объект используется повторно.
type inception_predict_armfunction out = inception_predict_arm(in)
persistent net;
if isempty(net)
net = coder.loadDeepLearningNetwork('inceptionv3','inceptionv3');
end
out = net.predict(in);
end
Создать coder.ARMNEONConfig объект. Укажите версию библиотеки вычислений ARM.
dlcfg = coder.DeepLearningConfig('arm-compute'); dlcfg.ArmComputeVersion = '19.05';
Для классификации входного изображения peppers.png, преобразовать изображение в текстовый файл.
% generateImagetoTxt('peppers.png');В этом подходе сначала выполняется перекрестная компиляция созданного кода для создания статической библиотеки на хост-компьютере. Затем созданная статическая библиотека, файлы библиотеки вычисления ARM, 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 во время выполнения. Целевая плата не нуждается в файлах заголовков при создании исполняемого файла и запуске исполняемого файла. Скопируйте библиотеку по нужному пути.
% system(['sshpass -p password scp -r ' fullfile(getenv('ARM_COMPUTELIB'),'lib') ' username@hostname:targetDir/']);Скопируйте эти файлы на целевое оборудование ARM:
Makefile Makefile_Inceptionv3 для создания исполняемого файла из статической библиотеки.
Входное изображение inputimage.txt которые вы хотите классифицировать.
Текстовый файл synsetWords.txt, который содержит имена классов, возвращенные 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-файл на целевом объекте для создания исполняемого файла из статической библиотеки. Этот makefile связывает статическую библиотеку с основным файлом оболочки main_inception_arm.cpp и генерирует исполняемый файл.
% system('sshpass -p password ssh username@hostname "make -C targetDir -f Makefile_Inceptionv3 arm_inceptionv3 "');Запустите созданный исполняемый файл на целевом компьютере. Во время работы с исполняемым файлом необходимо экспортировать LD_LIBRARY_PATH, указывающие на файлы библиотеки вычислений ARM.
% system('sshpass -p password ssh username@hostname "export LD_LIBRARY_PATH=targetDir/lib; cd targetDir;./inception_predict_arm.elf inputimage.txt out.txt"');В этом подходе сначала выполняется перекрестная компиляция созданного кода для создания исполняемого файла на хост-компьютере. Затем созданный исполняемый файл, файлы библиотеки вычислений ARM и другие вспомогательные файлы переносятся на целевое оборудование. Наконец, выполняется исполняемый файл на целевом оборудовании.
Создание объекта конфигурации создания кода для создания исполняемого файла. Установите целевой язык как 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Скопируйте созданный исполняемый файл и файлы bin на целевое оборудование 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 во время выполнения. Он не использует файлы заголовков во время выполнения. Скопируйте файлы библиотеки по нужному пути.
% system(['sshpass -p password scp -r ' fullfile(getenv('ARM_COMPUTELIB'),'lib') ' username@hostname:targetDir/']);Скопируйте эти файлы на целевое оборудование ARM:
Входное изображение inputimage.txt которые вы хотите классифицировать.
Текстовый файл synsetWords.txt, который содержит имена классов, возвращенные 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.
% 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 | coder.DeepLearningConfig | coder.hardware