本页面提供的是上一版软件的文档。当前版本中已删除对应的英文页面。

徽标识别网络

此示例说明如何为使用深度学习的徽标分类应用程序生成代码。它使用 codegen 命令生成 MEX 函数,该函数对名为 LogoNet 的 SeriesNetwork 对象执行预测。

前提条件

  • 支持 CUDA® 的 NVIDIA® GPU,计算能力为 3.2 或更高。

  • NVIDIA CUDA 工具包和驱动程序。

  • NVIDIA cuDNN 库。

  • 编译器和库的环境变量。有关支持的编译器和库的版本的信息,请参阅Third-party Products (GPU Coder)。有关设置环境变量的信息,请参阅Setting Up the Prerequisite Products (GPU Coder)。

  • GPU Coder Interface for Deep Learning Libraries 支持包。要安装此支持包,请使用附加功能资源管理器

验证 GPU 环境

使用 coder.checkGpuInstall 函数验证运行此示例所需的编译器和库是否已正确设置。

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 的学习率和小批量大小 45 进行 40 轮训练。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-2019 The MathWorks, Inc.

persistent logonet;

if isempty(logonet)
    
    logonet = coder.loadDeepLearningNetwork('LogoNet.mat','logonet');
end

out = logonet.predict(in);

end

logonet_predict 函数生成 CUDA MEX

为 MEX 目标创建一个 GPU 配置对象,并将目标语言设置为 C++。使用 coder.DeepLearningConfig 函数创建一个 CuDNN 深度学习配置对象,并将其赋给 GPU 代码配置对象的 DeepLearningConfig 属性。要生成 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 字典 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;

相关主题