Генерация кода и развертывание сети MobileNet-v2 к Raspberry Pi

В этом примере показано, как сгенерировать и развернуть Код С++, который использует предварительно обученную сеть 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

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

Создайте связь с Raspberry Pi

Используйте Пакет поддержки MATLAB для Аппаратной функции Raspberry Pi raspi создать связь с Raspberry Pi. В этом коде, замене:

  • raspiname с именем хоста вашего Raspberry Pi

  • username с вашим именем пользователя

  • password с вашим паролем

r = raspi('raspiname','username','password');

Сконфигурируйте аппаратные параметры генерации кода для Raspberry Pi

Создайте coder.Hardware объект для Raspberry Pi и присоединения это к объекту настройки генерации кода.

hw = coder.hardware('Raspberry Pi');
cfg.Hardware = hw;

Задайте папку сборки на Raspberry Pi:

buildDir = '~/remoteBuildDir';
cfg.Hardware.BuildDir = buildDir;

Предоставьте C++ основной файл

Задайте основной файл main_mobilenet.cpp в объекте настройки генерации кода. Файл вызывает сгенерированный Код С++ для mobilenet_predict функция. Файл читает входное изображение, передает данные сгенерированным вызовам функции, получает предсказания на изображении и распечатывает баллы предсказания к файлу.

cfg.CustomSource = 'main_mobilenet.cpp';

Сгенерируйте исполняемую программу на Raspberry Pi

Сгенерируйте Код С++. Когда вы используете 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;

Скопируйте файлы в качестве примера в Raspberry Pi

Чтобы скопировать файлы, требуемые запускать исполняемую программу, используйте putFile.

r.putFile('peppers_raspi_mobilenet.png',targetDirPath);

Запустите исполняемую программу на Raspberry Pi

Запустите исполняемую программу на 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);

Получите музыку предсказания к 1 000 выходных классов сети

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);

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

| |

Похожие темы