这个例子展示了如何使用预训练的深度卷积神经网络GoogLeNet对图像进行分类。
GoogLeNet已经接受了超过一百万张图像的培训,可以将图像分类为1000个对象类别(例如键盘,咖啡杯,铅笔和许多动物)。该网络已经为各种图像学习了丰富的功能表示。网络将图像作为输入,然后输出图像中对象的标签以及每个对象类别的概率。
加载预训练好的网络
加载预训练的GoogLeNet网络。此步骤需要适用于GoogLeNet网络的Deep Learning Toolbox™模型支持包。如果您没有安装必需的支持软件包,则该软件将提供下载链接。
您也可以选择加载其他预训练的网络以进行图像分类。要尝试使用其他预训练的网络,请在MATLAB®中打开此示例,然后选择其他网络。例如,您可以尝试squeezenet
比更快的网络googlenet
。您可以在其他经过预训练的网络上运行此示例。有关所有可用网络的列表,请参见加载预训练网络。
net = googlenet;
您要分类的图像的大小必须与网络的输入大小相同。对于GoogLeNet,Layers
网络属性的第一个元素是图像输入层。网络输入大小是InputSize
图像输入层的属性。
inputSize = net.Layers(1).InputSize
inputSize = 1×3
224 224 3
该Layers
属性的最后一个元素是分类输出层。该ClassNames
层的属性包含网络学习到的类的名称。从1000个类别中查看10个随机类别名称。
classNames = net.Layers(end).ClassNames;
numClasses = numel(classNames);
disp(classNames(randperm(numClasses,10)))
‘papillon’ ‘eggnog’ ‘jackfruit’ ‘castle’ ‘sleeping bag’ ‘redshank’ ‘Band Aid’ ‘wok’ ‘seat belt’ ‘orange’
读取并且更改图片大小
读取并且展示想要分类的图片
I = imread('peppers.png');
figure
imshow(I)
图1. 分类的图片
展示图片的大小,这个图象是284x512的像素,拥有3个颜色通道(RGB).
size(I)
ans = 1×3
384 512 3
通过使用imresize
来更改输入图像的大小,这个改变会轻微地改变图像的横纵比。
I = imresize(I,inputSize(1:2));
figure
imshow(I)
图2. 更改图像的大小
根据您的应用程序,您可能需要以其他方式调整图像的大小。例如,您可以使用裁剪图像的左上角I(1:inputSize(1),1:inputSize(2),:)
。如果您具有Image Processing Toolbox™,则可以使用该imcrop
功能。
图像分类
使用对图像进行分类并计算分类概率classify
。网络将图像正确分类为甜椒。训练分类网络以针对每个输入图像输出单个标签,即使该图像包含多个对象也是如此。
[label,scores] = classify(net,I);
label
label = categorical
bell pepper
显示带有预测标签的图像以及具有该标签的图像的预测概率。
figure
imshow(I)
title(string(label) + ", " + num2str(100*scores(classNames == label),3) + "%");
显示准确率高的预测
以直方图形式显示前五个预测标签及其关联的概率。由于网络将图像分类为许多对象类别,并且许多类别相似,因此在评估网络时通常考虑前五位的准确性。网络将图像分类为甜椒的可能性很高。
[~,idx] = sort(scores,'descend');
idx = idx(5:-1:1);
classNamesTop = net.Layers(end).ClassNames(idx);
scoresTop = scores(idx);
figure
barh(scoresTop)
xlim([0 1])
title('Top 5 Predictions')
xlabel('Probability')
yticklabels(classNamesTop)
图4. 准确率高的类别