Académique Documents
Professionnel Documents
Culture Documents
e1 p1 W5
Intelligence
W2 p3
W3 x
e2 p2
y2 W 6
artificielle
W4
avec Arduino
Pascal MASSON
(pascal.masson@unice.fr)
Version projection
Edition 2023-2024-V15
4. Evitement d’obstacles
❑ Introduction
❑ Configuration des capteurs
❑ Apprentissage du réseau de neurones
❑ Tests et corrections (réseau 3-6-2)
5. Reconnaissance de lettres
❑ Introduction
❑ Les contraintes
❑ Identification de la lettre « A »
❑ Capture d’images et identification
Evitement d’obstacles
pour un robot voiture
*Référence : www.electronique-mixte.fr/wp-content/uploads/2018/08/Cours-
Intelligence-artificielle-15.pdf
Pascal MASSON Intelligence artificielle avec Arduino (version projection V15) 6
1. Généralités du l’IA
1.1. Historique
❑ Espoirs grandissants (1952-1969)
▪ Période très active.
▪ Un grand nombre de programmes furent développés pour résoudre des
problèmes d’une grand diversité.
❑ Première déception (1966-1973)
▪ Les chercheurs en IA ont été trop optimistes.
▪ Exemple de la traduction automatique de texte qui nécessite la
compréhension du texte.
Synapse
e1 s1
e2 s2
e3 s3
e4 s4
e5 s5
e1 s1
e2 s2
e3 s3
e4 s4
e5 s5
e1 s1
e2 s2
e3 s3
e4 s4
e5 s5
Chat
Chien
Apprentissage Oiseau
Poisson
Lapin
Chat
Chien
Identification Oiseau
Poisson
Lapin
Chat
Chien
Apprentissage Oiseau
Poisson
Lapin
Chat
Chien
Identification Oiseau
Poisson
Lapin
a a a
S
0 0 0
0 0.4
a
0 0.6
a = 0.40 + 0.40 = 0
𝑎 = 𝑤1 × 𝑒1 + 𝑤2 × 𝑒2 − 𝑆 = σ2𝑖=1 𝑤𝑖 × 𝑒𝑖 −𝑆
𝑝𝑒𝑛𝑡𝑒 = − 𝑑 − 𝑥 × 𝑒𝑖 E
d−x>0 d−x<0
▪ Si (d − x) < 0 cela signifie que l’action des
entrées a trop d’impact sur la sortie x. Dans ce
cas, les valeurs de w1 et w2 doivent être
diminuées : wi
wi = wi + µ (d − x) ei 0
− µ pente
▪ µ (> 0) permet une modification plus ou moins importante des poids à
chaque itération. Une valeur de µ trop grande risque de faire osciller la valeur
des poids. Une valeur de µ trop faible augmente considérablement le nombre
de boucles.
Pascal MASSON Intelligence artificielle avec Arduino (version projection V15) 30
2. Modélisation
2.2. Cas d’un seul neurone : l’apprentissage supervisé
❑ Algorithme d’apprentissage
▪ L’algorithme ci-contre permet de déterminer la Initialisation
valeur des poids w1,w2 et S
Table de vérité
a < 0 donc x = 0
a = w1 e1 + w2 e2 − S
Table de vérité
a < 0 donc x = 0
Table de vérité
a < 0 donc x = 0
a = w1 e1 + w2 e2 − S
Table de vérité
a > 0 donc x = 1
0.2 S = 0.6
0.1 µ = 0.5
w1 w2
0
0 10 20 30 40
Itérations
0.4 w1 = 0
2)
0.3 w2 = 0
Poids
0.2
S = 0.6
0.1
w1 w2 µ = 0.2
0
0 10 20 30 40
Itérations
0.04 S = 0.2
0.02 µ = 0.015
w1 w2
0
0 10 20 30 40
Itérations
0.2 S = 0.2
0.1 µ = 0.5
w1 w2
0
0 10 20 30 40
Itérations
x=1
e2 x=0
e1 e2 y1
1
0 0 0
0 1 1
1 0 1
1 1 1 0 e1
0 1
(y1,y2) = (0,1)
x=1
e2 x=0
e1 e2 y1 y2
1
0 0 0 0
0 1 1 0
1 0 1 0
1 1 1 1 0 e1
0 1
(y1,y2) = (0,1)
▪ Il devient alors possible de séparer les 2 ensembles de points avec le
perceptron de sortie
x=1
e2 x=0 y2
e1 e2 y1 y2 x
1 1
0 0 0 0 0
0 1 1 0 1
1 0 1 0 1
1 1 1 1 0 0 e1 0 y1
0 1 0 1
❑ Bibliographie
▪ L’exemple de ce chapitre a été fortement inspiré par :
✓ Magazine Hackable n°31 (p. 60-79),www.hackable.fr
✓ www.moretticb.com/blog/color-sensor-prototype-using-neural-networks/
▪ Cette base servira par la suite pour déterminer (avec le réseau de neurones)
si les couleurs sont chaudes ou froides.
✓ Simplicité d’utilisation.
✓ Les entrées doivent avoir pour valeur 1 au maximum.
Rouge : 255/0/0
const float entrees [6][3] = {
Vert : 0/255/0 {1.00,0.00,0.00},//rouge
{0.00,1.00,0.00},//vert
Bleu : 0/0/255 {0.00,0.00,1.00},//bleu
{1.00,1.00,0.00},//jaune
Jaune : 255/255/0 {0.00,1.00,1.00},//cyan
{1.00,0.00,1.00},//magenta
Cyan : 0/255/255
};
Magenta : 255/0/255
Bias = 1 Bias = 1
−0.73193
R
−0.34751 −0.32291
0.40073
0.73658 −0.2556
−0.6107
G x
−0.38728
−0.42456 0.68165
−0.59122
B
−0.32077
−0.73458
1 R
−0.34751 −0.30397
0.40073
0.73549 −0.22718
−0.6107
0 G x
−0.38728
−0.41931 −0.703392
−0.59122
0 B
−0.32077
Valeur de la sortie
l’évolution du calcul de la sortie en
0.8
fonction de la couleur et en fonction 0.6 Rouge Vert
Bleu Jaune
du nombre d’utilisation de la base 0.4
Magenta Cyan
0.2
d’apprentissage. 0
1 10 100 1000 10000
▪ Nous remarquons que les sorties N° boucle sur la base d'apprentissage
Valeur de la sortie
et bias peut se faire :
0.8
✓ Soit en fixant un nombre total 0.6 Rouge Vert
Bleu Jaune
0.4
de boucles. Magenta Cyan
0.2
✓ Soit en fixant une erreur 0
1 10 100 1000 10000
maximale à ne pas dépasser N° boucle sur la base d'apprentissage
entre les sorties calculées et
Evolution de la sortie
celles souhaitées. 1
Valeur de la sortie
▪ On applique par la suite un seuil 0.1
égal à 0.5 sur la sortie pour savoir si Rouge Vert
0.01
Bleu Jaune
la couleur est chaude ou froide : Magenta Cyan
0.001
✓ Sortie 0.5 : couleur chaude Echelle1 10 100 1000 10000
N° boucle sur la base d'apprentissage
✓ Sortie < 0.5 : couleur froide log-log
Pascal MASSON Intelligence artificielle avec Arduino (version projection V15) 73
3. Couleurs chaudes ou froides
3.4. Mis en œuvre de la bibliothèque NeuralNetwork
❑ Réseau 3-12-12-1 Echelle
▪ On peut se demander ce qui se passe semi-log Evolution de la sortie
Valeur de la sortie
1
si on augmente le nombre de couches 0.8
Rouge Vert
et de neurones cachés. 0.6 Bleu Jaune
0.4 Cyan Magenta
▪ Ce changement n’induit pas une 0.2
amélioration importante de la 0
1 10 100 1000 10000
précision sur la sortie. N° boucle sur la base d'apprentissage
Valeur de la sortie
1
plutôt due aux valeurs des poids
choisis par la librairie à l’initialisation 0.1
Rouge Vert
▪ Par contre, le calcul des 195 poids et 0.01
Bleu Jaune
bias a nécessité 7mn et 47s pour 4000 0.001
Cyan Magenta
tcs.getRawData(&r,&g,&b,&c);
Mesure et mise en forme des int rmap=map(r,rmin,rmax,0,255);
valeurs RGB int gmap=map(g,gmin,gmax,0,255);
int bmap=map(b,bmin,bmax,0,255);
entreesmesurees[0]=constrain(rmap,0,255)/255.0;
Définition du tableau des entreesmesurees[1]=constrain(gmap,0,255)/255.0;
valeurs RGB entreesmesurees[2]=constrain(bmap,0,255)/255.0;
Calcul de la sortie avec le réseau sorties = NN.FeedForward(entreesmesurees);
Utilisation du seuil à 0.5 Serial.println(sorties[0]>0.5?"Chaude" : "Froide");
delay(1000);
▪ En fonction du comportement
de la voiture, cette base pourra
être modifiée ou complétée.
ING2
ING1
END
ENG
5V
0V ENG
IOServo ING1
5V ING2
IND1
IND2
END
int mapf(double val, double in_min, double in_max, double out_min, double out_max) {
90°
la distance des obstacles
▪ On définit plusieurs actions
90°
que l’on souhaite avoir pour la voiture
en fonction de l’angle de mesure et de
la distance des obstacles
▪ On définit plusieurs actions
255 255
90°
la distance des obstacles
▪ On définit plusieurs actions
90°
que l’on souhaite avoir pour la voiture
en fonction de l’angle de mesure et de
la distance des obstacles
▪ On définit plusieurs actions
90°
la distance des obstacles
▪ On définit plusieurs actions
90°
la distance des obstacles
▪ On définit plusieurs actions
Pascal MASSON Intelligence artificielle avec Arduino (version projection V15) 100
4. Evitement d’obstacles
4.3. Mis en œuvre de la bibliothèque NeuralNetwork
❑ Base d’apprentissage
▪ Elle correspond au fonctionnement
que l’on souhaite avoir pour la voiture
en fonction de l’angle de mesure et de
90°
la distance des obstacles
▪ On définit plusieurs actions
Pascal MASSON Intelligence artificielle avec Arduino (version projection V15) 101
4. Evitement d’obstacles
4.3. Mis en œuvre de la bibliothèque NeuralNetwork
❑ Base d’apprentissage
▪ Elle correspond au fonctionnement
que l’on souhaite avoir pour la voiture
en fonction de l’angle de mesure et de
la distance des obstacles
▪ On définit plusieurs actions
Pascal MASSON Intelligence artificielle avec Arduino (version projection V15) 102
4. Evitement d’obstacles
4.3. Mis en œuvre de la bibliothèque NeuralNetwork
❑ Base d’apprentissage
▪ Elle correspond au fonctionnement
que l’on souhaite avoir pour la voiture
en fonction de l’angle de mesure et de
90°
la distance des obstacles
▪ On définit plusieurs actions
Pascal MASSON Intelligence artificielle avec Arduino (version projection V15) 103
4. Evitement d’obstacles
4.3. Mis en œuvre de la bibliothèque NeuralNetwork
❑ Base d’apprentissage
▪ Elle correspond au fonctionnement
que l’on souhaite avoir pour la voiture
en fonction de l’angle de mesure et de
la distance des obstacles
▪ On définit plusieurs actions
Pascal MASSON Intelligence artificielle avec Arduino (version projection V15) 105
4. Evitement d’obstacles
4.3. Mis en œuvre de la bibliothèque NeuralNetwork
❑ Réseau 3-12-2
▪ On reste sur 4000 utilisations de la base pour calculer les poids et bias
▪ L’ajout de 6 neurones (12 au total) dans la couche cachée n’améliore pas
notablement le résultat
3-6-2 3-12-2
150° 90° 30° G D Gr Dr Gr Dr
50 50 50 1 1 0.962 0.975 0.966 0.974
20 50 20 1 1 0.962 0.962 0.962 0.968
50 10 50 0 1 0.047 0.975 0.042 0.971
10 10 10 0 1 0.045 0.951 0.042 0.961
50 10 10 0 1 0.001 1 0 1
10 10 50 1 0 0.959 0.069 0.967 0.063
Pascal MASSON Intelligence artificielle avec Arduino (version projection V15) 106
4. Evitement d’obstacles
4.3. Mis en œuvre de la bibliothèque NeuralNetwork
❑ Réseau 3-12-12-2
▪ On reste sur 4000 utilisations de la base pour calculer les poids et bias
▪ L’ajout de 6 neurones dans la couche cachée n’améliore pas notablement le
résultat par contre l’ajout d’une couche cachée de 12 neurones donne de très
mauvais résultats (même avec 10000 utilisations de la base d’apprentissage).
Pascal MASSON Intelligence artificielle avec Arduino (version projection V15) 107
4. Evitement d’obstacles
4.4. Test et corrections (réseau 3-6-2)
❑ Approche n°1
▪ Elle consiste à alterner entre mesure des 3 distances et modification de la
vitesse/sens des moteurs
▪ La principale difficulté ici est que la voiture continue de se déplacer durant
les mesures ce qui :
✓ Cause une différence au niveau de l’environnement entre le moment
des mesures et le moment de la prise de décision
✓ Donne des déplacements incohérents de la voiture
▪ On peut cependant apporter 2 solutions :
✓ Diminuer considérablement la vitesse max de la voiture (passer de 255
à 150 en PWM par exemple)
✓ Ne pas utiliser un servomoteur mais 3 capteurs de distance laser afin de
considérablement réduire le temps total de mesure
Pascal MASSON Intelligence artificielle avec Arduino (version projection V15) 108
4. Evitement d’obstacles
4.4. Test et corrections (réseau 3-6-2)
❑ Approche n°2
▪ Alterner deux phases
✓ Mesure des distances, la voiture étant à l’arrêt.
✓ Mouvement de la voiture durant un certain temps,500 ms par exemple.
▪ Pour cette approche, le déplacement de la voiture est saccadé.
Pascal MASSON Intelligence artificielle avec Arduino (version projection V15) 109
5. Reconnaissance de lettres
5.1. Introduction
▪ La reconnaissance de lettre (ou de forme) est probablement l’application la
plus marquante de l’IA.
▪ Ce qu’il est possible de faire avec la carte arduino ne peut en rien
concurrencer les logiciels du commerce.
▪ L’application restera donc modeste pour 2 raisons :
✓ La carte arduino n’est pas performante en termes de capacité mémoire
et de vitesse de calcul comparé à un ordinateur.
✓ La carte arduino n’est pas vraiment adaptée à l’utilisation de caméras.
▪ En conséquence, les images auront des dimensions réduites ainsi que le
réseau de neurones.
Pascal MASSON Intelligence artificielle avec Arduino (version projection V15) 110
5. Reconnaissance de lettres
5.2. Les contraintes
▪ La première des contraintes est la taille du réseau de neurones que peut
accepter la carte arduino.
▪ En effet la génération de la matrice des poids et des bias peut rapidement
prendre une place considérable en mémoire, de plus ce sont des nombres à
virgule (codé sur 32 bits).
▪ En pratique, la déclaration d’une image de 88 = 64 pixels (ou neurones
d’entrée) avec une couche cachée de 32 neurones (nombre choisi de façon
empirique) et un neurone de sortie fait planter la carte arduino MEGA.
▪ Par contre le programme se lance pour de 86 = 48 pixels (ou neurones
d’entrée) avec une couche cachée de 24 neurones et un neurone de sortie.
Pascal MASSON Intelligence artificielle avec Arduino (version projection V15) 111
5. Reconnaissance de lettres
5.2. Les contraintes
▪ Vu la taille du réseau de neurone, il n’est pas envisageable d’utiliser une
carte arduino UNO pour ce chapitre.
▪ Une dernière chose à prendre en compte est la base d’apprentissage.
La librairie « exige » que les nombres soient des flottants. Là aussi, une image
de « grande » taille nécessite l’utilisation de beaucoup d’espace mémoire.
▪ Pour résoudre ce problème, on peut envisager de modifier la librairie pour
que la matrice d’entrée puisse être par exemple constituée de byte.
▪ Dans ce cas, et si on utilise uniquement du noir et blanc, une image de 84
pixels peut être codée avec un nombre de type uint32_t. Le gain en espace
mémoire est alors considérable.
Pascal MASSON Intelligence artificielle avec Arduino (version projection V15) 112
5. Reconnaissance de lettres
5.3. Identification de la lettre « A »
❑ La base d’apprentissage
▪ On utilise la lettre A, en noir (1) et blanc (0) pour ce chapitre.
▪ Avec une image de 8x4 pixels, on peut choisir cette forme pour la lettre A.
image1
Pascal MASSON Intelligence artificielle avec Arduino (version projection V15) 113
5. Reconnaissance de lettres
5.3. Identification de la lettre « A »
❑ La base d’apprentissage
▪ On utilise la lettre A, en noir (1) et blanc (0) pour ce chapitre.
▪ Avec une image de 8x4 pixels, on peut choisir cette forme pour la lettre A.
▪ En fonction de ce que la caméra va capter, la lettre peux se déplacer dans
l’image.
Pascal MASSON Intelligence artificielle avec Arduino (version projection V15) 117
5. Reconnaissance de lettres
5.3. Identification de la lettre « A »
❑ Réseau 32-16-1: calcul des poids et bias
▪ Le calcul des 32 16 + 16 1 = 528 poids et des 2 bias a pris 19 mn et 40 s
pour 4000 utilisations de la base d’apprentissage.
▪ Les valeurs, de la sortie, calculées (Sr) pour les 8 lignes
S Sr
(images) de la base d’apprentissage sont très proches des
valeurs désirées (S). 1 0.989
1 0.996
1 0.998
1 0.995
0 0.007
0 0.004
0 0.006
0 0.008
Pascal MASSON Intelligence artificielle avec Arduino (version projection V15) 118
5. Reconnaissance de lettres
5.3. Identification de la lettre « A »
❑ Réseau 32-16-1: identification
▪ Pour vérifier l’apprentissage, on utilise des images supplémentaires et on
calcule la valeur de la sortie du réseau de neurones.
0.989
Pascal MASSON Intelligence artificielle avec Arduino (version projection V15) 126
5. Reconnaissance de lettres
5.4. Capture d’une image et identification
❑ Capture d’une image
▪ La lettre A est imprimée en respectant les dimensions de l’image n°1 de la
base d’apprentissage.
▪ La distance et la focale ont été
réglées pour que les barres
montantes de la lettre aient une
largeur de 4 carreaux.
▪ Certaines aberrations
apparaissent sur l’image.
Pascal MASSON Intelligence artificielle avec Arduino (version projection V15) 127
5. Reconnaissance de lettres
5.4. Capture d’une image et identification
❑ Capture d’une image
▪ La lettre A est imprimée en respectant les dimensions de l’image n°1 de la
base d’apprentissage.
▪ La distance et la focale ont été
réglées pour que les barres
montantes de la lettre aient une
largeur de 4 carreaux.
▪ Certaines aberrations
apparaissent sur l’image.
▪ Il faut ramener la lettre à une
image de 8x4 pixels.
Pascal MASSON Intelligence artificielle avec Arduino (version projection V15) 128
5. Reconnaissance de lettres
5.4. Capture d’une image et identification
❑ Extraction de la lettre – la méthode
▪ On commence par faire un histogramme du chiffre 1 pour les lignes et les
colonnes.
Pascal MASSON Intelligence artificielle avec Arduino (version projection V15) 129
5. Reconnaissance de lettres
5.4. Capture d’une image et identification
❑ Extraction de la lettre – la méthode
▪ On commence par faire un histogramme du chiffre 1 pour les lignes et les
colonnes.
▪ On repère le démarrage de la
lettre en se fixant un nombre de
1 sur une même ligne ou colonne
par exemple supérieur à 6.
Pascal MASSON Intelligence artificielle avec Arduino (version projection V15) 130
5. Reconnaissance de lettres
5.4. Capture d’une image et identification
❑ Extraction de la lettre – la méthode
▪ On commence par faire un histogramme du chiffre 1 pour les lignes et les
colonnes.
▪ On repère le démarrage de la
lettre en se fixant un nombre de 16 16 16 16
15 0 0 16
9 0 0 12
0 0 0 0
Pascal MASSON Intelligence artificielle avec Arduino (version projection V15) 131
5. Reconnaissance de lettres
5.4. Capture d’une image et identification
❑ Extraction de la lettre – la méthode
▪ On commence par faire un histogramme du chiffre 1 pour les lignes et les
colonnes.
▪ On repère le démarrage de la
lettre en se fixant un nombre de 1 1 1 1
1 0 0 1
1 0 0 1
1 1 1 1
1 0 0 1
1 0 0 1
0 0 0 0
Pascal MASSON Intelligence artificielle avec Arduino (version projection V15) 133
5. Reconnaissance de lettres
5.4. Capture d’une image et identification
❑ Extraction de la lettre – la méthode
▪ On obtient finalement l’image
84 pixels que le réseau de
1 1 1 1
neurones va pouvoir analyser.
▪ A noter que la 8ème ligne de la 1 0 0 1
0 0 0 0
0 0 0 0
Pascal MASSON Intelligence artificielle avec Arduino (version projection V15) 134
5. Reconnaissance de lettres
5.4. Capture d’une image et identification
❑ Extraction de la lettre – le programme
pixel=0;
demar_lignes = 0;
demar_colonnes = 0; Initialisation des variables
num_lignes = 0;
num_colonnes = 0;
Pascal MASSON Intelligence artificielle avec Arduino (version projection V15) 135
5. Reconnaissance de lettres
5.4. Capture d’une image et identification
❑ Extraction de la lettre – le programme
i=0;
compteur = 0;
while ((compteur==0)*(i<30)) {
Recherche du numéro de
if (lignes [i]>6) {
demar_lignes = i; la ligne qui correspond au
compteur = 1;} début de la lettre
i++;
}
i=0;
compteur = 0;
while ((compteur==0)*(i<30)) {
Recherche du numéro de
if (colonnes [i]>6) {
demar_colonnes = i;
la colonne qui correspond
compteur = 1;} au début de la lettre
i++;
}
Pascal MASSON Intelligence artificielle avec Arduino (version projection V15) 136
5. Reconnaissance de lettres
5.4. Capture d’une image et identification
❑ Extraction de la lettre – le programme
▪ Il reste alors à déterminer si la valeur de chaque pixel est 1 ou 0.
Pascal MASSON Intelligence artificielle avec Arduino (version projection V15) 137
5. Reconnaissance de lettres
5.4. Capture d’une image et identification
❑ Identification en pratique
▪ Le système fonctionne comme prévu, cependant certaines images sont
reconnues comme une lettre A alors que cela ne devrait pas être le cas.
image31
▪ Dans ce cas, il faut intégrer cette image à la base d’apprentissage pour
réajuster les poids.
Pascal MASSON Intelligence artificielle avec Arduino (version projection V15) 138
5. Reconnaissance de lettres
5.4. Capture d’une image et identification
❑ Identification en pratique
▪ La base passe de 8 à 14 images avec un temps de calcul des poids de 35mn.
A Pas A