exponenta event banner

Прогнозирование глубокого обучения с помощью вычисления ARM codegen

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

Предпосылки

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

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

  • Переменные среды для вычислительных библиотек ARM и OpenCV

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

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

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

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

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

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

Загрузить предварительно подготовленное 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».

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

logonet_predict Функция

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

Настройте объект конфигурации для генерации кода 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 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

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

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

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

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

См. также

| |

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