Этот пример демонстрирует генерацию кода для приложения классификации логотипов, которое использует глубокое обучение. Это использует команду codegen
, чтобы сгенерировать MEX-функцию, которая запускает прогноз на объекте SeriesNetwork под названием LogoNet.
CUDA® включил NVIDIA®, графический процессор с вычисляет возможность 3.2 или выше.
NVIDIA инструментарий CUDA и драйвер.
Библиотека NVIDIA cuDNN v7 или выше.
Переменные окружения для компиляторов и библиотек. Для получения дополнительной информации смотрите Переменные окружения.
Deep Learning Toolbox™, чтобы использовать объект SeriesNetwork.
Image Processing Toolbox™ для чтения и отображения изображений.
GPU Coder™ для генерации кода CUDA.
Интерфейс GPU Coder для Библиотек Глубокого обучения поддерживает пакет. Чтобы установить этот пакет поддержки, используйте Add-On Explorer.
Используйте coder.checkGpuInstall, функционируют и проверяют, что компиляторы и библиотеки, необходимые для выполнения этого примера, настраиваются правильно.
coder.checkGpuInstall('gpu','codegen','cudnn','quiet');
Логотипы используются, чтобы помочь пользователям в идентификации бренда и распознавании. Логотипы находят свое применение под различными областями, такими как реклама, сообщество документа и другие. Сеть распознавания логотипа (logonet) была разработана в MATLAB® и может распознать 32 логотипа при различных условиях освещения и движениях камеры. Архитектура этой сети подобна AlexNet. Поскольку эта сеть фокусируется только на распознавании, она может использоваться в приложениях, где локализация не требуется.
Сеть обучена в 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.m берет вход изображений и запускает прогноз на изображении с помощью нейронной сети для глубокого обучения, сохраненной в файле LogoNet.mat. Функция загружает сетевой объект от LogoNet.mat в персистентную переменную logonet. На последующих вызовах функции постоянный объект снова используется для прогноза.
type('logonet_predict.m')
function out = logonet_predict(in) %#codegen % Copyright 2017 The MathWorks, Inc. % function for predicting the logos % A persistent object logonet is used to load the series network object. % At the first call to this function, the persistent object is constructed and % setup. When the function is called subsequent times, the same object is reused % to call predict on inputs, thus avoiding reconstructing and reloading the % network object. persistent logonet; if isempty(logonet) logonet = coder.loadDeepLearningNetwork('LogoNet.mat','logonet'); end out = logonet.predict(in); end
Создайте объект настройки графического процессора для цели MEX и установите выходной язык на C++. Используйте кодер. 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').
Загрузите входное изображение.
im = imread('test.png');
imshow(im);
logonet вызова предсказывают на входном изображении.
im = imresize(im, [227,227]); predict_scores = logonet_predict_mex(im);
Сопоставьте лучшие пять очков прогноза со словами в 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);
Используйте ясный mex, чтобы удалить статический сетевой объект, загруженный в памяти.
clear mex;