В этом примере показана генерация кода для приложения классификации логотипов, которое использует глубокое обучение. Он использует 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 helper демонстрирует увеличение данных на образце изображения, архитектуре логонета и опциях обучения.
Загрузите сеть 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
в логонет постоянной переменной и повторно использует постоянную переменную при последующих вызовах предсказания.
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
ФункцияСоздайте объект строения GPU для цели MEX и установите целевой язык на C++. Используйте coder.DeepLearningConfig
функция для создания 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').
Загрузите вход изображение. Функции 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;