主要内容

标志识别网络

这个例子展示了一个使用深度学习的logo分类应用程序的代码生成。它使用一个预先训练好的网络,叫做LogoNet,并将输入的图像分为32个标志类别。本例还描述了如何使用预处理的训练数据集来训练网络。最后,本例使用codegen命令生成MEX函数并进行预测。

本例说明了以下概念:

  • 通过提取logo并将大小调整为227 * 227 * 3来预处理训练图像。随后,使用图像增强来增加训练数据的大小。

  • 使用随机梯度下降动量优化器(SGDM)训练网络。

  • 生成CUDA®MEX并运行MEX。

第三方的先决条件

要求

本例生成CUDA MEX,需要支持CUDA的NVIDIA®GPU和兼容的驱动程序。

可选

对于非mex构建,例如静态、动态库或可执行文件,此示例具有以下附加要求。

检查GPU环境

使用coder.checkGpuInstall(GPU编码器)函数验证用于运行此示例的编译器和库是否正确设置。

envCfg = code . gpuenvconfig (“主机”);envCfg。DeepLibTarget =“cudnn”;envCfg。DeepCodegen = 1;envCfg。安静= 1;coder.checkGpuInstall (envCfg);

标志识别网络

标志有助于用户识别和识别品牌。许多公司在广告、文件材料和促销活动中使用他们的标识。标志识别网络采用MATLAB开发,共包含22层。该网络包含四组卷积最大池化层,三个完全连接层和减少计算开销的dropout层。该网络获取大小为227 * 227 * 3的输入图像,并将其分为32个标志类别。因为这个网络专注于识别,所以可以在不需要本地化的应用程序中使用它。在MATLAB中使用Flickr32Logos[1]和flickr32plus[2]训练数据集对网络进行训练。这两个数据集包含每个标志大约200张图像。使用随机梯度下降动量优化器(SGDM)训练网络,学习率为0.0001,40个epoch,迷你批大小为45个。默认情况下,该示例使用预训练的logo识别网络。 The pretrained network enables you to run the entire example without having to wait for training to complete.

为了训练网络,设置doTraining变量转换为真正的.您还必须从。下载Logos-32plus数据集Logo识别的深度学习并将下载的Logos-32plus_v1.0.1.zip文件的位置提供给logozipPath.Logos-32plus数据集的大小为1.95 GB。根据你的互联网连接,下载过程可能需要时间。数据集有32个图像子文件夹,包含7830个不同品牌的logo图像。groundtruth mat文件提供了每个图像中logo的边界框信息。

preprocessLogoData函数对数据进行预处理,用于网络训练。Logos-32plus数据集中的图像大小不一。您必须调整图像的大小以输入网络的层大小(227 × 227 × 3)。图像还包含必须删除的背景信息。的preprocessLogoData.m通过使用边界框信息提取徽标并创建imageDatastore可用于网络训练的对象。的trainLogonet函数创建标识识别层,并通过使用指定的训练选项来训练网络。该网络使用每个标志至少包含110张图像的数据进行训练。

您还可以通过使用数据增强来增加训练样本的数量。数据增强有助于防止网络过度拟合和记忆训练图像的确切细节。为了增加训练数据,提供了四种类型的数据增强:随机翻转、高斯模糊、剪切和对比归一化。若要使用数据增强,请设置doAugmentation变量转换为真正的

doTraining = false;如果~ doTraining getLogonet;其他的logozipPath =''%提供下载的zip文件的路径zipData = fullfile(logozipPath,“Logos-32plus_v1.0.1.zip”);unpackedData = fullfile(logozipPath,“Logos32plus”);如果~存在(unpackedData“dir”)解压缩(zipData unpackedData);结束doAugmentation = false;logoData = preprocessLogoData(unpackedData,doAugmentation);trainLogonet (logoData);结束负载(“LogoNet.mat”);事先
convnet = SeriesNetwork with properties: Layers: [22×1 nnet.cnn.layer.Layer] InputNames: {'imageinput'} OutputNames: {'classoutput'}

要查看网络体系结构,请使用analyzeNetwork函数。

analyzeNetwork(事先)

logonet_predict入口点函数

logonet_predict.m入口点函数接受图像输入,并使用保存在的深度学习网络对图像进行预测LogoNet.mat文件。该函数从加载网络对象LogoNet.mat变成一个持久变量logonet并在后续的预测调用中重用持久变量。

类型(“logonet_predict.m”
function out = logonet_predict(in) %#codegen %版权所有2017-2022 The MathWorks, Inc. %持久对象logonet用于加载网络对象。在%第一次调用此函数时,将构造持久对象并% setup。当该函数随后被调用时,相同的对象将被%重用,以便对输入调用predict,从而避免重构和%重新加载网络对象。持久logonet;if isempty(logonet) logonet = code . loaddeeplearningnetwork (' logonet .mat','logonet');End out = logonet.predict(in);结束

生成CUDA MEXlogonet_predict函数

创建MEX目标的GPU配置对象,并选择目标语言为c++。使用编码器。DeepLearningConfig(GPU编码器)函数创建CuDNN深度学习配置对象。将其分配给DeepLearningConfigGPU代码配置对象的属性。要生成CUDA MEX,请使用codegen命令并指定输入的大小为[227,227,3]。这个值对应于标识网的输入层大小。

cfg = code . gpuconfig (墨西哥人的);cfg。TargetLang =“c++”;cfg。DeepLearningConfig =编码器。DeepLearningConfig (“cudnn”);codegen配置cfglogonet_predictarg游戏{(227227 3 uint8)}报告
代码生成成功:查看报告

运行生成的MEX

加载一个输入图像。调用logonet_predict_mex在输入图像上。

Im = imread(“test.png”);imshow (im);

Im = imresize(Im, [227,227]);Predict_scores = logonet_predict_mex(im);

将前五个预测分数映射到Wordnet字典同义词集中(logos)中的单词。

synsetOut = convnet.Layers(end).Classes;[val,indx] = sort(predict_scores,“下”);分数= val(1:5)*100;top5labels = synsetOut(indx(1:5));

显示前五种分类标签。

outputImage = 0 (227,400,3,“uint8”);k = 1:3 outputImage(:,174:end,k) = im(:,:,k);结束Scol = 1;麻雀= 20;k = 1:5 outputImage = insertText(outputImage, [scol, srow],...(char (top5labels (k)),' 'num2str(分数(k),' % 2.2 f '),“%”),...“输入TextColor”' w '“字形大小”15岁的“BoxColor”“黑”);麻雀=麻雀+ 20;结束imshow (outputImage);

清除内存中加载的静态网络对象。

清晰的墨西哥人

参考文献

Romberg, Stefan, Lluis Garcia Pueyo, Rainer Lienhart和Roelof van Zwol。“现实世界图像中的可扩展标识识别。”2011年ACM多媒体检索国际会议: 1 - 8。https://doi.org/10.1145/1991996.1992021

比安科,西蒙妮,马可·布泽利,达维德·马齐尼和雷蒙多·斯凯蒂尼。“Logo识别的深度学习。”Neurocomputing245(2017): 23-30。https://doi.org/10.1016/j.neucom.2017.03.051。

相关的话题