Предсказание глубокого обучения с ARM вычисляет Используя codegen

В этом примере показано, как использовать codegen сгенерировать код для приложения классификации Логотипов, которое использует глубокое обучение на процессорах ARM®. Приложение классификации логотипов использует LogoNet серийная сеть, чтобы выполнить распознавание логотипа от изображений. Сгенерированный код использует в своих интересах библиотеку ARM Compute для компьютерного зрения и машинного обучения.

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

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

  • Библиотека Компьютерного зрения С открытым исходным кодом (OpenCV) v3.1

  • Переменные окружения для библиотек ARM Compute и OpenCV

  • MATLAB® Coder™ для генерации Кода С++

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

  • Deep Learning Toolbox™ для использования SeriesNetwork объект

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

Этот пример поддерживается на Linux® и платформах Windows® и не поддерживаемый для MATLAB Online.

Получите предварительно обученный SeriesNetwork

Загрузите предварительно обученный LogoNet сеть и сохраняет его как logonet.mat, если это не существует. Сеть была разработана в MATLAB®, и его архитектура похожа на тот из AlexNet. Эта сеть может распознать 32 логотипа при различных условиях освещения и углах камеры.

net = getLogonet();

Сеть содержит 22 слоя включая свертку, полностью соединенную, и классификация выходные слои.

net.Layers
ans = 

  22×1 Layer array with layers:

     1   'imageinput'    Image Input             227×227×3 images with 'zerocenter' normalization and 'randfliplr' augmentations
     2   'conv_1'        Convolution             96 5×5×3 convolutions with stride [1  1] and padding [0  0  0  0]
     3   'relu_1'        ReLU                    ReLU
     4   'maxpool_1'     Max Pooling             3×3 max pooling with stride [2  2] and padding [0  0  0  0]
     5   'conv_2'        Convolution             128 3×3×96 convolutions with stride [1  1] and padding [0  0  0  0]
     6   'relu_2'        ReLU                    ReLU
     7   'maxpool_2'     Max Pooling             3×3 max pooling with stride [2  2] and padding [0  0  0  0]
     8   'conv_3'        Convolution             384 3×3×128 convolutions with stride [1  1] and padding [0  0  0  0]
     9   'relu_3'        ReLU                    ReLU
    10   'maxpool_3'     Max Pooling             3×3 max pooling with stride [2  2] and padding [0  0  0  0]
    11   'conv_4'        Convolution             128 3×3×384 convolutions with stride [2  2] and padding [0  0  0  0]
    12   'relu_4'        ReLU                    ReLU
    13   'maxpool_4'     Max Pooling             3×3 max pooling with stride [2  2] and padding [0  0  0  0]
    14   'fc_1'          Fully Connected         2048 fully connected layer
    15   'relu_5'        ReLU                    ReLU
    16   'dropout_1'     Dropout                 50% dropout
    17   'fc_2'          Fully Connected         2048 fully connected layer
    18   'relu_6'        ReLU                    ReLU
    19   'dropout_2'     Dropout                 50% dropout
    20   'fc_3'          Fully Connected         32 fully connected layer
    21   'softmax'       Softmax                 softmax
    22   'classoutput'   Classification Output   crossentropyex with 'adidas' and 31 other classes

Установите переменные окружения

На целевом компьютере ARM убедитесь, что ARM_COMPUTELIB установлен и что LD_LIBRARY_PATH содержит путь к папке ARM Compute Library.

Смотрите необходимые условия для глубокого обучения для MATLAB Coder (MATLAB Coder).

Функция logonet_predict

logonet_predict.m функция точки входа берет вход изображений и выполняет предсказание на изображении с помощью нейронной сети для глубокого обучения, сохраненной в LogoNet Matfile. Функция загружает сетевой объект от LogoNet.mat в персистентную сетевую переменную logonet. На последующих вызовах функции снова используется постоянный объект.

type logonet_predict
function out = logonet_predict(in)
%#codegen

% Copyright 2017-2020 The MathWorks, Inc.

persistent logonet;

if isempty(logonet)
    
    logonet = coder.loadDeepLearningNetwork('LogoNet.mat','logonet');
end

out = logonet.predict(in);

end

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

Когда вы генерируете код, предназначающийся для основанного на 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 logonet_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-файл из targer оборудования.

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

  • 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

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

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

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

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

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

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

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

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

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

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

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

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

if isunix, system('sshpass -p password scp logonet_predict_rtw.mk username@targetname:targetloc/arm_compute/'), end
if isunix, system('sshpass -p password scp coderdemo_google.png username@targetname:targetloc/arm_compute/'), end
if isunix, system('sshpass -p password scp makefile_arm_logo.mk username@targetname:targetloc/arm_compute/'), end
if isunix, system('sshpass -p password scp synsetWordsLogoDet.txt username@targetname:targetloc/arm_compute/'), end

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

if ispc, system('pscp.exe -pw password logonet_predict_rtw.mk username@targetname:targetloc/arm_compute/'), end
if ispc, system('pscp.exe -pw password coderdemo_google.png username@targetname:targetloc/arm_compute/'), end
if ispc, system('pscp.exe -pw password makefile_arm_logo.mk username@targetname:targetloc/arm_compute/'), end
if ispc, system('pscp.exe -pw password synsetWordsLogoDet.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_arm_logo.cpp username@targetname:targetloc/arm_compute/'), end
if isunix, system(['sshpass -p password ssh username@targetname "make -C targetloc/arm_compute/ -f logonet_predict_rtw.mk ARM_ARCH=' dlcfg.ArmArchitecture ' ARM_VER=' dlcfg.ArmComputeVersion ' "']), end

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

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

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

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

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

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

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

if ispc, system('plink.exe -l username -pw password targetname "make -C targetloc/arm_compute/ -f makefile_arm_logo.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/; ./logonet coderdemo_google.png"'), end
Run the executable from Windows using below command.
if ispc, system('plink.exe -l username -pw password targetname "cd targetloc/arm_compute/; ./logonet coderdemo_google.png"'), end
Top 5 Predictions:
-----------------------------
99.992% google
0.003% corona
0.003% singha
0.001% esso
0.000% fedex