%% Classify Images in Simulink Using GoogLeNet
% This example shows how to classify an image in Simulink(R) using the
% |Image Classifier| block. The example uses the pretrained deep
% convolutional neural network GoogLeNet to perform the classification.

% Copyright 2021 The MathWorks, Inc.

%% Pretrained GoogLeNet Network
% GoogLeNet has been trained on over a million images and can classify
% images into 1000 object categories (such as keyboard, coffee mug, pencil,
% and many animals). The network has learned rich feature representations
% for a wide range of images. The network takes an image as input, and then
% outputs a label for the object in the image together with the
% probabilities for each of the object categories.

net = googlenet;
inputSize = net.Layers(1).InputSize;
classNames = net.Layers(end).ClassNames;
numClasses = numel(classNames);
disp(classNames(randperm(numClasses,10)))

%% Read and Resize Image
% Read and show the image that you want to classify.
I = imread('peppers.png');
figure
imshow(I)
%% 
% To import this data into the Simulink model, specify a structure variable
% containing the input image data and an empty time vector.
simin.time = [];
simin.signals.values = I;
simin.signals.dimensions = size(I);

%% Simulink Model for Prediction
% The Simulink model for classifying images is shown. The model uses a
% |From Workspace| block to load the input image, an |Image Classifier|
% block from the Deep Neural Networks library that classifies the input,
% and |Display| block to show the predicted output. 
model = 'googlenet_classifier';
open_system(model);

%% Run the Simulation
% To validate the Simulink model, run the simulation. 
set_param(model,'SimulationMode','Normal');
sim(model);

%%
% The network classifies the image as a bell pepper.
%
% <<../imageClassificationOutput.png>>
%

%% Display Top Predictions
% Display the top five predicted labels and their associated probabilities
% as a histogram. Because the network classifies images into so many object
% categories, and many categories are similar, it is common to consider the
% top-five accuracy when evaluating networks. The network classifies the
% image as a bell pepper with a high probability.

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)
