Сеть распознавания логотипа

Этот пример показывает генерацию кода для приложения классификации логотипов что глубокое обучение использования. Это использует codegen команда, чтобы сгенерировать MEX-функцию, которая выполняет предсказание на SeriesNetwork возразите названному LogoNet.

Сторонние необходимые условия

Необходимый

Этот пример генерирует MEX CUDA и имеет следующие сторонние требования.

  • CUDA® включил NVIDIA® графический процессор и совместимый драйвер.

Дополнительный

Для сборок неMEX, таких как статические, динамические библиотеки или исполняемые файлы, этот пример имеет следующие дополнительные требования.

Проверьте среду графического процессора

Используйте coder.checkGpuInstall Функция (GPU Coder), чтобы проверить, что компиляторы и библиотеки, необходимые для выполнения этого примера, настраиваются правильно.

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 и опциях обучения.

Получите предварительно обученный SeriesNetwork

Загрузите logonet сеть и сохраните ее в 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 в персистентную переменную 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

Сгенерируйте MEX CUDA для logonet_predict Функция

Создайте объект настройки графического процессора для цели MEX и установите выходной язык на C++. Используйте coder.DeepLearningConfig (GPU Coder) функция, чтобы создать 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').

Запустите сгенерированный MEX

Загрузите входное изображение. Вызовите 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;

Похожие темы

Для просмотра документации необходимо авторизоваться на сайте