exponenta event banner

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

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

Предварительные условия для сторонних производителей

Необходимый

В этом примере создается CUDA MEX со следующими требованиями сторонних производителей.

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

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

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

Создание CUDA MEX для 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').

Выполнить сгенерированный MEX

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

Связанные темы