Est-il possible pour Ned2 de reconnaître plusieurs objets sur son espace de travail ?
OUI, sans aucun doute ! Grâce à Tensorflow (un outil d’apprentissage automatique à code source libre développé par Google), la reconnaissance de multiples objets est devenue possible.
Vous avez une Ned2 et vous êtes curieux de tester cette fonctionnalité ?
C’est très simple, tout ce dont vous avez besoin, c’est de votre Ned2, du kit de vision et de son espace de travail, de la grande pince et de plusieurs objets. Nous utiliserons du chocolat parce que nous en avons envie, je veux dire, qui n’en a pas envie ?
Sommaire :
- Comment installer/préparer mon espace de travail ?
- Comment lancer l’application sous Windows ?
- Comment lancer l’application sous Linux ?
- Le lancement est fait, mais il y a quelque chose qui ne va pas
- Le processus :
- Comment créer ma base de données ? (Reconnaissance d’objets)
- Comment suivre les objets ?
- Démonstration !
Comment configurer/préparer mon matériel et mes logiciels ?
Le matériel
La première chose à faire est de calibrer l’espace de travail avec Niryo Studio. Aussi, le nom de l’espace de travail doit correspondre à celui que vous avez renseigné dans le programme du robot (par défaut, le nom est « default_workspace »).
Si votre espace de travail n’est pas en face du robot, vous devrez changer la variable « observation_pose » pour que le robot puisse voir les quatre repères de l’espace de travail.
Logiciel
Tout d’abord, installez PyNiryo. Ensuite, téléchargez le code source de l’application sur notre Github. Supposons que vous allez cloner le dépôt dans un dossier nommé ‘tensorflow_ned’. Vous pouvez le cloner avec la commande suivante :
git clone https://github.com/NiryoRobotics/ned_applications.git
Ensuite, ouvrez le fichier robot_gui.py et changez les variables robot_ip_address par l’adresse IP privée et le nom de l’espace de travail de votre robot :
robot_ip_address = « Adresse IP de votre robot »
workspace = « espace de travail de votre robot »
Si vous utilisez la pompe à vide, modifiez également la variable z_offset, qui est le décalage entre l’espace de travail et la hauteur cible. Cela permettra au Vacuum Pump d’atteindre les pions pour les saisir. Comme le Vacuum Pump est plus court que la grande pince, vous pouvez modifier la variable z_offset en lui donnant une petite valeur négative, comme suit :
z_offset = -0.01
Comment lancer l’application sous Windows ?
Commencez par installer Anaconda pour utiliser le script d’installation de l’application. Anaconda doit être installé à son emplacement par défaut (C:Usersanaconda3).
Vous pouvez opter pour l’installation simplifiée ou l’installation manuelle.
Dans le premier cas, il suffit d’aller dans le dossier de l’application, de lancer setup.bat pour installer toutes les bibliothèques utilisées, d’accepter l’installation de ces bibliothèques, et de lancer run.bat.
Le programme devrait se lancer. Si ce n’est pas le cas, lancez une installation manuelle.
- Ouvrez un terminal depuis Anaconda Navigator (CMD.exe Prompt, « Launch »). Vous devriez voir « (base) » affiché à gauche de votre terminal.
- Mettez à jour Anaconda :
conda update -n base -c defaults conda
- Créez un environnement TensorFlow 2 avec Python 3.6 :
conda create -n tf_ned tensorflow=2 Python=3.6
- Activez l’environnement TensorFlow :
conda activate tf_ned
- Vous devriez maintenant voir « (tf_ned) » au lieu de « (base) » à gauche de votre terminal, mettez à jour TensorFlow :
pip install -upgrade tensorflow
- Installer les bibliothèques opencv, pygame, et pygame-menu :
install opencv-python pygame pygame-menu
- Allez dans le dossier de l’application :
cd Desktop/tensorflow_ned
- Lancez le programme :
python robot_gui.py
- Lancez le programme :
run.bat
- Ou dans le répertoire de l’application :
conda activate tf_ned python robot_gui.py
Comment lancer l’application sous Linux ?
Commencez par installer Anaconda pour utiliser le script d’installation de l’application.
- Ouvrez un terminal. Vous devriez trouver « (base) » affiché à gauche de votre nom d’utilisateur.
- Mettez à jour Anaconda :
conda update -n base -c defaults conda
- Créez un environnement TensorFlow 2 avec Python 3.6 :
conda create -n tf_ned tensorflow=2 Python=3.6
- Activez l’environnement TensorFlow :
conda activate tf_ned
- Vous devriez maintenant voir « (tf_ned) » au lieu de « (base) » à gauche de votre terminal. Mettez à jour TensorFlow :
pip install -upgrade tensorflow
- Installer les bibliothèques opencv, pygame, et pygame-menu :
install opencv-python pygame pygame-menu
- Allez dans le dossier de l’application :
cd tensorflow_ned
- Lancer le programme :
python robot_gui.py
- Entrez la commande :
conda activate tf_ned python3 robot_gui.py
Le lancement est effectué, mais quelque chose ne va pas dans le processus.
Assurez-vous que Ned2 est capable de voir les quatre points de repère de l’espace de travail depuis sa position d’observation, sinon il passera automatiquement en mode d’apprentissage et l’interface graphique sera rouge.
Pour que l’interface graphique devienne verte, déplacez la caméra de manière à ce que le robot puisse voir les quatre points de repère.
Ensuite, il suffit de confirmer la position souhaitée soit en cliquant sur l’écran ou en appuyant sur la touche entrée, et elle sera sauvegardée pour la prochaine utilisation.
Voici à quoi devrait ressembler la page d’accueil de l’interface :
Le processus :
Comment créer ma base de données ? (Reconnaissance d’objets)
Prêt à prendre des photos ? Vous devez prendre au moins 20 photos de chaque objet pour obtenir de bons résultats. Essayez à chaque fois de changer l’angle et les conditions d’éclairage.
Vous pourrez retrouver les photos que vous avez prises dans le dossier « data », dans un dossier nommé avec le nom de l’objet concerné.
Comment suivre les objets ?
Tout d’abord, la prise d’image « take_workspace_img() » permet au robot d’envoyer une image, de la recadrer, et d’ajuster la distorsion de l’objectif.
Ensuite, le calcul du masque « objs_mask() » utilise d’une part cv2.cvtColor() pour modifier la colorimétrie de l’image de RGB à HLS et d’autre part cv2.inRange() pour obtenir un masque qui délimite approximativement les objets à détecter. Afin de ne conserver que les objets ayant une surface suffisante, il faut combiner les fonctions cv2.dilate() et cv2.erode() pour éliminer les impuretés de l’image.
Voici à quoi devrait ressembler l’image :
Troisièmement, l’extraction des objets « extract_objs() » utilise la fonction cv2.findContours() pour obtenir la liste des contours des objets se trouvant sur le masque précédemment calculé. Ensuite, elle calcule le centre ainsi que l’angle des objets à l’aide des fonctions de vision.
Enfin, nous obtenons un carré contenant le plus petit objet et utilisons cette information pour extraire l’objet de l’image et le placer verticalement (la même orientation facilite la reconnaissance pour TensorFlow).
Démonstration !
Lancez l’entraînement soit en lançant training.py (python training.py), soit en cliquant sur le menu « Train » et le bouton « Full training » dans l’interface graphique.
Votre modèle TensorFlow est créé !
Créez ensuite une liste qui contient toutes les images du dossier « data » et une liste qui contient le label correspondant à chaque image. Lorsque l’entraînement est terminé, testez les performances du modèle et sauvegardez-le dans le dossier « model ».
Si vous souhaitez lancer un entraînement plus rapide, utilisez le bouton « Lite training ».
À la fin, lancez robot.py (python robot.py) et entrez le nom de l’objet que vous voulez que Ned2 saisisse, 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 de l’espace de travail.