Этот пример показывает, как использовать cnncodegen
, чтобы сгенерировать код для приложения классификации Логотипов, которое использует глубоко изучение на процессорах ARM®. Приложение классификации логотипов использует сеть серии LogoNet
, чтобы выполнить распознавание логотипа от изображений. Сгенерированный код использует в своих интересах библиотеку ARM Compute для компьютерного зрения и машинного обучения.
Процессор ARM, который поддерживает расширение NEON.
Библиотека Компьютерного зрения С открытым исходным кодом (OpenCV) v3.1
Переменные окружения для библиотек ARM Compute и OpenCV
MATLAB® Coder™ для генерации Кода С++.
Интерфейс MATLAB CODER пакета поддержки для Глубокого Изучения.
Глубоко Изучая Toolbox™ для использования объекта SeriesNetwork
Для получения дополнительной информации смотрите Предпосылки для Глубокого Изучения с MATLAB CODER.
Этот пример поддержан на платформах Windows® и Linux®.
Загрузите предварительно обученную сеть 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 Вычисляет Библиотеку, сделан на компьютере разработчика хоста, но сборка и выполнение выполняются на целевой платформе путем копирования всех сгенерированных файлов в платформу. Целевая платформа должна поддержать Неоновую архитектуру системы команд (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
Лучшие пять прогнозов для входного файла изображения.
cnncodegen
| coder.DeepLearningConfig
| coder.loadDeepLearningNetwork