这个例子展示了如何使用预训练的深度卷积神经网络GoogLeNet对图像进行分类。
GoogLeNet已经接受了超过一百万张图像的培训,可以将图像分类为1000个对象类别(例如键盘,咖啡杯,铅笔和许多动物)。该网络已经为各种图像学习了丰富的功能表示。网络将图像作为输入,然后输出图像中对象的标签以及每个对象类别的概率。

加载预训练好的网络

加载预训练的GoogLeNet网络。此步骤需要适用于GoogLeNet网络的Deep Learning Toolbox™模型支持包。如果您没有安装必需的支持软件包,则该软件将提供下载链接。
您也可以选择加载其他预训练的网络以进行图像分类。要尝试使用其他预训练的网络,请在MATLAB®中打开此示例,然后选择其他网络。例如,您可以尝试squeezenet比更快的网络googlenet。您可以在其他经过预训练的网络上运行此示例。有关所有可用网络的列表,请参见加载预训练网络

  1. net = googlenet;

您要分类的图像的大小必须与网络的输入大小相同。对于GoogLeNet,Layers网络属性的第一个元素是图像输入层。网络输入大小是InputSize图像输入层的属性。

  1. inputSize = net.Layers(1).InputSize

inputSize = 1×3

224 224 3

Layers属性的最后一个元素是分类输出层。该ClassNames层的属性包含网络学习到的类的名称。从1000个类别中查看10个随机类别名称。

  1. classNames = net.Layers(end).ClassNames;
  2. numClasses = numel(classNames);
  3. disp(classNames(randperm(numClasses,10)))

‘papillon’ ‘eggnog’ ‘jackfruit’ ‘castle’ ‘sleeping bag’ ‘redshank’ ‘Band Aid’ ‘wok’ ‘seat belt’ ‘orange’

读取并且更改图片大小

读取并且展示想要分类的图片

  1. I = imread('peppers.png');
  2. figure
  3. imshow(I)

♥ 使用GoogleNet分类图片 - 图1
图1. 分类的图片
展示图片的大小,这个图象是284x512的像素,拥有3个颜色通道(RGB).

  1. size(I)

ans = 1×3

384 512 3

通过使用imresize来更改输入图像的大小,这个改变会轻微地改变图像的横纵比。

  1. I = imresize(I,inputSize(1:2));
  2. figure
  3. imshow(I)

♥ 使用GoogleNet分类图片 - 图2
图2. 更改图像的大小
根据您的应用程序,您可能需要以其他方式调整图像的大小。例如,您可以使用裁剪图像的左上角I(1:inputSize(1),1:inputSize(2),:)。如果您具有Image Processing Toolbox™,则可以使用该imcrop功能。

图像分类

使用对图像进行分类并计算分类概率classify。网络将图像正确分类为甜椒。训练分类网络以针对每个输入图像输出单个标签,即使该图像包含多个对象也是如此。

  1. [label,scores] = classify(net,I);
  2. label

label = categorical

  1. bell pepper

显示带有预测标签的图像以及具有该标签的图像的预测概率。

  1. figure
  2. imshow(I)
  3. title(string(label) + ", " + num2str(100*scores(classNames == label),3) + "%");

♥ 使用GoogleNet分类图片 - 图3
图3. 图像及其标签和准确率

显示准确率高的预测

以直方图形式显示前五个预测标签及其关联的概率。由于网络将图像分类为许多对象类别,并且许多类别相似,因此在评估网络时通常考虑前五位的准确性。网络将图像分类为甜椒的可能性很高。

  1. [~,idx] = sort(scores,'descend');
  2. idx = idx(5:-1:1);
  3. classNamesTop = net.Layers(end).ClassNames(idx);
  4. scoresTop = scores(idx);
  5. figure
  6. barh(scoresTop)
  7. xlim([0 1])
  8. title('Top 5 Predictions')
  9. xlabel('Probability')
  10. yticklabels(classNamesTop)

♥ 使用GoogleNet分类图片 - 图4
图4. 准确率高的类别