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

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

Необходимые условия для третьих лиц

Необходимый

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

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

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

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

Проверьте окружение GPU

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

Получите предварительно обученную сеть 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

The 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

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

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

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;

Похожие темы

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