В этом примере показано, как сгенерировать и развернуть Код С++, который использует предварительно обученную сеть MobileNet-v2 для объектного предсказания.
Процессор ARM, который поддерживает расширение NEON
ARM Вычисляет Библиотеку (на целевом оборудовании ARM)
Библиотека Компьютерного зрения С открытым исходным кодом (OpenCV) v2.4 (на целевом оборудовании ARM)
Переменные окружения для компиляторов и библиотек
MATLAB® Coder™
Интерфейс MATLAB Coder для Библиотек Глубокого обучения поддерживает пакет
Deep Learning Toolbox™
Модель Deep Learning Toolbox для пакета Сетевой поддержки MobileNet-v2
Image Processing Toolbox™
Пакет поддержки MATLAB для оборудования Raspberry Pi
Для поддерживаемых версий библиотек и для получения информации о подготовке переменных окружения, смотрите Необходимые условия для Глубокого обучения для MATLAB Coder. Этот пример не поддерживается для MATLAB онлайн.
Этот пример использует сеть DAG MobileNet-v2, чтобы выполнить классификацию изображений с Библиотекой ARM® Compute. Предварительно обученная сеть MobileNet-v2 для MATLAB доступна в Модели Deep Learning Toolbox для пакета Сетевой поддержки MobileNet-v2.
Когда вы генерируете код, который использует ARM, Вычисляют Библиотеку и пакет аппаратной поддержки, codegen
генерирует код по хосту - компьютеру, копирует сгенерированные файлы в целевой компьютер и создает исполняемый файл на целевом компьютере.
mobilenet_predict
Функцияmobilenet_predict
вызовы функции предсказать метод сетевого объекта MobileNet-v2 на входе отображает, и возвращает счет предсказания выход. Вызовы функции coder.updateBuildInfo
задавать соединение опций для сгенерированного make-файла.
type mobilenet_predict
function out = mobilenet_predict(in) persistent net; opencv_linkflags = '`pkg-config --cflags --libs opencv`'; coder.updateBuildInfo('addLinkFlags',opencv_linkflags); if isempty(net) net = coder.loadDeepLearningNetwork('mobilenetv2', 'mobilenet'); end out = net.predict(in); end
Создайте объект настройки генерации Кода С++.
cfg = coder.config('exe'); cfg.TargetLang = 'C++';
Укажите, что Использование ARM Вычисляет Библиотеку. ARM Вычисляет Библиотеку, обеспечивает оптимизированную функциональность для оборудования Raspberry Pi. Чтобы сгенерировать код, который использует ARM, Вычисляют Библиотеку, создают coder.ARMNEONConfig
объект. Укажите, что версия ARM Вычисляет Библиотеку, установленную на вашем Raspberry Pi и архитектуре Raspberry Pi. Присоедините объект настройки глубокого обучения к объекту настройки генерации кода.
dlcfg = coder.DeepLearningConfig('arm-compute'); supportedVersions = dlcfg.getARMComputeSupportedVersions; dlcfg.ArmArchitecture = 'armv7'; dlcfg.ArmComputeVersion = '19.05'; cfg.DeepLearningConfig = dlcfg;
Используйте Пакет Поддержки MATLAB для Аппаратной функции Raspberry Pi raspi
создать связь с Raspberry Pi. В этом коде, замене:
raspiname
с именем хоста вашего Raspberry Pi
username
с вашим именем пользователя
password
с вашим паролем
r = raspi('raspiname','username','password');
Создайте coder.Hardware
объект для Raspberry Pi и присоединения это к объекту настройки генерации кода.
hw = coder.hardware('Raspberry Pi');
cfg.Hardware = hw;
Задайте папку сборки на Raspberry Pi:
buildDir = '~/remoteBuildDir';
cfg.Hardware.BuildDir = buildDir;
Задайте основной файл main_mobilenet.cpp
в объекте настройки генерации кода. Файл вызывает сгенерированный Код С++ для mobilenet_predict
функция. Файл читает входное изображение, передает данные сгенерированным вызовам функции, получает предсказания на изображении и распечатывает баллы предсказания к файлу.
cfg.CustomSource = 'main_mobilenet.cpp';
Сгенерируйте Код С++. Когда вы используете codegen
с Пакетом Поддержки MATLAB для Оборудования Raspberry Pi исполняемый файл основан на Raspberry Pi.
Для генерации кода необходимо установить Переменные окружения ARM_COMPUTELIB
и LD_LIBRARY_PATH
на Raspberry Pi.
codegen -config cfg mobilenet_predict -args {ones(224, 224, 3,'single')} -report
Чтобы протестировать сгенерированный код на Raspberry Pi, скопируйте входное изображение в папку сгенерированного кода. Можно найти эту папку вручную или при помощи raspi.utils.getRemoteBuildDirectory
API. Эта функция перечисляет папки двоичных файлов, которые сгенерированы при помощи codegen
. Предположение, что двоичный файл найден только в одной папке, введите:
applicationDirPaths = raspi.utils.getRemoteBuildDirectory('applicationName','mobilenet_predict'); targetDirPath = applicationDirPaths{1}.directory;
Чтобы скопировать файлы, требуемые запускать исполняемую программу, используйте putFile
.
r.putFile('peppers_raspi_mobilenet.png',targetDirPath);
Запустите исполняемую программу на Raspberry Pi из MATLAB и направьте выход назад к MATLAB.
exeName = 'mobilenet_predict.elf'; argsforexe = ' peppers_raspi_mobilenet.png '; % Provide the input image; command = ['cd ' targetDirPath ';sudo ./' exeName argsforexe]; output = system(r,command);
outputfile = [targetDirPath, '/output.txt'];
r.getFile(outputfile);
Сопоставьте лучшие пять баллов предсказания с соответствующими метками в обучившем сеть, и отобразите вывод.
type mapPredictedScores_mobilenet
%% Map the Prediction Scores to Labels and Display Output net = mobilenetv2; ClassNames = net.Layers(end).ClassNames; %% Read the classification fid = fopen('output.txt') ; S = textscan(fid,'%s'); fclose(fid) ; S = S{1} ; predict_scores = cellfun(@(x)str2double(x), S); %% Remove NaN values that were strings predict_scores(isnan(predict_scores))=[]; [val,indx] = sort(predict_scores, 'descend'); scores = val(1:5)*100; top5labels = ClassNames(indx(1:5)); %% Display classification labels on the image im = imread('peppers_raspi_mobilenet.png'); im = imresize(im, [224 224]); outputImage = zeros(224,400,3, 'uint8'); for k = 1:3 outputImage(:,177:end,k) = im(:,:,k); end scol = 1; srow = 1; outputImage = insertText(outputImage, [scol, srow], 'Classification with MobileNetv2', 'TextColor', 'w','FontSize',20, 'BoxColor', 'black'); srow = srow + 30; for k = 1:5 outputImage = insertText(outputImage, [scol, srow], [top5labels{k},' ',num2str(scores(k), '%2.2f'),'%'], 'TextColor', 'w','FontSize',15, 'BoxColor', 'black'); srow = srow + 25; end imshow(outputImage);
coder.ARMNEONConfig
| coder.DeepLearningConfig
| coder.hardware