В этом примере показано создание кода для приложения классификации логотипов, использующего глубокое обучение. Он использует codegen команда для генерации функции MEX, которая выполняет прогнозирование для SeriesNetwork объект с именем LogoNet.
Необходимый
В этом примере создается CUDA MEX со следующими требованиями сторонних производителей.
Графический процессор NVIDIA ® с поддержкой CUDA ® и совместимый драйвер.
Дополнительный
Для построений, отличных от MEX, таких как статические, динамические библиотеки или исполняемые файлы, этот пример имеет следующие дополнительные требования.
Инструментарий NVIDIA.
Библиотека NVIDIA cuDNN.
Переменные среды для компиляторов и библиотек. Дополнительные сведения см. в разделах Аппаратное обеспечение сторонних производителей и Настройка необходимых продуктов.
Используйте coder.checkGpuInstall для проверки правильности настройки компиляторов и библиотек, необходимых для выполнения этого примера.
envCfg = coder.gpuEnvConfig('host'); envCfg.DeepLibTarget = 'cudnn'; envCfg.DeepCodegen = 1; envCfg.Quiet = 1; coder.checkGpuInstall(envCfg);
Логотипы помогают пользователям идентифицировать и узнавать торговые марки. Многие компании используют свои логотипы в рекламе, документации и рекламных акциях. Сеть распознавания логотипов (logonet) была разработана в MATLAB ® и может распознавать 32 логотипа при различных условиях освещения и движении камеры. Поскольку эта сеть ориентирована только на распознавание, ее можно использовать в приложениях, где локализация не требуется.
Сеть обучается в MATLAB, используя данные обучения, которые содержат около 200 изображений для каждого логотипа. Поскольку количество изображений для обучения сети невелико, увеличение данных увеличивает количество обучающих образцов. Используются четыре типа увеличения данных: нормализация контраста, размытие по Гауссу, случайное переворачивание и сдвиг. Это увеличение данных помогает распознавать логотипы на изображениях, захваченных различными условиями освещения и движениями камеры. Входной размер логонета - [227 227 3]. Стандартные поезда SGDM с использованием коэффициента обучения 0,0001 для 40 эпох с размером мини-партии 45. Сценарий помощника trainLogonet.m демонстрирует увеличение объема данных на образце изображения, архитектуру логонета и возможности обучения.
Загрузите сеть входа и сохраните ее в LogoNet.mat.
getLogonet();
Сохраненная сеть содержит 22 слоя, включая сверточные, полностью соединенные и классификационные выходные слои.
load('LogoNet.mat');
convnet.Layers
ans =
22×1 Layer array with layers:
1 'imageinput' Image Input 227×227×3 images with 'zerocenter' normalization and 'randfliplr' augmentations
2 'conv_1' Convolution 96 5×5×3 convolutions with stride [1 1] and padding [0 0 0 0]
3 'relu_1' ReLU ReLU
4 'maxpool_1' Max Pooling 3×3 max pooling with stride [2 2] and padding [0 0 0 0]
5 'conv_2' Convolution 128 3×3×96 convolutions with stride [1 1] and padding [0 0 0 0]
6 'relu_2' ReLU ReLU
7 'maxpool_2' Max Pooling 3×3 max pooling with stride [2 2] and padding [0 0 0 0]
8 'conv_3' Convolution 384 3×3×128 convolutions with stride [1 1] and padding [0 0 0 0]
9 'relu_3' ReLU ReLU
10 'maxpool_3' Max Pooling 3×3 max pooling with stride [2 2] and padding [0 0 0 0]
11 'conv_4' Convolution 128 3×3×384 convolutions with stride [2 2] and padding [0 0 0 0]
12 'relu_4' ReLU ReLU
13 'maxpool_4' Max Pooling 3×3 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 в логонет постоянной переменной и повторно использует постоянную переменную при последующих вызовах прогнозирования.
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 свойства объекта конфигурации кода графического процессора. Для создания CUDA MEX используйте codegen и укажите входные данные, которые должны иметь размер [227 227 3]. Это значение соответствует размеру входного уровня сети логонета.
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 (логотипы).
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;