Перекрестный код глубокого обучения компиляции для целей неона ARM

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

Используйте 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 вычисляет файлы библиотеки к целевому компьютеру

Исполняемый файл использует файлы библиотеки ARM Compute во время времени выполнения. Требуемой плате не нужны заголовочные файлы при генерации исполняемого файла и выполнении исполняемого файла. Скопируйте библиотеку в желаемый путь.

% system(['sshpass -p password scp -r ' fullfile(getenv('ARM_COMPUTELIB'),'lib') ' username@hostname:targetDir/']);

Скопируйте вспомогательные файлы в целевой компьютер

Скопируйте эти файлы в целевое оборудование ARM:

  • Make-файл Makefile_Inceptionv3 сгенерировать исполняемый файл от статической библиотеки.

  • Введите отображают inputimage.txt то, что вы хотите классифицировать.

  • Текстовый файл synsetWords.txt, который содержит 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 вычисляет файлы библиотеки к целевому компьютеру

Исполняемый файл использует файлы библиотеки ARM Compute во время времени выполнения. Это не использует заголовочные файлы во времени выполнения. Скопируйте файлы библиотеки в желаемый путь.

% system(['sshpass -p password scp -r ' fullfile(getenv('ARM_COMPUTELIB'),'lib') ' username@hostname:targetDir/']);

Скопируйте вспомогательные файлы в целевой компьютер

Скопируйте эти файлы в целевое оборудование ARM:

  • Введите отображают inputimage.txt то, что вы хотите классифицировать.

  • Текстовый файл synsetWords.txt, который содержит 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

Скопируйте сгенерированный выход назад в текущий сеанс работы с MATLAB на хосте - компьютере.

% system('sshpass -p password scp username@hostname:targetDir/out.txt ./');

Сопоставьте баллы предсказания с метками

Сопоставьте лучшие пять баллов предсказания с соответствующими метками в обучившем сеть.

% outputImage = mapPredictionScores;

% Display the overlayed Image with Classification Scores.  

% imshow(outputImage);

Смотрите также

(MATLAB Coder) | (MATLAB Coder) | (MATLAB Coder)

Похожие темы