使用 GoogLeNet 对 Simulink 中的图像进行分类
此示例说明如何使用 Image Classifier
模块对 Simulink® 中的图像进行分类。此示例使用预训练的深度卷积神经网络 GoogLeNet 执行分类。
预训练的 GoogLeNet 网络
GoogLeNet 已经对超过一百万个图像进行了训练,可以将图像分为 1000 个对象类别(例如键盘、咖啡杯、铅笔和多种动物)。该网络已基于大量图像学习了丰富的特征表示。网络以图像作为输入,然后输出图像中对象的标签以及每个对象类别的概率。
net = googlenet; inputSize = net.Layers(1).InputSize; classNames = net.Layers(end).ClassNames; numClasses = numel(classNames); disp(classNames(randperm(numClasses,10)))
{'speedboat' } {'window screen'} {'isopod' } {'wooden spoon' } {'lipstick' } {'drake' } {'hyena' } {'dumbbell' } {'strawberry' } {'custard apple'}
读取图像并调整图像大小
读取并显示要分类的图像。
I = imread('peppers.png');
figure
imshow(I)
要将此数据导入 Simulink 模型,请指定一个包含输入图像数据和空时间向量的结构体变量。
simin.time = []; simin.signals.values = I; simin.signals.dimensions = size(I);
用于预测的 Simulink 模型
图中显示了用于对图像进行分类的 Simulink 模型。该模型使用 From Workspace
模块加载输入图像,使用 Deep Neural Networks 库中的 Image Classifier
模块对输入进行分类,并使用 Display
模块显示预测的输出。
model = 'googlenet_classifier';
open_system(model);
运行仿真
要验证 Simulink 模型,请运行仿真。
set_param(model,'SimulationMode','Normal'); sim(model);
网络将图像分类为甜椒。
显示排名靠前的预测值
显示排名前五的预测标签,并以直方图形式显示它们的相关概率。由于网络将图像分类为如此多的对象类别,并且许多类别是相似的,因此在评估网络时通常会考虑准确度排名前五的几个类别。网络以高概率将图像分类为甜椒。
scores = yout.signals(1).values(:,:,1); labels = yout.signals(2).values(:,:,1); [~,idx] = sort(scores,'descend'); idx = idx(5:-1:1); scoresTop = scores(idx); labelsTop = split(string(labels(idx)),'_'); labelsTop = labelsTop(:,:,1); figure imshow(I) title(labelsTop(5) + ", " + num2str(100*scoresTop(5) + "%")); figure barh(scoresTop) xlim([0 1]) title('Top 5 Predictions') xlabel('Probability') yticklabels(labelsTop)