00 — Intention pédagogique
Deux temps,
une même question
Temps 1 — 25 min
Teachable Machine
L'élève entraîne un modèle en glissant-déposant des photos d'iris dans des classes (bleu, vert, marron, sombre). Sans écrire une ligne de code, il voit instantanément le modèle se construire et tester ses prédictions. L'effet "magie" est immédiat — et c'est exactement là qu'on commence à poser les vraies questions.
Temps 2 — 30 min
Python · scikit-learn
On "ouvre le capot". L'élève code le même classifieur en Python : extraction des features RVB (déjà faite en séance 6 !), entraînement d'un KNN ou arbre de décision, prédiction sur de nouvelles images. La continuité avec les séances précédentes est totale — les données sont déjà là.
Comprendre ce qu'est un modèle
Une IA n'est pas magique — c'est une fonction mathématique apprise à partir d'exemples. Les élèves en sont les auteurs.
Données = pouvoir
La qualité du modèle dépend entièrement des données d'entraînement. Un mauvais jeu de données produit un mauvais modèle — et des décisions injustes.
Biais & limites
Si la classe ne contient que des yeux marron, le modèle sera mauvais sur les yeux bleus. C'est la définition d'un biais algorithmique — concret et vécu.
Continuité du projet
Les moyennes RVB de la séance 6 deviennent les features du classifieur. L'élève voit que tout le projet s'enchaîne logiquement.
01 — Organisation de la séance
55 minutes,
chrono précis
0 → 5 min
Accroche
Montrer une démo de reconnaissance irienne commerciale (WorldCoin, passeport biométrique). Poser la question : "Comment ça marche ?"
5 → 30 min
Teachable Machine
Entraînement collectif puis individuel. 4 classes de couleur. Test sur iris inconnus. Observation des erreurs.
30 → 50 min
Python scikit-learn
Script guidé : chargement des données séance 6, KNN, entraînement, prédiction, matrice de confusion.
50 → 55 min
Bilan éthique
5 minutes de discussion : "Notre modèle serait-il juste pour tout le monde ?" Lien avec l'exposition.
02 — Comprendre le pipeline IA
Comment une IA
apprend à classer
Survoler chaque étape pour comprendre ce qui se passe réellement à l'intérieur du modèle.
Photos
étiquetées
Features
RVB moyennes
Entraînement
KNN / Arbre
Modèle
entraîné
Nouvelle
prédiction
Matrice de
confusion
03 — Temps 1 · Teachable Machine
Sans code,
le modèle se construit
Étape A — 5 min
Créer le projet
Aller sur teachablemachine.withgoogle.com → "Nouveau projet" → "Projet Image".
- Renommer les classes : Bleu / Vert / Marron / Sombre
- Chaque groupe crée son propre projet
- Objectif : 15 à 20 images par classe minimum
Étape B — 10 min
Collecter les données
Importer les photos d'iris de la classe (déjà disponibles depuis les séances précédentes).
- Glisser-déposer les photos dans la bonne classe
- Prendre aussi des iris libres de droits en ligne pour enrichir
- Observer : combien d'exemples par couleur dans la classe ?
- Anticiper le biais si une couleur est sous-représentée
Étape C — 5 min
Entraîner
Cliquer sur "Entraîner le modèle". Observer la barre de progression.
- Combien d'epochs ? Qu'est-ce qu'une epoch ?
- La courbe de perte diminue — que signifie "apprendre" ?
- Tester immédiatement avec la webcam ou une image
Étape D — 5 min
Tester & questionner
Tester avec des iris que le modèle n'a jamais vus.
- Où se trompe-t-il ? Pourquoi ?
- Que se passe-t-il si on change l'éclairage ?
- Score de confiance : 60% vs 99% — quelle différence ?
- Est-ce qu'il reconnaît un iris sur un écran de téléphone ?
04 — Temps 2 · Python scikit-learn
Ouvrir le capot,
coder le même modèle
On reprend exactement les données de la séance 6 (moyennes RVB de chaque iris). L'élève code le pipeline complet : chargement → features → entraînement → prédiction → évaluation.
Ce que fait ce code
- Calcule les moyennes RVB de chaque iris (réutilise la fonction séance 6)
- Crée un tableau de features X et un tableau d'étiquettes y
- Chaque ligne de X = un iris décrit par 3 nombres
Notion clé
- Un dataset = (X, y) — features et labels
- Ici X a 3 colonnes : moy_R, moy_G, moy_B
- y contient la couleur réelle : "bleu", "vert", etc.
from PIL import Image
import os
def extraire_features(chemin_image):
"""Retourne (moy_R, moy_G, moy_B) d'une image iris."""
img = Image.open(chemin_image).convert("RGB")
pixels = list(img.getdata())
n = len(pixels)
moy_r = sum(p[0] for p in pixels) / n
moy_g = sum(p[1] for p in pixels) / n
moy_b = sum(p[2] for p in pixels) / n
return [moy_r, moy_g, moy_b]
# Structure des données : dossier par couleur
# iris_dataset/bleu/ iris_dataset/vert/
# iris_dataset/marron/ iris_dataset/sombre/
X = [] # features : liste de [moy_R, moy_G, moy_B]
y = [] # labels : liste de couleurs
couleurs = ["bleu", "vert", "marron", "sombre"]
for couleur in couleurs:
dossier = f"iris_dataset/{couleur}/"
if not os.path.exists(dossier):
continue
for fichier in os.listdir(dossier):
if fichier.endswith((".jpg", ".png")):
features = extraire_features(dossier + fichier)
X.append(features)
y.append(couleur)
print(f"Dataset : {len(X)} images, {len(set(y))} classes")
print(f"Exemple de features : {X[0]}")
Ce que fait ce code
- Divise les données en train (80%) et test (20%)
- Crée un classifieur KNN avec K=3 voisins
- L'entraîne sur les données d'entraînement
- Mesure la précision sur les données de test
Notion clé — KNN
- K=3 : pour classer, on regarde les 3 iris les plus proches
- "Plus proche" = distance euclidienne dans l'espace RVB
- Vote majoritaire parmi les 3 voisins → prédiction
- Changer K modifie le comportement : tester K=1, K=5, K=9
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier
from sklearn.metrics import accuracy_score
# Diviser en données d'entraînement et de test
X_train, X_test, y_train, y_test = train_test_split(
X, y,
test_size=0.2, # 20% pour le test
random_state=42, # reproductibilité
stratify=y # equilibrer les classes
)
print(f"Entraînement : {len(X_train)} iris")
print(f"Test : {len(X_test)} iris")
# Créer et entraîner le classifieur KNN
knn = KNeighborsClassifier(n_neighbors=3)
knn.fit(X_train, y_train)
# Évaluer sur les données de test
y_pred = knn.predict(X_test)
precision = accuracy_score(y_test, y_pred)
print(f"\nPrecision du modele KNN (K=3) : {precision*100:.1f}%")
# Tester avec différentes valeurs de K
print("\nInfluence de K :")
for k in [1, 3, 5, 7, 9]:
modele_k = KNeighborsClassifier(n_neighbors=k)
modele_k.fit(X_train, y_train)
prec_k = accuracy_score(y_test, modele_k.predict(X_test))
print(f" K={k} : {prec_k*100:.1f}%")
Ce que fait ce code
- Affiche quelle couleur est confondue avec quelle autre
- Révèle les biais du modèle de façon visuelle
- Permet de comprendre quelles classes sont "difficiles"
Notion clé
- Ligne = couleur réelle, Colonne = couleur prédite
- Diagonale parfaite = modèle parfait
- Une erreur "bleu → vert" : leurs RVB se ressemblent
- Lien direct avec la question éthique des biais IA
from sklearn.metrics import confusion_matrix, classification_report
# Matrice de confusion
classes = ["bleu", "vert", "marron", "sombre"]
matrice = confusion_matrix(y_test, y_pred, labels=classes)
print("Matrice de confusion :")
print(f"{'':10s}" + " ".join(f"{c:8s}" for c in classes))
for i, ligne in enumerate(matrice):
print(f"{classes[i]:10s}" + " ".join(f"{v:8d}" for v in ligne))
# Rapport détaillé par classe
print("\nRapport par couleur :")
print(classification_report(y_test, y_pred, target_names=classes))
# Prédire un nouvel iris inconnu
print("\n--- Test sur un iris inconnu ---")
iris_inconnu = extraire_features("nouvel_iris.png")
prediction = knn.predict([iris_inconnu])[0]
proba = knn.predict_proba([iris_inconnu])[0]
print(f"Couleur predite : {prediction}")
for c, p in zip(knn.classes_, proba):
barre = "█" * int(p * 20)
print(f" {c:8s} {barre:20s} {p*100:.1f}%")
Pourquoi c'est fort pédagogiquement
- L'arbre de décision est le seul classifieur qu'on peut lire en français
- L'élève voit exactement la règle apprise : "Si moy_B > 120 alors bleu"
- Permet de vérifier si la règle est sensée — ou absurde
- Idéal pour discuter de l'interprétabilité des IA
Question de réflexion
- L'arbre a-t-il appris une règle qui "a du sens" pour nous ?
- Qu'est-ce qui se passe si on lui donne un iris rouge (pathologie) ?
- Un arbre très profond = surapprentissage. Qu'est-ce que ça veut dire ?
- Peut-on faire confiance à une IA dont on ne comprend pas les règles ?
from sklearn.tree import DecisionTreeClassifier, export_text
import matplotlib.pyplot as plt
from sklearn import tree
# Entraîner un arbre de décision
arbre = DecisionTreeClassifier(max_depth=4, random_state=42)
arbre.fit(X_train, y_train)
precision_arbre = accuracy_score(y_test, arbre.predict(X_test))
print(f"Precision arbre de decision : {precision_arbre*100:.1f}%")
# Afficher les règles en texte lisible
regles = export_text(arbre, feature_names=["moy_R", "moy_G", "moy_B"])
print("\nRegles apprises par l'arbre :")
print(regles)
# Visualisation graphique de l'arbre
fig, ax = plt.subplots(figsize=(14, 6))
tree.plot_tree(
arbre,
feature_names=["moy_R", "moy_G", "moy_B"],
class_names=arbre.classes_,
filled=True,
rounded=True,
fontsize=9,
ax=ax
)
plt.title("Arbre de decision — Classification couleur d'iris")
plt.savefig("arbre_iris.png", dpi=150, bbox_inches="tight")
plt.show()
print("Arbre sauvegarde : arbre_iris.png")
05 — Bilan comparatif
Teachable Machine
vs Python — face à face
| Critère | 🟠 Teachable Machine | 🟢 Python scikit-learn |
|---|---|---|
| Prise en main | ✓ Immédiate — glisser-déposer | ~ 10 min — installer scikit-learn |
| Compréhension de l'algorithme | ✗ Boîte noire — réseau de neurones opaque | ✓ Lisible — règles visibles (arbre) |
| Contrôle des données | ~ Partiel — données envoyées à Google | ✓ Total — tout reste local |
| Interprétabilité | ✗ Impossible — CNN non interprétable | ✓ Totale — arbre de décision en français |
| Détection des biais | ~ Visible — score global seulement | ✓ Précise — matrice de confusion par classe |
| Utilisation pro / réelle | ~ Prototypage rapide | ✓ Déploiement en production |
| Lien avec le programme SNT | ✓ IA comme outil | ✓ IA + données + algorithme |
06 — 5 minutes de bilan éthique
Cinq questions
qui dérangent
Question 01
« Notre modèle est-il juste pour tout le monde dans la classe ? »
Piste : si la classe a 25 yeux marron et 2 yeux bleus, le modèle sera mauvais sur les yeux bleus. C'est la définition d'un biais de représentation — et c'est exactement ce qui se passe dans les vrais systèmes de reconnaissance faciale.
Question 02
« Pourquoi un modèle à 95% de précision peut quand même être dangereux ? »
Piste : 5% d'erreurs sur 1 milliard de personnes = 50 millions de personnes mal identifiées. La matrice de confusion révèle souvent que ces 5% touchent toujours les mêmes groupes.
Question 03
« Qui est responsable quand l'IA se trompe et qu'une personne est injustement fichée ? »
Piste : le développeur qui a entraîné ? L'entreprise qui l'a déployé ? L'État qui l'a autorisé ? La personne qui a donné ses données ? Il n'y a pas de réponse simple — c'est pourquoi le RGPD impose la traçabilité.
Question 04
« En utilisant Teachable Machine, avons-nous contribué à entraîner les IA de Google ? »
Piste : les CGU de Teachable Machine méritent d'être lues. C'est le prolongement direct de la séance 5 sur les données EXIF et les réseaux sociaux — chaque interaction numérique laisse des traces exploitables.
Question 05
« Notre classifieur peut-il reconnaître une maladie oculaire ? Devrait-il le faire ? »
Piste : techniquement peut-être. Légalement et éthiquement : non, sans dispositif médical certifié, sans médecin, sans consentement informé pour un usage médical. La frontière entre "outil" et "dispositif médical" est définie par la loi — et les IA la franchissent parfois sans le dire.
Question 06
« Peut-on exposer les résultats de notre classifieur à l'exposition ? »
Piste : lien direct avec l'exposition finale. Montrer les prédictions sans montrer les photos sources, expliquer les limites, afficher la précision et les erreurs. La transparence algorithmique comme valeur esthétique et éthique.
07 — Évaluation de la séance
Ce qu'on
évalue
Compréhension
Pipeline IA
4 pts
Sait expliquer les étapes : données → features → entraînement → prédiction → évaluation. Comprend ce qu'est un label et une feature.
Pratique
Script Python fonctionnel
4 pts
Le script charge les données, entraîne le KNN, affiche la précision et au moins une prédiction sur un iris inconnu.
Analyse
Matrice de confusion
3 pts
Sait lire et interpréter la matrice. Identifie les classes confondues et propose une explication (ressemblance RVB).
Éthique
Réflexion argumentée
3 pts
Formule au moins un argument pertinent sur les biais, la responsabilité ou les limites du modèle construit en classe.
Bonus
Arbre de décision
+2 pts
Code l'arbre, exporte la visualisation, et commente une règle apprise : est-elle sensée ? surprenante ?
pip install scikit-learn matplotlib
— et préparer un dossier iris_dataset/
avec sous-dossiers par couleur, pré-rempli avec quelques iris libres de droits pour les élèves non-consentants.