Pretrained Deep Neural Networks
Matlab propose un grand nombre de réseaux pré-entraînés. L'image ci-dessous donne une vue de ces réseaux, avec comme critères le temps calcul de la classification et la précision.
Référence : Doc Matlab : Pretrained Deep Neural Networks
Cette étape permettra aux élèves de se familiariser avec l'utilisation des CNN et d'établir une comparaison de leurs performances. Ils pourront ensuite choisir de un à trois réseaux à étudier, ré-entraîner lors de l'étape suivante (en fonction de leur avancement).
1ère étape : Classification simple d'une image⚓
Code complet
On donnera des indications, un code incomplet ou le code complet en fonction de l'avancement des élèves.
net = alexnet; % Charge le réseau neuronal
img = imread('plage.jpg'); %lit l'image la charge en mémoire
img = imresize(img,[227,227]); % mise à la taille input du réseau
label = classify(net, img); % on récupère le label
figure %crée la fenête d'affichage
imshow(img, 'InitialMagnification', 'fit')% affiche l'image
title(char(label)); % met le label en titre
Images proposées
Pour démarrer : le plus simple est de copier les images dans le même répertoire que le script Matlab.
Résultats
Voici les labels attribués par alexnet :
seashore (pour la plage)
pug (pour le carlin)
cabbage butterfly (pour la feuille de bouleau)
Synthèse: les élèves analysent et font des constatations.
Vérifier la traduction des mots (sur Reverso : pug = carlin cabbage butterfly = piéride du chou)
Plus l'image est spécifique, moins le résultat est bon
La fonction "resize" modifie le ratio de l'image --> à quel point cela peut-il influencer le résultat ? Il faudrait faire d'autres tests.
2ème étape : Classification avancée d'une image⚓
Reprendre le code et ajouter la probabilité de confiance attribuée au label
Référence : Doc Matlab : Classify Image Using GoogLeNet
net = alexnet; % Charge le réseau neuronal
classNames = net.Layers(end).ClassNames; % récupération de toutes les classes
img = imread('carlin.jpg'); %lit l'image la charge en mémoire
img = imresize(img,[227,227]); % mise à la taille input du réseau
[label, scores] = classify(net, img); % on récupère le label et les probabilités
figure %crée la fenête d'affichage
imshow(img, 'InitialMagnification', 'fit')% affiche l'image
% titre de l'image : label + probabilité calculée
scores(classNames == label)
title(string(label) + ", " + num2str(100*scores(classNames == label), '%.2f') + "%");
Reprendre le code et afficher également les 5 labels ayant les plus forts scores
net = alexnet; % Charge le réseau neuronal
classNames = net.Layers(end).ClassNames; % récupération de toutes les classes
img = imread('carlin.jpg'); %lit l'image la charge en mémoire
img = imresize(img,[227,227]); % mise à la taille input du réseau
[label, scores] = classify(net, img); % on récupère le label et les probabilités
figure %crée la fenête d'affichage
imshow(img, 'InitialMagnification', 'fit')% affiche l'image
% titre de l'image : label + probabilité calculée
scores(classNames == label)
title(string(label) + ", " + num2str(100*scores(classNames == label), '%.2f') + "%");
% affiche les 5 plus fortes probabilités
[~,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)
Exemple de résultat pour le carlin
On constate que les 5 scores les plus élevés donnent des races de chien.
Exemple de résultat pour la feuille de bouleau
On constate que le résultat est moins "sûr". (le réseau est moins confiant quant à son résultat).
Reprendre le code et afficher le temps de calcul nécessaire à la classification
Utilisation de "tic" et "toc" juste avant et juste après la fonction pour connaître le temps d'exécution
tic
% The program section to time.
toc