Глубокое обучение с помощью ARM Compute с использованием codegen

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

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

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

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

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

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

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

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

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

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

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 Compute Library версии 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- файла из целевого компьютера.

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

  • 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 Architecture. ARM_VER переменная используется в Make-файле, чтобы скомпилировать код на основе версии Arm Compute. Замените аппаратные учетные данные и пути в этих командах, аналогичных предыдущему разделу.

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

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

Для просмотра документации необходимо авторизоваться на сайте