Глубоко изучение прогноза с ARM вычисляет

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

Предпосылки

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

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

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

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

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

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

Для получения дополнительной информации смотрите Предпосылки для Глубокого Изучения с MATLAB CODER.

Этот пример поддержан на платформах Windows® и Linux®.

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

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

net = getLogonet();

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

net.Layers
ans = 

  22x1 Layer array with layers:

     1   'imageinput'    Image Input             227x227x3 images with 'zerocenter' normalization and 'randfliplr' augmentations
     2   'conv_1'        Convolution             96 5x5x3 convolutions with stride [1  1] and padding [0  0  0  0]
     3   'relu_1'        ReLU                    ReLU
     4   'maxpool_1'     Max Pooling             3x3 max pooling with stride [2  2] and padding [0  0  0  0]
     5   'conv_2'        Convolution             128 3x3x96 convolutions with stride [1  1] and padding [0  0  0  0]
     6   'relu_2'        ReLU                    ReLU
     7   'maxpool_2'     Max Pooling             3x3 max pooling with stride [2  2] and padding [0  0  0  0]
     8   'conv_3'        Convolution             384 3x3x128 convolutions with stride [1  1] and padding [0  0  0  0]
     9   'relu_3'        ReLU                    ReLU
    10   'maxpool_3'     Max Pooling             3x3 max pooling with stride [2  2] and padding [0  0  0  0]
    11   'conv_4'        Convolution             128 3x3x384 convolutions with stride [2  2] and padding [0  0  0  0]
    12   'relu_4'        ReLU                    ReLU
    13   'maxpool_4'     Max Pooling             3x3 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 с помощью ARM Вычисляет Библиотеку, сделан на компьютере разработчика хоста, но сборка и выполнение выполняются на целевой платформе путем копирования всех сгенерированных файлов в платформу. Целевая платформа должна поддержать Неоновую архитектуру системы команд (ISA). Raspberry Pi3, Светлячок, HiKey являются некоторыми целевыми платформами, на которых может быть выполнен сгенерированный код. Используйте команду cnncodegen, чтобы сгенерировать код для платформы ARM при помощи опции 'arm-compute'.

cnncodegen(net,'targetlib','arm-compute');

Описание сгенерированного кода

SeriesNetwork сгенерирован как класс C++, содержащий массив 22 классов уровня. Настройка () метод класса настраивает указатели и выделяет память для каждого расположенного на слое объекта. Предсказывание () метод вызывает прогноз для каждого из этих 22 уровней в сети. Постнастройка () функция делает выделение буферов для каждого уровня. Эти буферы используются ARM, Вычисляют Библиотеку во время вывода. Файлы cnn_CnnMain_Conv_*_w и cnn_CnnMain_Conv_*_b в папке codegen являются бинарными весами и смещают файлы для уровней свертки в сети. Файлы cnn_CnnMain_fc_*_w и cnn_CnnMain_fc_*_b являются бинарными весами и смещают файлы для полностью связанных уровней в сети. cnnbuild_rtw.mk является сгенерированный Make-файл, и cnnbuild получен после создания этого Make-файла.

  class CnnMain
  {
    public:
      int32_T batchSize;
      int32_T numLayers;
      real32_T *inputData;
      real32_T *outputData;
      MWCNNLayer *layers[22];
    private:
      MWTargetNetworkImpl *targetImpl;
    public:
      CnnMain();
      void presetup();
      void postsetup();
      void setup();
      void predict();
      void cleanup();
      ~CnnMain();
 };

Создайте и выполнитесь

Переместите codegen папку и все желаемые файлы от компьютера разработчика хоста до целевой платформы с помощью команды scp с форматом, system('sshpass -p [password] scp (sourcefile) [username]@[hostname]:~/');

Например, чтобы передать файлы Raspberry Pi

system('sshpass -p alarm scp main_arm_logo.cpp alarm@alarmpi:~/');
system('sshpass -p alarm scp coderdemo_google.png alarm@alarmpi:~/');
system('sshpass -p alarm scp makefile_arm_logo alarm@alarmpi:~/');
system('sshpass -p alarm scp synsetWords.txt alarm@alarmpi:~/');
system('sshpass -p alarm scp -r codegen alarm@alarmpi:/home/alarm');

Чтобы создать lib на целевой платформе, используйте команду с форматом, system('sshpass -p [password] ssh [username]@[hostname] "make -C /home/$(username)/codegen -f cnnbuild_rtw.mk"');

Например, на Raspberry Pi

system('sshpass -p alarm ssh alarm@alarmpi "make -C /home/alarm/codegen -f cnnbuild_rtw.mk"');

Установите переменную окружения ARM_COMPUTELIB на целевой платформе, указывающей на ARM, вычисляют путь к установке библиотеки. Используйте команду с форматом, export ARM_COMPUTELIB=${DESTINATION_PATH}

Например, на Raspberry Pi

export ARM_COMPUTELIB=${HOME}/ComputeLibrary

Точно так же установите TARGET_OPENCV_DIR на целевой платформе.

export TARGET_OPENCV_DIR=/usr

Чтобы создать и запустить exe на целевой платформе, используйте команду с форматом, make -C /home/$(username) и ./execfile -f makefile_arm_logo

Например, на Raspberry Pi

make -C /home/alarm arm_neon -f makefile_arm_logo

Запустите исполняемый файл с входным файлом изображения.

./logo_recognition_exe coderdemo_google.png

Лучшие пять прогнозов для входного файла изображения.

Смотрите также

| |

Похожие темы

Была ли эта тема полезной?