Projet IRIS — SNT Seconde

Séance 9 — Module Intelligence Artificielle

L'IA apprend à voir

Entraîner un modèle de classification de la couleur des iris — d'abord sans code avec Teachable Machine, puis en comprenant ce que la machine fait vraiment avec Python.

Teachable Machine Python · scikit-learn Classification Éthique IA

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à.

Fil conducteur pédagogique : les élèves utilisent les moyennes RVB calculées en séance 6 comme features d'entrée du classifieur. Ce qu'ils ont "fait à la main" devient la matière première de l'IA. La continuité est explicite et puissante.
🧠

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 ?
Astuce enseignant : demander à chaque groupe d'entraîner avec des données légèrement différentes. Comparer ensuite les précisions — c'est la meilleure démonstration concrète que "les données font le modèle".

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.

Étape 1 Préparer les données Listes · Dictionnaires

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]}")
Étape 2 Entraîner le classifieur KNN scikit-learn · KNN

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}%")
Étape 3 Matrice de confusion — Où se trompe-t-il ? Évaluation · Biais

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}%")
Étape 4 — Bonus Arbre de décision — Voir les règles apprises Interprétabilité · Arbre

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
Message clé à retenir : Teachable Machine "fait" l'IA pour toi — Python te permet de comprendre ce que l'IA fait. Les deux sont utiles, mais seul le deuxième te donne le pouvoir de la questionner, de la corriger et d'en assumer la responsabilité.

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 ?

Prérequis technique : installer scikit-learn et matplotlib avant la séance — 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.
Différenciation : élèves avancés — implémenter un classifieur Naive Bayes et comparer sa précision au KNN. Élèves en difficulté — fournir X et y déjà calculés dans un fichier CSV et commencer directement à l'étape 2.