Académique Documents
Professionnel Documents
Culture Documents
I Mise en situation
I.1 La reconnaissance des panneaux par les voitures
Dans le cadre de ce TP, le prétraitement a déjà été réalisé. Plusieurs panneaux ont été détectés par
le véhicule, les images obtenues sont situées dans le dossier Recherche. Le dossier Source contient
des images de références de panneaux connus (Figure 3) et qui serviront pour l’apprentissage des
nouveaux panneaux du dossier Recherche. Toutes les images ont les mêmes dimensions (100 lignes et
100 colonnes) et possèdent le même nombre de pixels RGB (100×100=10000).
Objectif
On souhaite pouvoir mener une procédure d’apprentissage supervisé en associant les panneaux incon-
nus du dossier Recherche aux panneaux déjà connus du dossier Source grâce à un algorithme des k
plus proches voisins (ou kNN pour k Nearest Neighbors en américain).
Dans la partie VII on utilisera la trame fournie dans le code Utilisation_scikit.py du dossier
Codes\Utilisation_scikit.
Librairies utilisées
Dans ce TP les librairies suivantes seront utilisées : matplotlib.pyplot, mglearn, numpy, math et
sklearn. Il est possible de les télécharger avec la commande pip install nom_librairie dans le
Prompt d’Anaconda.
Grâce à la librairie mglearn et à sa base de données déjà disponible, on peut avec le code ci-dessous
obtenir une illustration de l’algorithme kNN en Figure 4.
3 training class 0
training class 1
test pred 0
2 test pred 1
1
8.0 8.5 9.0 9.5 10.0 10.5 11.0 11.5 12.0
Figure 4 – Illustration des 3 plus proches voisins au sens de la norme euclidienne pour 3 points tests
(les étoiles) et 2 sources étiquetées connues (les points bleus et triangles oranges), les étoiles sont de
la couleur de la donnée étiquetée qui revient le plus dans les 3 plus proches voisins
Q1. Écrire une fonction DistanceEuclidienne(u,v) qui prend pour entrées 2 listes u et v de même
taille n et qui renvoie la distance euclidienne associée à ces 2 n-uplets.
Q3. Écrire une fonction PlusProchesVoisins(u,liste_v,k) qui renvoie une liste des k plus proches
voisins de u dans la liste liste_v au sens de la norme euclidienne, à partir du résultat de la fonction
ListeDistances(u,liste_v). À quelle condition sur k cette fonction marche-t-elle ?
Remarque : on autorise l’utilisation de liste.sort() pour trier les éléments de liste en place par
rapport à la première composante de tous ses éléments (les distances ici).
On donne la fonction suivante pour montrer une image à partir de l’array correspondant :
À partir d’une image au format array d’entiers codés sur 8 bits, la fonction AfficheImage affiche
cette image sur une figure.
On rappelle que l’ouverture au format array d’une image se réalise avec la commande imread en
indiquant le chemin d’accès à l’image chemin_image :
Q4. Écrire une fonction LectureImage(chemin_image) qui renvoie l’array associé à l’image de che-
min contenu dans la variable chemin_image. Quelles sont les dimensions de l’array obtenu ? À quoi
correspondent-elles ?
1 image_array = np . array ([[[1 ,2 ,3] ,[4 ,5 ,6]] ,[[7 ,8 ,9] ,[10 ,11 ,12]]])
2 image_array . shape
3 >>> (2 ,2 ,3) # image_array est une image 2×2 pixels avec 3 couleurs
4 image_liste = ConversionArrayList ( image_array )
5 print ( image_liste )
6 >>> [1.0 , 2.0 , 3.0 , 4.0 , 5.0 , 6.0 , 7.0 , 8.0 , 9.0 , 10.0 , 11.0 , 12.0]
Remarque : On précisera dans le code que les valeurs contenues dans image_array sont des flottants
afin d’éviter les problèmes de calculs des distances euclidiennes.
1 liste_chemins = \
2 InfosImages ( Dossiers ,\
3 nb_images_dossiers )[0]
4 print ( liste_chemins )
5 >>> [ ’ Source \\0\\0. bmp ’ , 1 liste_dossiers = \ 1 liste_num = \
6 ’ Source \\0\\1. bmp ’ , 2 InfosImages ( Dossiers ,\ 2 InfosImages ( Dossiers ,\
7 ’ Source \\0\\2. bmp ’ , 3 nb_images_dossiers )[1] 3 nb_images_dossiers )[2]
8 ’ Source \\0\\3. bmp ’ , 4 print ( liste_dossiers ) 4 print ( liste_num )
9 ’ Source \\0\\4. bmp ’ , 5 >>> [0 , 0 , 0 , 0 , 0 , 5 >>> [0 , 1 , 2 , 3 , 4 ,
10 ’ Source \\1\\0. bmp ’ , 6 1, 1, 1, 1, 1, 6 0, 1, 2, 3, 4,
11 ’ Source \\1\\1. bmp ’ , 7 2, 2, 2, 2, 2, 7 0, 1, 2, 3, 4,
12 ’ Source \\1\\2. bmp ’ , 8 3, 3, 3, 3, 3, 8 0, 1, 2, 3, 4,
13 ’ Source \\1\\3. bmp ’ , 9 4, 4, 4, 4, 4, 9 0, 1, 2, 3, 4,
14 ’ Source \\1\\4. bmp ’ , 10 5, 5, 5, 5, 5, 10 0, 1, 2, 3, 4,
15 ... , 11 6, 6, 6, 6, 6, 11 0, 1, 2, 3, 4,
16 ’ Source \\7\\0. bmp ’ , 12 7 , 7 , 7 , 7 , 7] 12 0 , 1 , 2 , 3 , 4]
17 ’ Source \\7\\1. bmp ’ ,
18 ’ Source \\7\\2. bmp ’ ,
19 ’ Source \\7\\3. bmp ’ ,
20 ’ Source \\7\\4. bmp ’]
Les images sources ayant un fond blanc, l’algorithme s’adapte automatiquement à n’importe quel fond.
En effet, une image recherchée ayant un fond quelconque sera à la même « distance » que toutes les
images sources sur la partie extérieur, l’algorithme sélectionnera alors celle qui se rapproche le plus
dans la comparaison du contenu intérieur du panneau.
Q8. En utilisant les fonctions précédemment établies, écrire un code qui permet d’ouvrir, d’afficher et
d’analyser (création de sa liste liste_RGB) une image du dossier Recherche au choix.
Q9. Toujours à partir des fonctions déjà disponibles, écrire un code qui détermine les k = 5 plus proches
voisins de l’image recherchée et crée les listes resultat_ind (indices des images résultats), resul-
tat_dossiers (dossiers correspondants) et resultat_num (numéros des images dans les dossiers). Ce
code doit afficher dans la console les dossiers et numéros des images trouvées.
Q10. Écrire une fonction MaxOccurences(liste) qui renvoie le terme qui apparait le plus dans la liste
liste, et le plus petit s’il y a des exæquo. Vérifier :
Q11. Écrire un code permettant de déterminer le dossier résultat, qui l’affiche dans la console et affiche
l’une des images de ce dossier.
Toutefois comme toute librairie à partir de laquelle on peut faire appel à des fonctions dont on ne
connait pas facilement le code source, il faut faire appel à de la documentation technique pour bien
l’utiliser. La documentation de scikit-learn est disponible à l’adresse suivante :
https://scikit-learn.org/stable/index.html
Le cahier des charges des performances attendues de l’algorithme kNN pour ce problème est le suivant :
Critère Niveau
Données test parmi les données source 25%
Valeur de k optimale Maximise l’exactitude et la précision
Exactitude pour k optimal > 80%
Précision pour chaque type de source et pour k optimal > 80%
Table 1 – Extrait du cahier des charges concernant les performances de l’algorithme kNN avec les
sources à disposition
On donne le code ci-dessous qui permet de construire la matrice de confusion d’un jeu de données
grâce à sklearn :
1 # Commentaire à compléter...
2 X , y = make_classification ( random_state =0)
3
4 # Commentaire à compléter...
5 X_train , X_test , y_train , y_test = train_test_split (X , y , random_state =0)
6
7 # Commentaire à compléter...
8 clf = KNeighborsClassifier ( n_neighbors =5)
9
10 # Commentaire à compléter...
11 clf . fit ( X_train , y_train )
12
13 # Commentaire à compléter...
14 p lo t_ c on fusion_matrix ( clf , X_test , y_test )
15 plt . show ()
Remarque : la variable random_state est un argument non obligatoire écrit comme un entier qui
assure la reproductibilité des résultats. Avec random_state = n (avec n un entier au choix entre 0 et
42) et en lançant le code plusieurs fois d’affilée, les variables X et y sont toujours les mêmes.
La matrice de confusion obtenue pour le test précédent est donnée en Figure 5. la figure Figure 6
est obtenue avec la librairie pédagogique mglearn et la commande :
1 plt . figure ()
2 mglearn . plots . p l ot _ b in a r y_ c o n fu s i on _ m at r i x ()
3 plt . tight_layout () # Toute la figure rentre dans la fen^ etre affichée
4 plt . show ()
TN FP
11
10
9
negative class
0 11 2
8
FN TP
7
True label
6
5
1 5 7
4 positive class
3
2
0 1
Predicted label predicted negative predicted positive
TP + TN TP TN
e= ; ppos = ; pneg =
TP + TN + FP + FN TP + FP TN + FN
Pour exploiter la matrice de confusion on peut l’obtenir textuellement en remplaçant la commande
appelant l’illustration de la matrice par :
Remarque : vu le grand nombre de noms de dossiers source (8) et le faible nombre d’images par dos-
sier (5), il se peut que des lignes de la matrice de confusions soient nulles. Dans ce cas les fonctions
plot_confusion_matrix et confusion_matrix ne retrouvent pas tous les noms et n’arrivent pas à tra-
cer la matrice de confusion. On aidera les fonctions en rajoutant l’option labels=liste_noms_dossiers,
soit :
Attention : Veiller à ne pas ajouter plusieurs fois la même image, cela fausserait les résultats.