Attraper des objets avec l’intelligence artificielle grâce à TensorFlow

V.1.1

Pick vision avec tensorflow

Difficulté : moyenne

Temps : ~30 min

Note

Ce tutoriel est fonctionnel à partir de :
La version v3.0.0 de la ned_ros_stack
La version v3.0.0 de Niryo Studio
La version v3.1.0 de PyNiryo

Si vous utilisez un Niryo One, référez vous à ce tutoriel.

Introduction

Cette application utilise TensorFlow, un outil open-source de traitement d’images développé par Google, qui permet à Ned/Ned2 de reconnaître de multiples objets sur son workspace, grâce à son Set Vision, l”intelligence artificielle, le traitement d’images ainsi que l’apprentissage automatique (machine learning).

Ce dont vous avez besoin

  • Ned (ou un Ned2)

  • Le gripper large (ou la pompe à vide si vous souhaitez utiliser les pions colorés fournis avec notre Set Éducation)

  • Le Set Vision et son workspace

  • Des objets variés à placer sur le workspace (dans notre cas, il s’agit des chocolats Célébration)

Installation

Matériel

Commencez par calibrer le workspace avec Niryo Studio. Le nom du workspace doit être le même que celui indiqué dans le programme du robot (par défaut, son nom est “default_workspace”).

Si le workspace n’est pas devant le robot, il vous faudra changer la variable “observation_pose” afin que le robot puisse voir les quatre marqueurs du workspace.

Note

Il est important d’attacher fermement le robot et son workspace afin de maintenir la précision du robot au fur et à mesure des manipulations.

Logiciel

Pour commencer, installez PyNiryo avec :

pip install pyniryo

Ensuite, téléchargez le code source de l’application sur notre Github que vous pouvez retrouver ici. Imaginons que vous clonez le dépôt dans un dossier appelé “tensorflow_ned”. Vous pouvez le cloner avec la commande :

git clone https://github.com/NiryoRobotics/ned_applications.git

Ouvez le fichier robot_gui.py et changez les variables robot_ip_address et workspace avec votre adresse IP privée actuelle ainsi que le nom du workspace de votre robot :

robot_ip_address = "IP adress of your robot"
workspace = "workspace of your robot"

Si vous utilisez la pompe à vide, changez la variable z_offset, qui représente la différence entre le workspace et la hauteur de la cible. Elle permettra à la pompe à vide d’atteindre le pion afin de l’attraper. En effet, la pompe à vide étant plus petite que le gripper large, vous pouvez modifier la variable z_offset pour une valeur négative, comme :

z_offset = -0.01

Désormais, les étapes à suivre afin de vous permettre de lancer cette application dépendent du système d’exploitation que vous utilisez.

Note

L’installation logicielle ne doit être faite qu’une seule fois sur votre ordinateur. Si vous avez déjà installé toutes les bibliothèques nécessaires, rendez vous directement dans la section Lancer le programme.

Sous Windows

Commencez par installer Anaconda afin d’utiliser le script d’installation de l’application. Anaconda doit être installé à sa localisation par défaut (C:Usersanaconda3).

Cliquez ici pour installer Anaconda.

Deux solutions sont disponibles :

  • Installation simplifiée

    Dans le dossier de l’application :

    • Lancez setup.bat afin d’installer toutes les bibliothèques utilisées

    • Acceptez l’installation de ces bibliothèques.

    • Lancez run.bat afin de lancer le programme.

Le programme devrait se lancer. Si ce n’est pas le cas, lancez le manuel d’installation.

  • Manuel d’installation :

  1. Ouvrez un terminal depuis votre navigateur Anaconda (CMD.exe Prompt, “Launch”).

Vous devriez voir “(base)” affiché sur la gauche de votre terminal.

  1. Mettez à jour Anaconda :

    conda update -n base -c defaults conda
    
  2. Créez un environnement TensorFlow 2 avec python 3.6 :

    conda create -n tf_ned tensorflow=2 python=3.6
    
  3. Autorisez l’environnement TensorFlow :

    conda activate tf_ned
    

Vous devriez désormais voir “(tf_ned)” affiché à la place de “(base)” sur la gauche de votre terminal.

  1. Mettez à jour TensorFlow :

    pip install –upgrade tensorflow
    
  2. Installez opencv, pygame et les bibliothèques pygame-menu :

    install opencv-python pygame pygame-menu
    
  3. Allez dans le dossier de l’application :

    cd Desktop/tensorflow_ned
    
  4. Lancez le programme :

    python robot_gui.py
    

Sous Linux

Commencez par installer Anaconda afin d’utiliser le script d’installation de l’application.

Cliquez ici pour installer Anaconda.

  1. Ouvrez un terminal. Vous devriez voir “(base)” affiché sur la gauche de votre nom d’utilisateur.

  2. Mettez à jour Anaconda :

    conda update -n base -c defaults conda
    
  3. Créez un environnement TensorFlow 2 avec python 3.6 :

    conda create -n tf_ned tensorflow=2 python=3.6
    
  4. Autorisez l’environnement TensorFlow :

    conda activate tf_ned
    

Vous devriez désormais voir “(tf_ned)” affiché à la place de “(base)” sur la gauche de votre terminal.

  1. Mettez à jour TensorFlow :

    pip install –upgrade tensorflow
    
  2. Installez opencv, pygame et les bibliothèques pygame-menu :

    install opencv-python pygame pygame-menu
    
  3. Allez dans le dossier de votre application :

    cd tensorflow_ned
    
  4. Lancez le programme :

    python robot_gui.py
    

Note

Si vous souhaitez désactiver l’environnement conda une fois que vous avez terminé, utilisez :

conda deactivate

Lancez le programme

Si vous avez déjà suivi les étapes précédentes une fois et que vous souhaitez simplement lancer le programme :

Sous Windows :

  • Lancez simplement :
    run.bat
    
  • Ou dans le répertoire de l’application :
    conda activate tf_ned
    python robot_gui.py
    

Sous Linux, entrez la commande :

conda activate tf_ned
python3 robot_gui.py

Note

Assurez vous d’être toujours dans un environnement qui dispose de TensorFlow ainsi que les bibliothèques Python nécessaires, avec :

conda activate tf_ned

Comment l’utiliser

Une fois que le programme est lancé, si Ned n’est pas en capacité de voir les quatre marqueurs du workspace, alors il activera automatiquement son mode aprentissage et l’interface graphique sera rouge.

Mise en place de la position d'observation

Mise en place de la position d’observation

Il sera nécessaire de bouger la caméra afin que le robot puisse voir les quatre marqueurs, ce qui passera l’interface graphique en vert. Un clic sur l’écran ou un appui sur la touche Entrée confirmera l’actuelle position, qui sera sauvegardée pour les prochaines utilisations (vous pouvez toujours la modifier dans le menu paramètres, en cliquant sur Observation pose).

Une fois que le worskpace est détecté par Ned/Ned2, vous avez accès à l’interface graphique :

Page d'accueil de l'interface graphique

Page d’accueil de l’interface graphique

Caractéristiques

Interface graphique pour le clavier / la souris ou l’écran tactile.

Détails

  • Play
    • [object_name] [object_image]

Une ou plusieurs pages contenant les objets et leurs miniatures. Cliquez sur le nom ou la miniature de l’objet de votre choix pour demander à Ned/Ned2 de le saisir.

Play menu

Play menu

  • Settings

    • Observation pose (Position d’observation)

      Le bouton “Observation pose” permet de changer la position depuis laquelle le robot enregistrera le workspace.

    • Drop pose (Position de dépose)

      Le bouton “Drop pose” permet de changer la position depuis laquelle le robot lâche l’objet demandé.

    • Labelling (Étiquettage)

      • Name: [selector]

        Le selecteur de nom permet de selectionner le nom d’un objet déjà existant depuis la base de données ou d’un nouvel objet appelé “obj_x”.

      • Name: [text_input]

        L’entrée de texte “name” vous permet de spécifier le nom de l’objet que vous souhaitez ajouter à la base de données. Afin d’ajouter des images à un objet existant, utilisez le sélecteur ou inscrivez le même nom que l’objet dans “name”.

      • Add img (Ajout d’images)

        “Add img” vous permet d”ajouter une image du workspace actuel dans votre base de données sous le répertoire “data”. Quand vous ajoutez un nouvel objet à la base de données, nous vous recommandons de prendre au moins vingt photos de celui-ci. Les objets ajoutés doivent avoir un certain contraste avec le workspace (nous vous recommandons d’éviter les objets blancs et fortement réfléchissants).

    • Train (Entraînement)

      • Full Training (entraînement complet) :

        Ce bouton lance l’entraînement des réseaux neuronaux avec le contenu du dossier “data”. Pendant toute la durée de l’entraînement, l’interface ne pourra pas être utilisée (pendant 1 à 10 minutes). Lorsque l’entraînement est terminé, le réseau sera sauvegardé dans le dossier modèle et l’interface sera automatiquement actualisée.

      • Lite Training (entraînement simple) :

        Ce bouton lance un entraînement simple. La différence avec l’entraînement complet se place au niveau du nombre d’étapes par epoch réalisées pendant l’entraînement. Dans ce cas ci, le nombre est divisé par deux. Ainsi, l’entraînement est plus rapide, mais il entraîne une légère perte de précision dans le modèle.

    • Update (Mise à jour)

      Le bouton “Update” lance l’analyse des dossiers “data”, “logo” et “data_mask”. Ensuite, il relance le réseau neuronal sauvegardé dans son modèle et met à jour chaque menu (ce qui est similaire à un redémarrage du programme).

Menu paramètres

Menu paramètres

  • Quitter

    Ned retourne à sa position de repos et active le mode apprentissage. Le programme se termine.

Autres caractéristiques :

  • Remplacez des images dans le dossier “logo“ avec des logos personnalisés (la couleur noire est utilisée comme la couleur de transparence).

  • Ajoutez ou supprimez des images et des dossiers dans la base de données par le biais d’un outil de gestion des dossiers (utilisez le bouton “Update“ pour demander à l’application de scanner de nouveau les dossiers).

  • Base de données fournie avec cette application :
    • Deux bases de données basées sur les chocolats Célébration.

    • Une base de donnée de 963 images qui vous permet d’entraîner un modèle avec 95 à 99,5% de précision (l’entraînement peut prendre de 1 à 15 minutes).

Fonctionnement

Création de la base de données (labelling.py)

Afin de créer votre base de données, vous devez prendre des photos des objets que vous souhaitez utiliser. Prenez au moins 20 photos de chaque objet afin d’obtenir de bons résultats.

L’objectif est de prendre des photos de chaque objet sous une multitude d’angles différents et différentes conditions d’éclairage. Les photos seront stockées dans un dossier dont le nom est le même que l’objet concerné, à l’intérieur du dossier “data“.

../../_images/pictures_of_object.png

Plusieurs photos d’un même objet

Afin de créer votre base de données, vous pouvez soit :

  • utiliser le bouton “Labelling de l’interface graphique

  • ou lancer le programme :
    python labelling.py
    

    Vous aurez ensuite besoin d’appuyer sur la touche Entrée quand vous voudrez ajouter de nouvelles images à votre base de données.

Repérage des objets (utils.py)

  • Prise d’image (avec la fonction “take_workspace_img()“ :

    Utilise l’API PyNiryo pour demander au robot d’envoyer une image, de la recadrer et de compenser la distortion de la lentille.

  • Calcul du masque (avec la fonction “objs_mask()“) :

    Le code utilise cv2.cvtColor() afin de modifier la colorimétrie de l’image de RVB à TSL (teinte, saturation, lumière), puis utilise cv2.inRange() afin d’obtenir un masque qui délimite approximativement l’objet à détecter. Afin de conserver uniquement les objets avec une surface suffisante, il combine les fonctions cv2.dilate() et cv2.erode() afin de supprimer les impuretés de l’image.

    On obtient finalement une image en noir et blanc correspondant à la forme de l’objet placé sur le workspace.

    ../../_images/black_and_white.png

    Forme des objets présents sur le workspace

  • Extraction des objets (avec la fonction “extract_objs()”)

    Le code utilise cv2.findContours() afin d’obtenir la liste des contours des objets du précédent calcul de masque. Ensuite, il calcule le centre ainsi que l’angle des objets avec l’aide des fonctions de vision de l’API PyNiryo : get_contour_barycenter(contour) et get_contour_angle(contour).

    Avec cv2.minAreaRect() on obtient un carré contenant le plus petit objet et on utilise cette information pour extraire l’objet de l’image et l”orienter verticalement (donner la même orientation à ces images facilite la reconnaissance pour TensorFlow).

    ../../_images/objects_same_orientation.png

    Photo des objets avec la même orientation

Entraînement (training.py)

Lancez training.py avec :

python training.py

ou cliquez sur le menu “Train” puis le le bouton « Full training » dans l’interface graphique. Cela créé un modèle TensorFlow (réseau neuronal). Ensuite, créez une liste qui contient toutes les images du dossier “data” ainsi qu’une liste qui contient l’appelation correspondant à chaque image.

La fonction utilise [model].fit( [images] , [labels] ) afin d’entraîner le modèle avec la base de données. Quand l’entraînement est terminé, testez les performances du modèle et sauvegardez les dans le dossier ”model”.

Vous pouvez également utiliser le bouton « Lite training » dans le menu Train, afin de lancer un rapide entraînement.

Prédictions (robot.py)

Lancez robot.py avec :

python robot.py

Puis entrez le nom de l’objet que vous souhaitez que Ned/Ned2 attrape, ou utilisez le menu ”Play” de l’interface graphique. Le programme utilise le modèle précédemment entraîné pour reconnaître les différents objets placés sur le workspace.

FAQ

La prédiction de l’IA n’apparaît pas :

../../_images/ia_prediction.png

Les prédictions de l’IA

Si les prédictions de l’intelligence artificielle n’apparaîssent pas sur l’écran, c’est probablement parce que :

  • Votre modèle n’est pas encore entraîné pour cette base de données. Dans ce cas, cliquez sur ”Train” dans le menu des paramètres.

  • Le modèle sauvegardé ne correspond pas aux objets de votre base de donnée actuelle. Dans ce cas, vous pouvez mettre votre dossier ”data” dans la même configuration que lors de votre dernier entraînement puis cliquez sur ”update”.

Mauvaises prédictions :

Si l’angle d’observation du workspace est très différent de celui de votre base de données, alors les résultats peuvent ne plus être corrects. Si un objet est souvent confondu avec un autre, essayez d’ajouter davantage d’images de ces deux objets dans votre base de données.