Генерация кода для глубокого обучения на целях ARM

В этом примере показано, как сгенерировать и развернуть код для предсказания на устройстве ARM®-based, не используя пакет аппаратной поддержки.

Когда вы генерируете код для предсказания с помощью ARM, Вычисляют Библиотеку и пакет аппаратной поддержки, codegen генерирует код по хосту - компьютеру, копирует сгенерированные файлы в целевой компьютер и создает исполняемый файл на целевом компьютере. Без пакета аппаратной поддержки, codegen генерирует код по хосту - компьютеру. Вы должны команды выполнения, чтобы скопировать файлы и создать исполняемую программу на целевом компьютере.

Этот пример использует packNGo функционируйте, чтобы группировать все соответствующие файлы в сжатый zip-файл. Используйте этот пример, чтобы изучить, как развернуть сгенерированный код на целях Неона ARM, которые не имеют пакета аппаратной поддержки при помощи packNGo.

Необходимые условия

  • Процессор ARM, который поддерживает расширение NEON

  • ARM Вычисляет Библиотеку (на целевом оборудовании ARM)

  • Библиотека компьютерного зрения с открытым исходным кодом (открытый CV)

  • Переменные окружения для компиляторов и библиотек

  • MATLAB® Coder™

  • Интерфейс MATLAB Coder пакета поддержки для Глубокого обучения

  • Deep Learning Toolbox™

Версия библиотеки ARM Compute, что этим примером использование не может быть последняя версия та генерация кода поддержки. Для поддерживаемых версий библиотек и для получения информации о подготовке переменных окружения, смотрите Необходимые условия для Глубокого обучения для MATLAB Coder (MATLAB Coder).

Этот пример не поддерживается для MATLAB Online.

Функция squeezenet_predict

Этот пример использует сеть DAG SqueezeNet, чтобы показать, что классификация изображений с ARM Вычисляет Библиотеку. Предварительно обученный SqueezeNet для MATLAB доступен в Deep Learning Toolbox. 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 DAG 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/Rock960 с архитектурой ARMv8, и ARM Вычисляют версию 19.05 Библиотеки.

dlcfg = coder.DeepLearningConfig('arm-compute');
dlcfg.ArmComputeVersion = '19.05';
dlcfg.ArmArchitecture = 'armv8';

Присоедините объект настройки глубокого обучения к объекту настройки генерации кода

Установите DeepLearningConfig свойство настройки генерации кода возражает против объекта настройки глубокого обучения.

cfg.DeepLearningConfig = dlcfg;

Сгенерируйте исходный код С++ при помощи codegen

codegen -config cfg squeezenet_predict -args {ones(227, 227, 3, 'single')} -d arm_compute

Код сгенерирован в arm_compute папке в текущей рабочей папке на хосте - компьютере.

Сгенерируйте zip-файл с помощью packNGo функция

Пакеты функции packNGo все соответствующие файлы в сжатом zip-файле.

zipFileName = 'arm_compute.zip';
bInfo = load(fullfile('arm_compute','buildInfo.mat'));
packNGo(bInfo.buildInfo, {'fileName', zipFileName,'minimalHeaders', false, 'ignoreFileMissing',true});

Код сгенерирован как zip-файл.

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

Скопируйте zip-файл и извлечение в папку и удалите zip-файл в оборудовании

В следующих командах, замене:

  • password с вашим паролем

  • username с вашим именем пользователя

  • targetname с именем вашего устройства

  • targetloc с папкой назначения для файлов

Выполните шаги ниже, чтобы скопировать и извлечь zip-файл из Linux.

if isunix, system(['sshpass -p password scp -r '  fullfile(pwd,zipFileName) ' username@targetname:targetloc/']), end
if isunix, system('sshpass -p password ssh username@targetname "if [ -d targetloc/arm_compute ]; then rm -rf targetloc/arm_compute; fi"'), end
if isunix, system(['sshpass -p password ssh username@targetname "unzip targetloc/' zipFileName ' -d targetloc/arm_compute"']), end
if isunix, system(['sshpass -p password ssh username@targetname "rm -rf  targetloc' zipFileName '"']), end

Выполните шаги ниже, чтобы скопировать и извлечь zip-файл из Windows.

if ispc, system(['pscp.exe -pw password -r '  fullfile(pwd,zipFileName) ' username@targetname:targetloc/']), end
if ispc, system('plink.exe -l username -pw password targetname "if [ -d targetloc/arm_compute ]; then rm -rf targetloc/arm_compute; fi"'), end
if ispc, system(['plink.exe -l username -pw password targetname "unzip targetloc/' zipFileName ' -d targetloc/arm_compute"']), end
if ispc, system(['plink.exe -l username -pw password targetname "rm -rf  targetloc' zipFileName '"']), end

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

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

  • Введите изображение, coffeemug.png

  • Make-файл для генерации библиотеки, squeezenet_predict_rtw.mk

  • Make-файл для создания исполняемой программы, makefile_squeezenet_arm_generic.mk

  • Словарь Synset, synsetWords.txt

В следующих командах, замене:

  • password с вашим паролем

  • username с вашим именем пользователя

  • targetname с именем вашего устройства

  • targetloc с папкой назначения для файлов

Выполните шаги ниже, чтобы скопировать все необходимые файлы при выполнении из Linux

if isunix, system('sshpass -p password scp squeezenet_predict_rtw.mk username@targetname:targetloc/arm_compute/'), end
if isunix, system('sshpass -p password scp coffeemug.png username@targetname:targetloc/arm_compute/'), end
if isunix, system('sshpass -p password scp makefile_squeezenet_arm_generic.mk username@targetname:targetloc/arm_compute/'), end
if isunix, system('sshpass -p password scp synsetWords.txt username@targetname:targetloc/arm_compute/'), end

Выполните шаги ниже, чтобы скопировать все необходимые файлы при выполнении от Windows

if ispc, system('pscp.exe -pw password squeezenet_predict_rtw.mk username@targetname:targetloc/arm_compute/'), end
if ispc, system('pscp.exe -pw password coffeemug.png username@targetname:targetloc/arm_compute/'), end
if ispc, system('pscp.exe -pw password makefile_squeezenet_arm_generic.mk username@targetname:targetloc/arm_compute/'), end
if ispc, system('pscp.exe -pw password synsetWords.txt username@targetname:targetloc/arm_compute/'), end

Создайте библиотеку по целевому компьютеру

Чтобы создать библиотеку по целевому компьютеру, выполните сгенерированный make-файл на оборудовании ARM.

Убедитесь, что вы устанавливаете переменные окружения ARM_COMPUTELIB и LD_LIBRARY_PATH на целевом компьютере. Смотрите Необходимые условия для Глубокого обучения для MATLAB Coder (MATLAB Coder). Переменная ARM_ARCH используется в Make-файле, чтобы передать флаги компилятора на основе Архитектуры Руки. Переменная ARM_VER используется в Make-файле, чтобы скомпилировать код на основе Руки, Вычисляют Версию. Замените аппаратные учетные данные и пути в похожем на перечисленные выше шаги.

Выполните ниже шагов, чтобы создать библиотеку из Linux.

if isunix, system('sshpass -p password scp main_squeezenet_arm_generic.cpp username@targetname:targetloc/arm_compute/'), end
if isunix, system(['sshpass -p password ssh username@targetname "make -C targetloc/arm_compute/ -f squeezenet_predict_rtw.mk ARM_ARCH=' dlcfg.ArmArchitecture ' ARM_VER=' dlcfg.ArmComputeVersion ' "']), end

Выполните ниже шагов, чтобы создать библиотеку из окон.

if ispc, system('pscp.exe -pw password main_squeezenet_arm_generic.cpp username@targetname:targetloc/arm_compute/'), end
if ispc, system(['plink.exe -l username -pw password targetname "make -C targetloc/arm_compute/ -f squeezenet_predict_rtw.mk ARM_ARCH=' dlcfg.ArmArchitecture ' ARM_VER=' dlcfg.ArmComputeVersion ' "']), end

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

Создайте библиотеку с источником основной файл обертки, чтобы создать исполняемый файл. main_squeezenet_arm_generic.cpp C++ основной файл обертки, который вызывает функцию squeezenet_predict, чтобы создать исполняемый файл.

Запуститесь ниже команды, чтобы создать исполняемый файл из Linux.

if isunix, system('sshpass -p password ssh username@targetname "make -C targetloc/arm_compute/ -f makefile_squeezenet_arm_generic.mk targetDirName=targetloc/arm_compute"'), end

Запуститесь ниже команды, чтобы создать исполняемый файл из Windows.

if ispc, system('plink.exe -l username -pw password targetname "make -C targetloc/arm_compute/ -f makefile_squeezenet_arm_generic.mk targetDirName=targetloc/arm_compute"'), end

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

Run the executable from Linux using below command.
if isunix, system('sshpass -p password ssh username@targetname "cd targetloc/arm_compute/; ./squeezenet coffeemug.png"'), end
Run the executable from Windows using below command.
if ispc, system('plink.exe -l username -pw password targetname "cd targetloc/arm_compute/; ./squeezenet coffeemug.png"'), end
Top 5 Predictions:
-----------------------------
88.299% coffee mug
7.309% cup
1.098% candle
0.634% paper towel
0.591% water jug