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

Этот пример демонстрирует генерацию кода для приложения классификации логотипов, которое использует глубокое обучение. Это использует команду 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 и опций обучения, используемых для обучения.

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

Загрузите 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 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 CUDA для функции 'logonet_predict'

Создайте объект настройки графического процессора для цели 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').

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

Загрузите входное изображение.

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;