1. Introduction

La technologie de la reconnaissance vidéo s'est beaucoup développée et perfectionnée ces dernières années. En effet, elle est aussi de plus en plus simple d'accès et est utilisée dans le grand public. Que ce soit la Chine qui l'utilise pour reconnaître chacun de ses habitants ou encore les marques de téléphones mobiles qui permettent à leurs utilisateurs de déverrouiller leur smartphone grâce à leur visage, nous pouvons constaté son utilisation au quotidien ainsi que son utilité qui, pour le cas de la Chine, peut sembler inquiétante sur plusieurs aspects comme par exemple celui de la vie privée qui, finalement, n'est plus vraiment présente.

Mon projet a pour but d'utiliser cette reconnaissance vidéo afin de reconnaître un certaine élément dans l'espace.

Afin d'atteindre cette objectif, je vais utilisé le robot Thymio II, robot développé par MOBOTS à l'EPFL, ainsi qu'un Raspberry Pi 3 équipé d'un module de caméra.

2. Matériel et méthodes

2.1 Matériel

  • Raspberry Pi 3 Model B
  • Module caméra Raspberry Pi
  • 4 élastiques
  • Thymio-II
  • Batterie externe

2.2 Méthode

Pour commencer, j'ai décomposé mon problème en deux aspects distincts que j'ai ensuite réuni pour arriver à mon résultat final. Le premier était de réussir à faire se déplacer le robot Thymio II et le second était de faire reconnaître l'image à la caméra de mon Raspberry Pi.

2.2.1 Aspect Robotique

Afin de pouvoir communiquer avec mon Thymio depuis mon Raspberry, j'ai dû installé plusieurs libraires qui m'ont permises de faire cela. Tout d'abord, j'ai installé Asebamedulla, pour l'OS Raspbian, sur cette page ce qui m'a permis de pouvoir brancher le Thymio et le Raspberry ensemble. Ensuite, pour pouvoir communiquer du robot au Raspberry, j'ai aussi dû installer la libraire D-Bus simplement avec la commende $sudo apt-get install dbus. Avec cela, on devrait pouvoir utiliser notre robot sans trop de problème

2.2.2 Aspect reconnaissance vidéo

Pour cette étape, j'ai décidé d'utiliser la libraire OpenCV qui offre la possibilité de faire de la reconnaissance vidéo relativement facilement. Pour installer la libraire, je me suis aidé de cette vidéo qui en résumé liste ces commandes pour l'installation d'OpenCV:

$> sudo apt-get install libhdf5-dev libhdf5-serial-dev libhdf5-100
$> sudo apt-get install libqtgui4 libqtwebkit4 libqt4-test
$> sudo apt-get install libatlas-base-dev 
$> sudo apt-get install libjasper-dev
$> wget https://bootstrap.pypa.io/get-pip.py​
$> sudo python3 get-pip.py
$> sudo pip3 install opencv-contrib-python

J'ai aussi dû choisir ce que je voulais faire reconnaître à ma caméra. J'ai donc choisi de faire reconnaître au robot le visage d'un chat(cela marche aussi avec une la photo d'un visage de chat). Pour cela, j'ai récupéré un fichier haarcascade .xml à cette adresse. C'est grâce à ce fichier, qu'on pourra par la suite, faire reconnaître à notre caméra un visage de chat quelconque.

2.2.3 Exécution et explication du code

Avant de pouvoir exécuter le code, il faut, tout d'abord, brancher le Raspberry à la batterie externe et au Thymio ensemble et exécuter la commande $asebamedulla "ser:name=Thymio-II" dans le terminal. Si tout s'est bien passé, le terminal devrait indiqué qu'il a trouvé le Thymio II. (Pour accéder au Raspberry Pi à distance j'utilise VNC viewer ou Putty). Mon programme est codé en python 3 et se présente comme cela:

import cv2
import dbus
import dbus.mainloop.glib
import time 

#enclenchement du réseau pour parler au robot
dbus.mainloop.glib.DBusGMainLoop(set_as_default=True)
bus = dbus.SessionBus()
network = dbus.Interface(bus.get_object('ch.epfl.mobots.Aseba', '/'), dbus_interface='ch.epfl.mobots.AsebaNetwork')

#base de donnée de l'image à reconnaître
cat_cascade = cv2.CascadeClassifier('haarcascade_frontalcatface.xml')

#allumage de la caméra
cap = cv2.VideoCapture(0)

stop = 0


while True:
    
    for i in range(5):
        ret, img = cap.read()
        gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
        network.SetVariable("thymio-II", "motor.left.target", [20])
        network.SetVariable("thymio-II", "motor.right.target", [-20])
        cats = cat_cascade.detectMultiScale(gray, 1.3, 3)
        
        if len(cats) > 0:
            network.SetVariable("thymio-II", "motor.left.target", [0])
            network.SetVariable("thymio-II", "motor.right.target", [0])
            stop = 1
        time.sleep(1)
        stop = input("Appuyez sur "q" pour arrêter le programme prématurément: ")
        if stop == 1 or "q":
            break
    if stop == 1 or "q":
        break
    for i in range(3):
        network.SetVariable("thymio-II", "motor.left.target", [50])
        network.SetVariable("thymio-II", "motor.right.target", [50])
        
        time.sleep(1)
           
network.SetVariable("thymio-II", "motor.left.target", [0])
network.SetVariable("thymio-II", "motor.right.target", [0])

cap.release()

Premièrement, j'ai commencé par import toutes les libraires pour pouvoir les utiliser dans mon code.

import cv2
import dbus
import dbus.mainloop.glib
import time 

Ensuite, j'ai enclanché le réseau Aseba pour pouvoir parler avec le Thymio en python.

dbus.mainloop.glib.DBusGMainLoop(set_as_default=True)
bus = dbus.SessionBus()
network = dbus.Interface(bus.get_object('ch.epfl.mobots.Aseba', '/'), dbus_interface='ch.epfl.mobots.AsebaNetwork')

J'ai continué en précisant dans quelle fichier le code devait aller chercher la base de donnée pour la reconnaissance vidéo. (Attention: le fichier cascade doit être dans le même répertoire que le code)

cat_cascade = cv2.CascadeClassifier('haarcascade_frontalcatface.xml')

La ligne suivante allume la caméra en précisant laquelle utilisé(ici la caméra 0)

cap = cv2.VideoCapture(0)

Le reste du code représente la plus grosse partie. J'ai d'abord enclanché la boucle principale. Pendant 5 secondes, le thymio tourne sur lui-même tout en cherchant une image correspondant aux critères de sa base de données. S'il trouve quelque chose dans ce laps de temps, le programme s'arrête ce qui veut dire qu'il a trouvé un visage de chat. S'il n'a rien trouvé, il va avancé pendant 3 secondes. Si l'utilisateur le souhaite, il peut arrêter le programme prématurément en entrant la touche "Q" avec son clavier.

while True:
    
    for i in range(5):
        ret, img = cap.read()
        gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
        network.SetVariable("thymio-II", "motor.left.target", [20])
        network.SetVariable("thymio-II", "motor.right.target", [-20])
        cats = cat_cascade.detectMultiScale(gray, 1.3, 3)
        
        if len(cats) > 0:
            network.SetVariable("thymio-II", "motor.left.target", [0])
            network.SetVariable("thymio-II", "motor.right.target", [0])
            stop = 1
        time.sleep(1)
        stop = input("Appuyez sur "q" pour arrêter le programme prématurément: ")
        if stop == 1 or "q":
            break
    if stop == 1 or "q":
        break
    for i in range(3):
        network.SetVariable("thymio-II", "motor.left.target", [50])
        network.SetVariable("thymio-II", "motor.right.target", [50])
        
        time.sleep(1)

Donc pour lancer le programme, il suffit seulement d'effectuer la commande $python3 CodeFinal.py(->ne pas oublier de mettre le fichier haarcascade dans le même répertoire).

3. Résultats

Le code fonctionne. Il faut néanmoins noter les limitations. Le robot ne doit pas se trouver sur une surface où il pourrait tomber, la portée sur laquelle le robot cherche est relativement faible et la reconnaissance mais aussi parfois du temps à s'effectuer et parfois le robot n'arrive pas à trouver l'image. La seconde limitation s'explique par la nature du code. En effet, si on observe bien le code, on constate que dans la vraie vie, le robot se déplace en formant un triangle: Concernant la troisième limitation, le mouvement de la caméra en est sûrement la cause ainsi que la vitesse du processeur du Raspberry.

4. Discussion

Les résultats obtenus sont relativement imprécis. Une caméra de meilleure qualité mais surtout un meilleure ordinateur aurait probablement produit un meilleur résultat. Il ne faut pas non plus oublier qu'OpenCV est une libraire relativement vieille. On pourrait imaginer utilisé un programme comme celui-ci avec un aspirateur robot qui s'arrêterait à la vue d'un chat. J'avais dans un premier temps essayer de créer mon propre fichier de reconnaissance d'image sans réel succès. Cela est sûrement dû au peu d'image que j'avais de mon objet en question. Le résultat produit faisait soit que tout se faisait reconnaître ou que rien ne se faisait reconnaître. Concernant des erreurs que j'ai eu, la plus grosse était que mon thymio refusait de se connecter avec mon Raspberry Pi. L'erreur, au final, se trouvait au niveau thymio. Il m'a donc juste fallu changer de thymio pour régler le problème. La plus grosse difficulté que j'ai rencontré a été de comprendre comment les libraires fonctionnent mais avec quelques vidéos j'ai réussi à m'en sortir. Pour la reconnaissance vidéo, j'aurai pu utiliser des libraires plus récentes qui utilisent des technologies plus récentes mais qui n'auraient peut-être pas pu tourner sur le Raspberry Pi.

5. Conclusion

L'objectif final a été atteint bien qu'avec des limitations. Le projet pourrait être utilisé pour reconnaître des visages humains et des robots plus développés pourraient être utilisés. Par exemple, dans le cas des transports en commun ou des paiements, on pourrait utiliser son visage pour effectuer ces opérations de la vie de tous les jours. Notre visage serait du coup notre identité. Ce projet m'a permis de beaucoup progresser en programmation et d'en apprendre beaucoup sur la syntaxe du python. J'ai pu aussi me rendre compte de l'importance de la répartition de son temps.

Références

https://www.rts.ch/info/monde/11137943-la-chine-veut-noter-tous-ses-habitants-et-installe-600-millions-de-cameras.html http://wiki.thymio.org/en:linuxinstall https://www.youtube.com/watch?v=xlmJsTeZL3w&t https://github.com/opencv/opencv/blob/master/data/haarcascades/haarcascade_frontalcatface.xml