Этот пример показывает генерацию кода для приложения классификации логотипов что глубокое обучение использования. Это использует codegen
команда, чтобы сгенерировать MEX-функцию, которая выполняет прогноз на SeriesNetwork
возразите названному LogoNet.
CUDA® включил NVIDIA®, графический процессор с вычисляет возможность 3.2 или выше.
NVIDIA инструментарий CUDA и драйвер.
Библиотека NVIDIA cuDNN.
Переменные окружения для компиляторов и библиотек. Для получения информации о поддерживаемых версиях компиляторов и библиотек, смотрите Сторонние продукты. Для подготовки переменных окружения смотрите Подготовку Необходимых как условие продуктов.
Интерфейс GPU Coder для Библиотек Глубокого обучения поддерживает пакет. Чтобы установить этот пакет поддержки, используйте Add-On Explorer.
Используйте coder.checkGpuInstall
функция, чтобы проверить, что компиляторы и библиотеки, необходимые для выполнения этого примера, настраиваются правильно.
envCfg = coder.gpuEnvConfig('host'); envCfg.DeepLibTarget = 'cudnn'; envCfg.DeepCodegen = 1; envCfg.Quiet = 1; coder.checkGpuInstall(envCfg);
Логотипы помогают пользователям в идентификации бренда и распознавании. Многие компании включают свои логотипы в рекламу, материалы документации и продвижения. Сеть распознавания логотипа (logonet) была разработана в MATLAB® и может распознать 32 логотипа при различных условиях освещения и движениях камеры. Поскольку эта сеть фокусируется только на распознавании, можно использовать его в приложениях, где локализация не требуется.
Сеть обучена в MATLAB при помощи обучающих данных, который содержит приблизительно 200 изображений для каждого логотипа. Поскольку количество изображений для того, чтобы обучить сеть мало, увеличение данных увеличивает число учебных выборок. Используются четыре типа увеличения данных: контрастная нормализация, гауссова размытость, случайное зеркальное отражение и сдвиг. Это увеличение данных помогает в распознавании логотипов в изображениях, полученных различными условиями освещения и движениями камеры. Входной размер для logonet [227 227 3]. Стандартный SGDM обучается при помощи темпа обучения 0,0001 в течение 40 эпох с мини-пакетным размером 45. trainLogonet.m скрипт помощника демонстрирует увеличение данных на демонстрационном изображении, архитектуре logonet и опциях обучения.
Загрузите logonet сеть и сохраните ее в LogoNet.mat
.
getLogonet();
Сохраненная сеть содержит 22 слоя включая свертку, полностью соединенную, и классификация выходные слои.
load('LogoNet.mat');
convnet.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
logonet_predict
Функция точки входаlogonet_predict.m функция точки входа берет вход изображений и выполняет прогноз на изображении с помощью нейронной сети для глубокого обучения, сохраненной в LogoNet.mat
файл. Функция загружает сетевой объект от LogoNet.mat
в персистентную переменную logonet и повторные использования персистентная переменная на последующих вызовах прогноза.
type('logonet_predict.m')
function out = logonet_predict(in) %#codegen % Copyright 2017-2019 The MathWorks, Inc. persistent logonet; if isempty(logonet) logonet = coder.loadDeepLearningNetwork('LogoNet.mat','logonet'); end out = logonet.predict(in); end
logonet_predict
ФункцияСоздайте объект настройки графического процессора для цели MEX и установите выходной язык на C++. Используйте coder.DeepLearningConfig
функция, чтобы создать CuDNN
объект настройки глубокого обучения и присвоение это к DeepLearningConfig
свойство объекта настройки графического процессора кода. Чтобы сгенерировать MEX CUDA, используйте codegen
команда и задает вход, чтобы иметь размер [227,227,3]. Это значение соответствует входному размеру слоя logonet сети.
cfg = coder.gpuConfig('mex'); cfg.TargetLang = 'C++'; cfg.DeepLearningConfig = coder.DeepLearningConfig('cudnn'); codegen -config cfg logonet_predict -args {ones(227,227,3,'uint8')} -report
Code generation successful: To view the report, open('codegen/mex/logonet_predict/html/report.mldatx').
Загрузите входное изображение. Вызовите logonet_predict_mex
на входном изображении.
im = imread('test.png');
imshow(im);
im = imresize(im, [227,227]);
predict_scores = logonet_predict_mex(im);
Сопоставьте лучшие пять баллов прогноза со словами в словаре Wordnet synset (логотипы).
synsetOut = {'adidas', 'aldi', 'apple', 'becks', 'bmw', 'carlsberg', ... 'chimay', 'cocacola', 'corona', 'dhl', 'erdinger', 'esso', 'fedex',... 'ferrari', 'ford', 'fosters', 'google', 'guinness', 'heineken', 'hp',... 'milka', 'nvidia', 'paulaner', 'pepsi', 'rittersport', 'shell', 'singha', 'starbucks', 'stellaartois', 'texaco', 'tsingtao', 'ups'}; [val,indx] = sort(predict_scores, 'descend'); scores = val(1:5)*100; top5labels = synsetOut(indx(1:5));
Отобразите лучшие пять меток классификации.
outputImage = zeros(227,400,3, 'uint8'); for k = 1:3 outputImage(:,174:end,k) = im(:,:,k); end scol = 1; srow = 20; for k = 1:5 outputImage = insertText(outputImage, [scol, srow], [top5labels{k},' ',num2str(scores(k), '%2.2f'),'%'], 'TextColor', 'w','FontSize',15, 'BoxColor', 'black'); srow = srow + 20; end imshow(outputImage);
Очистите статический сетевой объект, который загрузился в памяти.
clear mex;