Complément : Fichiers sources
Les fichiers sources (images et scripts) sont sur le repository Github SI-IA-Vignenette
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, classés selon le temps calcul de la classification et la précision.
Référence : Doc Matlab : Pretrained Deep Neural Networks
Les réseaux de neurones s'installent via le « Add-on manager ». On peut donc voir la liste des CNN disponibles en cherchant les mots clefs « Deep learning toolbox network».
Pour se familiariser avec l'utilisation des réseaux, la première activité est de classer une image (i.e. trouver son label) en utilisant un CNN pré-installé.
1ère étape : Classification simple d'une image⚓
Choisir une image
Sélectionner une image sur Internet, au format jpg ou prendre l'image fournie en exemple.
Complément : Charger un réseau de neurones
Un CNN est chargé sous Matlab simplement en l'appelant depuis une variable, exemple
net = alexnet ;
Le réseau apparaît alors dans le Workspace.
Les CNN installés pour la formation sur le PC sont :
alexnet, googlenet, resnet-18, resnet-50
Chaque collègue pourra choisir les CNN à installer en fonction de ses besoins.
Afficher une image avec le label
Question⚓
En utilisant les fonctions Matlab, écrire le programme qui affiche une image, ainsi que son label (classe) attribué par le réseau.
Fonctions Matlab utilisées :
imread (Read image from graphics file) . Ex :
A = imread('ngc6543a.jpg');
imresize (Resize image). Ex :
B = imresize(A,[numrows numcols])
classify (Classify data using trained deep learning neural network)
labels = classify(net,images)
figure (Create Figure Window)
figure; % ouvre une fenêtre d'affichage (fenêtre d'affichage courante)
figure(1); %ouvre une fenêtre numérotée
imshow (Display Image)
(on pourra utiliser le paramètre « InitialMagnification »
imshow(monImage);
imshow(monImage, 'InitialMagnification', 'fit');
title (Add title)
% plusieurs façons d'écrire le titre de la figure
title('Le titre de la figure');
title(char(leTitre));
title(string(leTitre));
Solution⚓
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(string(label)); % met le label en titre
Test du CNN sur une image de feuille de vigne
Refaire la classification sur une image spécifique comme une feuille de vigne.
Conclusion : plus une image est spécifique, plus le cnn a du mal à deviner.
2ème étape : Classification avancée d'une image⚓
Label et probabilité (score de confiance)
Référence : Doc Matlab : Classify Image Using GoogLeNet
On peut obtenir des informations supplémentaires avec la fonction 'classify', notamment le score (taux de confiance pour chaque catégorie)
Sur cet exemple, le score de confiance pour le label « pug » (carlin) est de 99,99%.
Affichage du score
Question⚓
Améliorer le script précédent en ajoutant le score de confiance à côté du label
Références Matlab :
Propriété Layers du réseau (accessible en lecture uniquement)
La dernière couche du réseau autant de neurones que de classes. Chaque neurone porte la probabilité que l'image corresponde à sa classe.
Il est possible de récupérer le nom des classes via les propriétés de cette dernière couche.
% récupération de toutes les classes du CNN (dernière couche )
classNames = net.Layers(end).ClassNames;
classify (Classify data using trained deep learning neural network)
La fonction classify permet également d'obtenir les scores pour chaque classe (chaque neurone de la dernière couche).
% on récupère le label et toutes les probabilités
[label, scores] = classify(net, img);
Exemple : pour obtenir le score du label renvoyé par 'classify' :
%Sélection de la cellule de 'scores' avec comme index
%le classNames = le label retourné par 'classify'
scores( classNames == label )
Solution⚓
% Charge le réseau neuronal
net = alexnet;
% récupération de toutes les classes
classNames = net.Layers(end).ClassNames;
%lit l'image la charge en mémoire en tableau de pixels
img = imread('panda.jpg');
% mise à la taille input du réseau
img = imresize(img,[227,227]);
% on récupère le label
[label, scores] = classify(net, img);
% Affichage de l'image
figure(1) %crée la fenête d'affichage
imshow(img, 'InitialMagnification', 'fit')% affiche l'image
title(string(label) + ", " + num2str(100*scores(classNames == label), '%.2f') + "%");
Bonus : Afficher les 5 labels ayant les plus forts scores
Question⚓
Reprendre le code et afficher une figure avec les 5 labels ayant les plus forts scores et leurs probabilités.
Solution⚓
% Charge le réseau neuronal
net = alexnet;
% récupération de toutes les classes
classNames = net.Layers(end).ClassNames;
%lit l'image la charge en mémoire en tableau de pixels
img = imread('panda.jpg');
% mise à la taille input du réseau
img = imresize(img,[227,227]);
% on récupère le label
[label, scores] = classify(net, img);
% Affichage de l'image
figure(1) %crée la fenête d'affichage
imshow(img, 'InitialMagnification', 'fit')% affiche l'image
title(string(label) + ", " + num2str(100*scores(classNames == label), '%.2f') + "%");
% affiche les 5 plus fortes probabilités
% Trie par score décroissant et trouve les indices pour les 5 plus forts
[~,idx] = sort(scores,'descend');
idx = idx(5:-1:1);
% récupére les classes et les scores pour ces indices
classNamesTop = net.Layers(end).ClassNames(idx);
scoresTop = scores(idx);
% affiche une nouvelle figure avec un graphique en barres
figure(2)
barh(scoresTop)
xlim([0 1])
title('Top 5 des prédictions')
xlabel('Probabilité')
yticklabels(classNamesTop)
Exemple de résultat pour le panda
Autre exemple de résultat pour une feuille de bouleau
On constate que le résultat est moins "sûr". (le réseau est moins confiant quant au label renvoyé par 'classify').
3ème étape : comparaison des CNN⚓
Activités bonus
Cette section propose des activités complémentaires qui pourraient être réalisées avec les élèves. Elles pourront être faites pendant la formation en fonction du temps disponible et des priorités de chacun.
L'objectif est de comparer les performances de plusieurs CNN. Cette comparaison peut être qualitative ou quantitative et pourra servir à choisir le CNN qui sera réentraîné sur le dataset d'images spécifiques (ici les feuilles de vigne, saines ou porteuses de maladies).
Attention : Input size
Les 5 réseaux utilisés n'ont pas tous la même taille d'image en entrée ! Il faut adapter le code en conséquence.
227 x 227 pour alexNet et squeezeNet
224 x 224 pour googLeNet, MobileNetv2 et Res-Net18
Exemple : Analyser qualitative des résultats (pertinence) de plusieurs réseaux, sur un panel de plusieurs images (ici 3)
Remarque : en enlevant les ' ;' en fin de ligne, Matlab affiche la valeur de la variable dans la fenêtre de commande.
Fichier obtenu :
Pour cette analyse, les élèves pourraient rechercher la traduction (et les images) correspondants aux différents labels et estimer quel réseau donne les meilleurs résultats en terme de pertinence sur les N plus forts scores.
Dans le cas des animaux (races de chien, l'analyse peut se faire également en terme de ressemblance).
Exemple : Analyse quantitative : performance des CNN
Sur l'étude de N plus forts scores et de leurs classes, il serait possible d'attribuer des points aux CNN
points positifs pour des classes proches de l'image analysée
points négatifs pour des classes éloignées ou sans rapport avec l'image (exemple : shopping cart pour le chien)
Cette note globale servirait à comparer les CNN pour le choix du réseau à réentraîner.
Exemple : Analyse quantitative : temps de calcul
Comparer et classer les réseaux en fonction des temps de calcul.
Quels sont les réseaux les plus susceptibles de répondre à une exigence du cahier des charges ? (exemple : taux de précision > 97%).
Méthode : 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
Choix du CNN
Ces analyses peuvent aider à choisir le CNN qui sera entraîné sur le dataset d'images.