3. Reconnaissance d’images avec Python

Objectif: Déplacer la tortue Python avec de la reconnaissance d’images.

Âge

14 à 18 ans

Notions abordées

Intelligence artificielle, classification d’images, programmation avec Python, condition, boucle.

Durée

4 heures

Dispositif pédagogiques

Par groupe de 2

Matériel

Un laptop/tablette par groupe de 2, avec connexion à Internet

Prérequis

1. Connaissances de bases de Python
2. Avoir créé un modèle de reconnaissance d’image avec la Teachable Machine de Google (Activité 1 - Reconnaissance d’images avec la Teachable Machine)

3.1. La tortue Python

Commence par utiliser la tortue Python. La tortue Python est une sorte de robot que tu peux déplacer dans une fenêtre graphique.

3.1.1. Crée la tortue

Pour permettre à Python d’utiliser la tortue, il faut d’abord importer la librairie turtle (qui veut dire tortue en anglais), et ensuite executer la commande screen = turtle.getscreen() pour ouvrir la fenêtre graphique.

Ouvre l’éditeur Python Thonny, et créé un nouveau fichier en cliquant sur l’icône ‘+’. Copie le code ci-dessous:

# Import turtle library
import turtle
# Open screen and display turtle
screen = turtle.getscreen()
# Create a turtle object
my_turtle = turtle.Turtle()

Remarque: Tous les textes après les ‘#” sont des commentaires, et tu n’es pas obligé de les recopier. Ils aident cependant à comprendre ce que fait le code.

Sauvegarde le fichier sous le nom ‘1-turtle.py’.

3.1.2. Teste le code

Tu es maintenant prêt à exécuter le code. Clique sur le bouton ‘Run’ de l’éditeur Thonny. Si tu constates que le code ne s’exécute pas correctement, il se peut qu’il y ait une erreur dans le code que tu as écrit.

Tu devrais maintenant voir une fenêtre s’ouvrir, avec la tortue qui est placée au centre. La tortue est représentée par une tête de flèche.

drawing

3.1.3. Dirige la tortue

Tu peux diriger la tortue avec les commandes:

  • my_turtle.forward(x): Pour avancer de x pixels

  • my_turtle.backward(x): Pour reculer de x pixels

  • my_turtle.right(x): tourner à droite de x degrés

  • my_turtle.left(x): tourner à gauche de x degrés

Par exemple, pour avancer de 100 pixels, tourner de 90 degrés, puis avancer de 100 pixels, tu peux utiliser le code suivant:

# Import turtle library
import turtle
# Open screen and display turtle
screen = turtle.getscreen()
# Create a turtle object
my_turtle = turtle.Turtle()

my_turtle.forward(100)
my_turtle.right(90)
my_turtle.forward(100)

Copie ce code dans l’éditeur Thonny et exécute-le. Tu devrais voir la tortue suivre le trajet correspondant:

drawing

Quel code pourrais-tu utiliser pour faire faire un carré à la tortue?

3.2. Prendre une image avec la caméra

Le code suivant te permet de prendre une image avec la caméra. Exécute-le pour voir l’image prise de la Webcam apparaître.

# Necessary import
import cv2 # cv2 is used to take image from the camera
import myfunctions # myfunctions helps for taking picture and making predictions
from PIL import Image # PIL is used to deal with images
import time # time is used for making the computer wait

# Get camera object
camera_object = cv2.VideoCapture(0)

# Take a picture from the camera
picture_rgb = myfunctions.take_picture(camera_object)

# Display picture
picture_as_image_object = Image.fromarray(picture_rgb)
picture_as_image_object.show(picture_as_image_object)

L’image apparaît dans une fenêtre du programme ‘GPicView’.

3.3. Classification de l’image

Pour classifier l’image, tu auras besoin d’un modèle de reconnaissance créé avec la Teachable Machine. Voir l’activité 1 pour comment créer ce modèle.

3.3.1. Entraînement du classificateur

Pour contrôler la tortue, tu peux par exemple utiliser une flèche imprimée sur un papier, comme la flèche ci-dessous:

drawing

Créer ensuite un classificateur avec deux classes dans la Teachable machine, que tu nommeras:

  • Forward: Avec des exemples de flèche vers le haut (qui serviront à faire avancer la tortue)

  • Other: Avec des exemples où la flèche ne va pas vers le haut

Prends une quarantaine d’images pour chacune des deux classes, et entraîne le classificateur. Teste-le ensuite, le classificateur devrait reconnaître quand la flèche est orienté vers le haut (classe ‘forward’), comme ci-dessous:

TM_Training

Exporte ensuite le modèle pour Python (Voir activité 1), et copie le ficher model.tflite dans le répertoire de tes fichiers Python.

3.3.2. Classification de l’image

Pour la classification d’image, nous allons reprendre le code pour prendre une image avec la caméra, et y ajouter le fait de prédire à quelle classe appartient l’image. Trois ajouts sont à faire

  1. Charger (initialiser) le modèle de reconnaissance d’images

  2. Lancer la détection d’image prise de la webcam

  3. Afficher “Je reconnais la classe ‘Forward’” si la classe est ‘Forward’, et afficher “Je reconnais la classe ‘Other’” si la classe est ‘Other’

Enfin, on placera une boucle pour répéter la détection d’image et l’affichage. L’algorithme est donné ci dessous:

Algorithm_1_ImageRecognition

Et voici la traduction en langage Python:

# Necessary import
import cv2 # cv2 is used to take image from the camera
import myfunctions # myfunctions helps for taking picture and making predictions
import matplotlib.pyplot as plt # matplotlib is used to deal with images
from PIL import Image # PIL is used to deal with images
import time # time is used for making the computer wait

# Get camera object
camera_object = cv2.VideoCapture(0)

# Initialize model
interpreter = myfunctions.initialize_model(model_path='model.tflite')

# Infinite loop
while True:
    
    # Wait for one second
    time.sleep(1)
    
    # Take image from the camera
    picture_rgb = myfunctions.take_picture(camera_object)
    
    # Predict image class
    prediction, probability = myfunctions.model_prediction(interpreter, picture_rgb)
    
    # If prediction is class 0, class is 'Forward'
    if prediction == 0:
        
        print("Je reconnais la classe 'Forward'")
        
    # If prediction is class 1, class is 'Other'
    if prediction == 1:
        
        print("Je reconnais la classe 'Other'")
    

Tu peux copier le code ci-dessus dans Thonny, et le lancer. Tu verras à chaque nouvelle seconde s’afficher la classe reconnue par le modèle.

3.4. Contrôle la tortue avec la reconnaissance d’image

Tu vas maintenant modifier le programme pour faire avancer la tortue de 10 pixels quand la classe est ‘Forward’. Il te suffit de rajouter la commande my_turtle.forward(10) lorsque la classe détectée est forward. Voici l’algorithme correspondant:

Algorithm_2_ImageRecognition_Turtle

Et la traduction en langage Python:

# Necessary import
import turtle # For using Python turtle
import cv2 # cv2 is used to take image from the camera
import myfunctions # myfunctions helps for taking picture and making predictions
import matplotlib.pyplot as plt # matplotlib is used to deal with images
from PIL import Image # PIL is used to deal with images
import time # time is used for making the computer wait

# Open screen and display turtle
screen = turtle.getscreen()
# Create a turtle object
my_turtle = turtle.Turtle()

# Get camera object
camera_object = cv2.VideoCapture(0)

# Initialize model
interpreter = myfunctions.initialize_model(model_path='model.tflite')

# Infinite loop
while True:
    
    # Wait for one second
    time.sleep(1)
    
    # Take image from the camera
    picture_rgb = myfunctions.take_picture(camera_object)
    
    # Predict image class
    prediction, probability = myfunctions.model_prediction(interpreter, picture_rgb)
    
    # If prediction is class 0, class is 'Forward'
    if prediction == 0:
        
        print("Je reconnais la classe 'Forward'")
        my_turtle.forward(10)
        
    # If prediction is class 1, class is 'Other'
    if prediction == 1:
        
        print("Je reconnais la classe 'Other'")
   

Tu peux copier le code ci-dessus dans Thonny, et le lancer. Tu verras à chaque nouvelle seconde s’afficher la classe reconnue par le modèle, et la tortue avancer de 10 pixels quand la classe est ‘Forward’.

3.5. Aller plus loin

  • Ajoute des classes avec des images de flèches vers la droite ou la gauche pour faire tourner la tortue à droite ou à gauche.

  • Fais un classificateur qui utilise l’image de tube sur sol martien, et pour faire avancer la tortue si aucun tube n’est détecté, et fais s’arrêter la tortue lorsqu’un tube est détecté.

3.6. Ressources utiles