exponenta event banner

Создание кода для глубокого обучения по целям ARM

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

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

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

Предпосылки

  • Процессор ARM, поддерживающий расширение NEON

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

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

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

  • MATLAB ® Coder™

  • Пакет поддержки MATLAB Coder Interface для глубокого обучения

  • Глубокое обучение Toolbox™

Версия библиотеки вычислений ARM, используемая в этом примере, может не быть последней версией, поддерживаемой при создании кода. Поддерживаемые версии библиотек и сведения о настройке переменных среды см. в разделе Предварительные условия для глубокого обучения с помощью кодера MATLAB.

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

squeezenet_predict Функция

В этом примере используется сеть DAG SqueeeNet для отображения классификации изображений с помощью вычислительной библиотеки ARM. Предварительно обученный SqueeeNet для MATLAB доступен на панели инструментов Deep Learning Toolbox. squeezenet_predict функция загружает сеть SqueeEcNet в постоянный сетевой объект. При последующих вызовах функции постоянный объект используется повторно.

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 и не использующего пакет поддержки оборудования, создайте объект конфигурации для библиотеки. Не создавать объект конфигурации для исполняемой программы.

Настройте объект конфигурации для генерации кода C++ и только для генерации кода.

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;

Создание исходного кода C++ с помощью 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

  • Makefile для создания библиотеки, squeezenet_predict_rtw.mk

  • Makefile для построения исполняемой программы, makefile_squeezenet_arm_generic.mk

  • Словарь синсета, 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. ARM_ARCH переменная используется в Makefile для передачи флагов компилятора на основе архитектуры Arm. ARM_VER переменная используется в Makefile для компиляции кода на основе Arm Compute Version. Замените учетные данные оборудования и пути, как описано выше.

Выполните следующие действия для создания библиотеки из 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

См. также

| | |

Связанные темы