Publié le 27 novembre 2018 - par

I.A : Réalisez un système de reconnaissance d’objets avec Raspberry Pi

Comment reconnaître différents objets en utilisant un Raspberry Pi et OpenCV ? Ce tutoriel vous explique comment faire. Vous pourrez ensuite envoyer un e-mail avec la photo de l’objet en pièce jointe.

Reconnaissance d’objet avec OpenCV sur un Raspberry Pi

L’intelligence artificielle est une science, qui aide les machines à interagir de la “même” manière que les humains. Une partie de ce vaste et passionnant domaine, est consacrée à la reconnaissance d’images.

Les applications sont multiples, comme le recensement de différentes espèces animales ou la reconnaissance de visages, en passant par la vidéosurveillance et la domotique… 

Ce projet de reconnaissance d’objets, tourne autour du logiciel libre OpenCV (Open Source Computer Vision Library). Le programme python s’occupe de détecter un mouvement, de reconnaître l’objet (voiture, chat , chien…) et d’envoyer un e-mail avec une photo en pièce jointe.

OpenCV est utilisé pour effectuer des calculs de traitement d’images. Il conjugue vision et intelligence artificielle, autant vous dire que l’industrie des technos est attentive à ce genre de solution. Il est compatible avec les OS Windows, Android, MacOS et bien sur,  Linux (Raspbian :))

Ici, OpenCV utilisera un modèle de réseaux neuronaux artificiels, développé par Google : les Mobilenet SSD. Conçu pour l’embarqué, Il est particulièrement performant sur l’ architecture ARM du Raspberry. 🙂

L’objectif du tutoriel, est de pouvoir détecter un objet, le reconnaître et envoyer un courriel avec photo en pièce jointe, au moment précis de la détection.

Le matériel

Le programme de reconnaissance requière pas mal de ressources processeur. Équipée de sa Picaméra, la Raspberry Pi 3B+ est bien adaptée pour la situation 🙂 

Pour rappel, son alimentation doit fournir au minimum 2500mA.

Pour ce tutoriel, nous utiliserons une machine Linux (Ubuntu 18.04) qui contrôlera à distance le Raspberry Pi, à l’aide de la suite VNC (Viewer et Server) et son environnement graphique. VNC est compatible avec  Windows et MacOS.

Il nous faudra une box, avec une connexion wifi ou filaire. 

Préparation de Raspbian Stretch Desktop

Considérons le fait que la dernière version de Raspbian Desktop, est installée et mise à jour sur votre Raspberry et bien sûr, qu’elle est connectée au réseau local. Dans le menu de configuration, activez le serveur VNC, SSH et la Picaméra.

A titre personnel, je trouve que le contrôle à distance (version VNC) du Pi, est pratique pour 2 raisons. Vous dispensez la framboise d’un écran HDMI, donc le boîtier peut-être installé n’importe où. De plus,  vous profitez du confort de l’environnement graphique ! Yo 🙂

Capture d’écran de mon PC Ubuntu, avec le bureau distant du Raspberry et OpenCV en exécution.

Pour installer VNC Viewer sur votre PC Linux, il suffit de télécharger le paquet Debian à cette adresse. Le gestionnaire de paquets présent par défaut sur Ubuntu, s’occupera d’installer le logiciel.

Avant de se connecter à distance sur votre Pi, il faudra récupérer son adresse IP. Vous pouvez scanner votre réseau local avec Zenmap. Ou plus simplement, si vous avez un smartphone connecté au wi-fi, téléchargez une application de scan.

Ouvrez VNC Viewer, entrez l’adresse IP du Raspberry dans la barre du dessus, une fenêtre de connexion vous invite à entrer login et mot de passe. Par défaut, ce sera pi en login et raspberry en mot de passe. Voilà, vous êtes connecté au bureau de Raspbian.

Installation de OpenCV avec pip

pip est un package qui permet de télécharger et d’installer rapidement des applications Python. Dernièrement, pour OpenCv, il était préférable de compiler les sources du logiciel, ce qui nécessite plus de 4 heures de compilation pour la Raspberry. Il est possible désormais d’installer OpenCV avec pip en quelques lignes de commande. Efficace et rapide 🙂

Avant toute chose, téléchargez les librairies requises.

Installez pip avec ces 2 commandes,

ainsi qu’ OpenCV et le module Python de la PI caméra.

Installez ces dépendances.

Tests de bon fonctionnement

 
Ouvrez la console de Python avec cette commande :

Pour info, nous utiliserons uniquement des programmes exécutés avec la version 3 de Python. A moins d’optimiser la syntaxe du code, ils ne fonctionneront pas sur la version 2.
 
Pour vérifier qu’OpenCV est opérationnel, tapez cette commande :

Si vous n’avez pas de message d’erreur, OpenCV est bien installé 🙂
Vous pouvez connaître la version en entrant cette commande :

Résultat:
 
 
Pour sortir et “tuer” le processus de l’interpréteur Python, tapez Ctrl + d.
 
Avant de rentrer dans le “grand bain” de la vision artificielle, testons la Pi Caméra, avec un  programme Python, qui ouvre une fenêtre et une vidéo en direct.
 
Créez dans le répertoire de votre choix, un fichier picamera.py et écrivez le code suivant : 

Pour afficher la vidéo en streaming, tapez cette commande dans le terminal :

 
Le programme spécifie une résolution d’image de 800×600 pixels.
 
Vous pouvez modifier ce paramètre pour augmenter ou diminuer le nombre de pixels.
 
La Picamera version 2 est équipée d’un capteur Sony de 8MP. Elle offre une résolution maximale de 3280×2464.
Pour l’instant, le programme ne prend pas en charge cette définition d’image. Vous pouvez monter jusqu’à 3MP (2000×1504).
 

Le programme Python

Le code Python de détection et reconnaissance d’objets, se base sur un modèle d’entraînement déjà défini.
 
Pour ce cas de figure, MobileNet SSD a été entraîné pour reconnaître une liste de 21 objets tels qu’une bouteille, un chien, un chat, une personne… 
Bien sur, la liste d’objet n’est pas exhaustive. Vous pouvez créer votre propre modèle, pour reconnaître un type d’objet précis. Un tutoriel complet pourrait y être consacré.
 
Commencez par créer un répertoire, nommons le “reconnaissance_objets” afin de stocker les fichiers nécessaires :
             
  • le programme Python : reconnaissance_objets.py
  • Le fichier entraîné aux 21 types d’objets : MobileNetSSD_deploy.caffemodel
  • Le fichier de configuration : MobileNetSSD_deploy.prototxt

Ci dessous, le code du programme, reconnaissance_objets.py :

Pour information, vous pouvez utiliser une webcam USB à la place de la Picamera. Il suffit de modifier cette ligne de code (juste avant la boucle while) :    vs = VideoStream(usePiCamera=True, resolution=(1600, 1200)).start()  en vs = VideoStream(0).start()

Mise en situation

Pour les essais, nous utiliserons donc, une Raspberry 3B+ équipée d’un trépied d’appareil photo.

Dans le répertoire où sont stockés vos fichiers, ouvrez une console et entrez la commande ci dessous:

$ python3 reconnaissance_objets.py --prototxt MobileNetSSD_deploy.prototxt.txt --model MobileNetSSD_deploy.caffemodel

Une mise en situation avec des bouteilles posées à différents endroits.

Au moment de la détection, le programme se charge d’envoyer un e-mail avec une photo en pièce jointe. Voici le résultat, en une série d’exemples par images :

 

La voiture de la poste, pratique lorsque l’on attend un colis 🙂

Conclusion

Pour aller plus loin, ce projet peut s’adapter en fonction de vos besoins, il suffit d’entraîner un groupe d’images d’un sujet particulier et réaliser une reconnaissance précise. A titre d’exemple, je suis entrain de réaliser un système autonome en énergie, alimenté par panneaux solaires. Le Rasperry est installé dans un arbre et connecté sur internet  via un dongle 3G usb.

Il est chargé de m’envoyer un courriel à chaque détection d’un animal particulier. Pour ce faire, j’entraîne un modèle de 1000 images, pour chaque catégorie d’animal. Dans ma région, on trouve surtout des sangliers, des écureuils, lapins, lièvres, (peut-être des loups) ou autre renards…

Le but est d’effectuer un recensement des différentes populations dans une zone précise. Par exemple, le dispositif pourrait être intéressant dans le cadre d’une surveillance de troupeaux d’élévage, face aux attaques de loups. Le projet est pour l’instant, en cour de réalisation. Mais peut-être fera l’objet du nouveau tutoriel.

Au sujet de l’auteur

Electronicien de formation, je suis passionné par les possibilités du Raspberry Pi dont la vision artificielle. La portabilité du Pi, ouvre un champs d’applications aussi différentes les unes que les autres. Je me focalise sur la reconnaissance de formes ou d’objets sur site isolé.

Sources

Share Button

80 réflexions au sujet de « I.A : Réalisez un système de reconnaissance d’objets avec Raspberry Pi »

  1. Clemzo

    Superbe idée que ce tuto. J’étais à la recherche de tutos de base sur l’AI, me voilà servi. Je tenterai la mise en application dès que possible. Un grand merci.

    Répondre
  2. Alex

    Super tuto. Est ce que ça fonctionne si les objets à détecter sont en mouvement ? Est ce que l algorithme se trompe souvent ? En résumé quelles sont les limites d utilisation avec le raspberry ?

    Répondre
  3. Daniel

    “Vous pouvez créer votre propre modèle, pour reconnaître un type d’objet précis. Un tutoriel complet pourrait y être consacré.” J’avoue que même si on doit pouvoir trouver ça tout seul en cherchant ce serait sympa ;). Tuto clair en français qui plus est !

    Répondre
  4. Stéphane KUENTZ Auteur de l’article

    Merci pour vos retours,
    Je n’ai pas précisé les adresses des deux fichiers d’entraînement : Prototext et Caffemodel.
    Ils sont téléchargeables sur GitHub
    Prototext
    https://github.com/chuanqi305/MobileNet-SSD/blob/master/voc/MobileNetSSD_deploy.prototxt
    Caffemodel
    https://github.com/C-Aniruddh/realtime_object_recognition/blob/master/MobileNetSSD_deploy.caffemodel
    Le code, dans ce cas précis ne demande pas une charge processeur énorme. Ce serait plutôt l’affichage de la vidéo en direct qui demande des ressources. En fait, il faudrait enlever de la boucle while, cette fonction d’affichage d’opencv : cv2.imshow(“Frame”, frame)

    Au niveau des limites du programme, il y en a une de taille, la luminosité. Il faut aussi éviter les contres jour.
    Je vais bientôt tester le code, avec ma boite solaire, équipée d’une batterie, la reconnaissance de nuit. J’ai un éclairage infrarouge à déclenchement. On verra bien 🙂

    Dans tout les cas, il est préférable que le modèle d’entraînement se base sur un grand nombre d’images, du même objet. C’est un gage de précision. D’ailleurs on peut le voir avec le taux de prédiction affiché sur l’image. J’éditerais prochainement un tuto sur le sujet, avec un programme python et une API de Google ou de Bing qui permet de collecter un grand nombre d’images d’un sujet particulier.
    @+

    Répondre
    1. Tremblay

      Merci Stephane, ce tuto marche impeccablement sauf des erreurs mineures qui obligent à nous bouger les neurones !
      Maintenant, je veux entraîner mon jeu d’images. Il y a beaucoup de tutos su le sujet, plus ou moins datés. Tu peux nous donner des pistes pour utiliser les outils les plus récents, probablement ceux de Google ?
      Raymond

      Répondre
  5. Landaisbenj

    Tout simplement magnifique.
    En correspondance avec domoticz (ou autre logiciel de domotique) les possibilités sur la detection de presence, d’intrusion ou autre sont vraiment infini.
    Je suis vraiment interressé aussi par un tuto pour entrainer l’ai sur d’autre modele. Peut etre aussi préciser des formes ou des couleurs. Par exemple la difference entre une voiture et une voiture de la poste…
    Aussi pourquoi utiliser opencv 3 alors que la 4 a l’air disponible sur leur site ?
    En tout cas merci pour tout. Je met ca de coté des que le temps me le permettra..

    Répondre
  6. Stéphane KUENTZ Auteur de l’article

    Pour le coup, les véhicules de la poste, ont une couleur carrosserie bien définie :). “jaune d’oeuf”
    Il faut récupérer dans un premier temps, un maximum d’image de voitures de la poste, avec la quantité d’images, on s’affranchit des problèmes d’exposition.

    Au sujet du choix entre la version 3 ou 4 d’OpenCV, j’ai la” vielle” habitude d’utiliser la version 3 avec Python3, j’ai moins de soucis d’interprétation de commande 🙂
    Mais je vais essayer OpenCV4 sur Raspberry avec la méthode pip.

    Répondre
  7. LINDENLAUB

    Bonjour,
    Ce projet m’intéresse à titre personnel. Je suis en train de finaliser une machine viticole que j’avais en projet (je suis fils de vigneron et technicien de maitenance). Je souhaiterais faie un usage détourné de ce système : j’utilise un vérin pneumatique pour mouvoir ma machine, et ainsi l’engager et la désengager dans la rangée de vignes. Simplement certains obstacles sont indésirables et donc à éviter au risque de l’endommager. Open CV semble être une aubaine pour moi !

    Serait-il possible de programmer un RPI avec open CV afin de piloter le distributeur qui actionne mon vérin, et ainsi de faire un système de désengagement automatique de protection ? (en fonction de la nature de l’obstacle).

    D’avance, merci !

    Répondre
    1. Stéphane KUENTZ Auteur de l’article

      Bonsoir LINDENLAUB,

      Avec Python, Il est possible de modifier la sortie du programme en actionnant un élément via le GPIO du Pi.

      Votre projet est réalisable, pourriez vous m’envoyer des photos de votre système ?

      Cordialement
      Stéphane Kuentz

      Répondre
      1. Maxime

        Bonjour Stéphane,

        Merci pour votre réponse ! Je vais essayer de prendre quelques photos représentatives ce week-end pour que vous puissiez voir de quoi il s’agit.

        Merci,

        Maxime

        Répondre
      2. LINDENLAUB

        Bonjour Stéphane,

        Merci pour votre réponse. Je vais essayer de prendre quelques photos représentatives ce week-end pour que vous puissiez voir de quoi il s’agit.

        Merci,

        Cordialement,

        Maxime

        Répondre
  8. marc

    Bonjour,
    j’ai un message d’erreur au test de la camera

    Traceback (most recent call last):
    File “picamera.py”, line 3, in
    from picamera.array import PiRGBArray
    File “/home/pi/Documents/picamera.py”, line 3, in
    from picamera.array import PiRGBArray
    ImportError: No module named ‘picamera.array’; ‘picamera’ is not a package

    Répondre
      1. Stéphane KUENTZ Auteur de l’article

        Non, ce n’est pas un problème de pi2, j’ai essayé avec une pi zéro w, avec la dernière version de raspbian, tout fonctionne sans problème.
        Dans votre cas, il faut repartir avec un système neuf et mis à jour.
        Bonne soirée

        Répondre
      2. AlexO

        Bonjour Marc, Stéphane,

        Merci Stéphane pour ce super Tuto.
        J’avais la même erreur, j’ai complètement réinstallé le pi, toujours la même erreur.
        J’ai résolut en copiant les bibliothèques directement dans le répertoire du projet…
        j’ai eu ensuite une erreur avec import Xlib… J’ai du l’installer, puis la copier dans le répertoire du projet… Et roule.

        J’ai maintenant une nouvelle erreur, la picam s’allume, et j’ai le message suivant :
        …chargement du modèle…
        …démarrage de la Picamera…
        Traceback (most recent call last):
        File “reconnaissance_objets.py”, line 109, in
        attachment = open(file_location, “rb”)
        FileNotFoundError: [Errno 2] No such file or directory: ‘/home/pi/Desktop/reconnaissance_objets/detection.png’

        Cordialement,
        AlexO

        Répondre
  9. Emric

    ~/workarea/git/openCv2 $ python3
    Python 3.5.3 (default, Sep 27 2018, 17:25:39)
    [GCC 6.3.0 20170516] on linux
    Type “help”, “copyright”, “credits” or “license” for more information.
    >>> import picamera
    Traceback (most recent call last):
    File “”, line 1, in
    File “/home/pi/workarea/git/openCv2/picamera.py”, line 3, in
    from picamera.array import PiRGBArray
    ImportError: No module named ‘picamera.array’; ‘picamera’ is not a package

    Répondre
  10. Emric

    J’ai rencontré le même problème par ma solution est de faire un import dans le dossier des package

    ~/workarea/git/openCv2 $ python3
    Python 3.5.3 (default, Sep 27 2018, 17:25:39)
    [GCC 6.3.0 20170516] on linux
    Type “help”, “copyright”, “credits” or “license” for more information.
    >>> import picamera.array
    Traceback (most recent call last):
    File “”, line 1, in
    File “/home/pi/workarea/git/openCv2/picamera.py”, line 3, in
    from picamera.array import PiRGBArray
    ImportError: No module named ‘picamera.array’; ‘picamera’ is not a package

    Par contre ici cela marche dans le dossier /usr/lib/python3/dist-packages!

    /usr/lib/python3/dist-packages $ python3
    Python 3.5.3 (default, Sep 27 2018, 17:25:39)
    [GCC 6.3.0 20170516] on linux
    Type “help”, “copyright”, “credits” or “license” for more information.
    >>> import picamera.array

    La solution pour le problème :
    https://stackoverflow.com/questions/46305203/python-import-only-works-when-run-from-inside-package-directory

    Répondre
  11. Emric

    Une autre solution qui marche chez moi c’est de changer le nom de script et de ne pas l’appeler picamera.py par ce que python essai de chercher le package dans le fichier avec le même nom et il ne le trouve pas !!

    Répondre
  12. AlexO

    Ok pour l’erreur, detection.png, je n’avais pas vu que le chemin était codé en dur… il n’y a pas le /Desktop/ chez moi. J’ai modifié, ça roule.

    Répondre
  13. Stéphane KUENTZ Auteur de l’article

    Effectivement, j’ai mis arbitrairement, le chemin à la ligne 101: file_location = ‘/home/pi/Desktop/reconnaissance_objets/detection.png’
    J’ai modifié le code dans le tuto. 🙂

    Répondre
  14. Stéphane KUENTZ Auteur de l’article

    Pourquoi opposer Python et C++ ? Les 2 fonctionnent avec leur syntaxe similaire .
    La Raspberry fonctionne avec tout les langages de programmation. Le Python est populaire, car accessible.
    Le code est lisible à l’instar d’une recette de cuisine.
    “on importe les éléments nécessaires”
    “on réalise notre recette”
    “on sert le résultat”
    De plus l’interprétation du code n’impacte pas les performances du Pi.

    Je n’ai pas essayé de compiler les sources d’OpenCV4. En tout cas la compil fonctionne avec OpenCV3.
    Comme toute nouvelle version de logiciel, OpenCV4 débute. Nous travaillons sur le sujet 🙂
    C’est pour cela que le tutoriel est basé sur OpenCV3 & Python3, avec pip. Le code est fonctionnel sur une version de Raspbian mise à jour.

    Répondre
  15. Pajrle

    Chez moi le script picamera.py n’ouvre pas la fenêtre vidéo. En quittant le script par Ctrl c je vois une erreur :
    ‘Incorect buffer length for résolution %d%d’ % (width, height)) picamera.exc.PiCameraValueError: Incorrect buffer length for résolution 800×600.
    Avez vous une idée ?
    Pour éviter les problèmes déjà évoqués j’ai renommé le fichier picamera.py en videotest.py. Il se lance bien mais n’ouvre rien et donne l’erreur ci-dessus.
    Merci

    Répondre
    1. pajrle

      De plus j’ai cette erreur quand e lance la reconnaissance:
      $ python3 reconnaissance_objets.py –prototxt MobileNetSSD_deploy.prototxt.txt –model MobileNetSSD_deploy.caffemodel
      Traceback (most recent call last):
      File “reconnaissance_objets.py”, line 19, in
      import pyautogui
      File “/usr/local/lib/python3.5/dist-packages/pyautogui/__init__.py”, line 115, in
      from . import _pyautogui_x11 as platformModule
      File “/usr/local/lib/python3.5/dist-packages/pyautogui/_pyautogui_x11.py”, line 7, in
      from Xlib.display import Display
      ImportError: No module named ‘Xlib’

      Répondre
        1. Pajrle

          La reconnaissance fonctionne . Néanmoins j’ai rajouté l’extension txt qui manquait au fichier MobileNetSSD_deploy.prototxt.txt après l’avoir téléchargé.
          Curieusement le script de test de la picamera ne fonctionne toujours pas, mais peu importe puisque le script de reconnaissance lui fonctionne bien.
          Merci
          Bonne soirée

          Répondre
  16. Stéphane KUENTZ Auteur de l’article

    Je n’ai pas de caméra IP pour tester, mais on peut adapter la fonction (ligne 48) :
    vs = VideoStream(usePiCamera=True, resolution=(1600, 1200)).start()
    en
    vs = VideoStream(“adresse_ip_de_la_caméra”).start()
    @++

    Répondre
  17. Ungrim

    Bonjour,
    Avant tout merci la framboise pour ce que vous faites.
    Sinon j’ai un souci quand je lance le script de test camera rien ne s’affiche.
    J’ai corriger le nom du fichier la résolution car 800X600 ne lui plaisait pas. J’ai changé en 800×608 comme le message d’erreur me le conseillé.
    J’ai installé la librairie python3_Xlib mais rien ne s’affiche.

    maconfig : pi3 / cameraPI / os rapsbian neuf / vnc et ssh / pas d’écran de branché sur le pi.

    Avez vous une idée ?

    Répondre
  18. alba

    bonjour,
    j’abandonne l’idée de faire fonctionner le test….

    maintenant quand je lance la reconnaissance, j’ai le message suivant :
    …chargement du modèle…
    Traceback (most recent call last):
    File “reconnaissance_objets.py”, line 43, in
    net = cv2.dnn.readNetFromCaffe(args[“prototxt”], args[“model”])
    cv2.error: OpenCV(3.4.3) /home/pi/packaging/opencv-python/opencv/modules/dnn/src/caffe/caffe_io.cpp:1121: error: (-2:Unspecified error) FAILED: fs.is_open(). Can’t open “MobileNetSSD_deploy.prototxt.txt” in function ‘ReadProtoFromTextFile’

    une idée d’une personne dévouée?

    Répondre
    1. Ungrim

      Bonjour,

      je n’ai pas réussi avec le test mais la reconnaissance fonctionne.
      J’ai commenté de la ligne 95 à 120 du fichier reconnaissance_objet.py pour l’envoie de mail.
      et J’ai télécharge les deux fichiers utile avec la commande :
      wget https://raw.githubusercontent.com/chuanqi305/MobileNet-SSD/master/voc/MobileNetSSD_deploy.prototxt
      et
      wget https://github.com/C-Aniruddh/realtime_object_recognition/blob/master/MobileNetSSD_deploy.caffemodel?raw=true
      à mettre avec le fichier reconnaissance_objets.py
      j’ai lancé la commande
      python3 reconnaissance_objets.py –prototxt MobileNetSSD_deploy.prototxt –model MobileNetSSD_deploy.caffemodel?raw=true

      En espérant que cela puisse vous aider.

      Répondre
  19. alba

    En effet j’avance, merci beaucoup, mais je bloque légèrement plus loin.

    …chargement du modèle…
    …démarrage de la Picamera…
    Traceback (most recent call last):
    File “reconnaissance_objets.py”, line 48, in
    vs = VideoStream(usePiCamera=True, resolution=(1600, 1200)).start()
    File “/usr/local/lib/python3.5/dist-packages/imutils/video/videostream.py”, line 13, in __init__
    from .pivideostream import PiVideoStream
    File “/usr/local/lib/python3.5/dist-packages/imutils/video/pivideostream.py”, line 2, in
    from picamera.array import PiRGBArray
    File “/usr/lib/python3.5/picamera.py”, line 3, in
    from picamera.array import PiRGBArray
    ImportError: No module named ‘picamera.array’; ‘picamera’ is not a package

    je n’en peu plus, la boucle se reboucle sur le fichier de test

    Répondre
    1. Ungrim

      J’ai l’impression que la librairie picamera.array n’est pas installé
      relance les commandes suivante :
      sudo pip install “picamera[array]”
      sudo pip3 install python3_xlib
      sudo pip3 install picamera
      sudo apt-get install numpy

      redémarre le pi au cas ou un process bloquerais l’utilisation de la camera.
      Quelle config avez vous ? “camera, OS, ecran “

      Répondre
        1. alba

          merci pout votre retour.
          j’ai retour disant que tout est installé.
          j’utilise une cam pi avec raspbian et un écran, et j’utilise Kerberos.io.

          Répondre
  20. Olivier33

    Même problème qu’Alba (celui de 13H13)
    Résolu par les conseils de Ungrim

    Un grand merci à Stéphane pour cet excellent Tuto, très clair et très bien expliqué. Grâce à toi, c’est ma première tentative réussie en Deep Learning (même si tu as fait le plus dur…) càd l’apprentissage)

    Vivement un second tuto pour l’apprentissage

    Répondre
  21. alba

    Bonsoir,
    je suis reparti avec un système vierge (Rasbian). J’ai suivi (me semble t-il) le tuto dans les règles et pas moyen de faire fonctionner le fichier de test.
    je continu malgré tout.
    j’ai suivi les conseil de Ungrim et malgré tout j’ai maintenant ce message d’erreur :

    python3 reconnaissance_objets.py –prototxt MobileNetSSD_deploy.prototxt –model MobileNetSSD_deploy.caffemodel?raw=trueMobileNetSSD_deploy.caffemodel
    …chargement du modèle…
    Traceback (most recent call last):
    File “reconnaissance_objets.py”, line 43, in
    net = cv2.dnn.readNetFromCaffe(args[“prototxt”], args[“model”])
    cv2.error: OpenCV(3.4.3) /home/pi/packaging/opencv-python/opencv/modules/dnn/src/caffe/caffe_io.cpp:1121: error: (-2:Unspecified error) FAILED: fs.is_open(). Can’t open “MobileNetSSD_deploy.prototxt” in function ‘ReadProtoFromTextFile’

    je commence à devenir fou…
    Si quelqu’un a une idée je suis preneur.

    Merci à tous

    Répondre
  22. alba

    Bonjour,

    J’ai finalement réussi en mettant tous les fichiers dans usr/lib/python3/dist-packages
    Je ne comprends pas pourquoi mais bon…
    Question, est-il possible de “streamer” facilement ce flux en rtsp pour être affichable en l’état avec VLC sur un autre PC?

    Merci

    Répondre
  23. Stéphane KUENTZ Auteur de l’article

    Bonjour,
    Oui c’est possible en rajoutant une condition “if” avant les instructions d’envoi d’e-mail.
    Il faut récupérer le “label” qui défini la prédiction, et l’affiche sur l’image.
    Par exemple, si le résultat est une personne, on exécute les instructions d’envoi d’un mail, mais pas si c’est une voiture.

    @++

    Répondre
  24. Stéphane KUENTZ Auteur de l’article

    Bonsoir,
    Après avoir passé quelques jours à étudier les réseaux neuronaux aux travers de la technologie Tensorflow, j’ai pu enfin créer mon propre modèle avec opencv 🙂
    Il est préférable d’entraîner le modele avec un PC équipé d’un processeur graphique (GPU), car ce dernier est particulièrement spécialisé dans le traitement d’images. Sinon, le CPU fera l’affaire à condition d’être patient.
    Si François est ok, je lui proposerais un tuto sur le sujet.

    Répondre
  25. Thierry QUENET

    Bonjour à tous,

    Avec un Raspberry Modèle B+ et une picamera 2, j’ai suivi à la lettre l’installation.
    Mais à l’exécution du fichier de test (renommé en test-video.py), pas d’ouverture de la fenêtre vidéo.
    J’ai réinstallé la carte SD, re suivi à la lettre les instructions, mais toujours le même souci.
    Y-a t’il quelqu’un qui a résolu ce problème ?

    Merci d’avance pour vos réponses

    Répondre
  26. Peronnau

    Bonjour
    Est il possible de faire de la reconnaissance d’objet sur une vidéo avec une raspberry sans qu’elle soit connectée à un ordinateur ? Je dois faire un système portable non connecté.
    Merci

    Répondre
  27. galinette

    Bonjour,

    J’ai eu cette erreur :
    Traceback (most recent call last):
    File “reconnaissance_objets.py”, line 58, in
    frame = imutils.resize(frame, width=800)
    File “/usr/lib/python3.4/site-packages/imutils/convenience.py”, line 69, in resize
    (h, w) = image.shape[:2]
    AttributeError: ‘tuple’ object has no attribute ‘shape’

    Corrigé avec :
    57 ret, frame = vs.read()

    Répondre
  28. Sébastien

    Pour le script de test de la picamera, il faut ajouter dans la boucle for une instruction pour afficher l’image:
    cv2.imshow(“Frame”, image)

    Répondre
  29. niko

    bonjour,
    merci pour ce tuto franchement c’est top. !!

    j’ai un petit soucis, au premier code python, quand je réalise le test je vois bien que la caméra fonctionne en revanche je n’ai pas de fenêtre qui s’ouvre pour visualiser ce que filme la cam.

    j’ai cette erreur qui s’affiche, sauf que là j’attaque un domaine que je ne maîtrise absolument pas et j’ai du mal à déchiffrer ces erreurs :
    Traceback (most recent call last):
    File “picamtest2.py”, line 18, in
    for frame in camera.capture_continuous(rawCapture, format=”bgr”, use_video_port=True):
    File “/usr/lib/python3/dist-packages/picamera/camera.py”, line 1702, in capture_continuous
    if not encoder.wait(self.CAPTURE_TIMEOUT):
    File “/usr/lib/python3/dist-packages/picamera/encoders.py”, line 393, in wait
    result = self.event.wait(timeout)
    File “/usr/lib/python3.5/threading.py”, line 549, in wait
    signaled = self._cond.wait(timeout)
    File “/usr/lib/python3.5/threading.py”, line 297, in wait
    gotit = waiter.acquire(True, timeout)
    KeyboardInterrupt

    voilà,
    si quelqu’un à 5 min à perdre pour m’aider à comprendre ce qui ne va pas svp…
    merci.

    Répondre
    1. QUENET

      Bonjour,

      Comme l’a indiqué Sébastien, il suffit de rajouter cette ligne :
      cv2.imshow(“Frame”, image)

      avant la ligne 24, ce qui donne :
      # affichage du flux vidéo
      cv2.imshow(“Frame”, image)
      key = cv2.waitKey(1) & 0xFF

      Et le tour est joué.

      Thierry

      Répondre
  30. Thierry QUENET

    Bonjour,

    Comme l’a indiqué Sébastien un peu plus haut, il suffit d’insérer cette ligne :
    cv2.imshow(“Frame”, image)
    avant la ligne 24, ce qui donne :
    # affichage du flux vidéo
    cv2.imshow(“Frame”, image)
    key = cv2.waitKey(1) & 0xFF
    Et le tour est joué !

    Thierry

    Répondre
    1. niko

      salut thierry,

      merci pour ta réponse rapide,
      j’ai bien effectuer les modifications mais j’ai cette erreur qui s’affiche :
      File “picamtest2.py”, line 24
      cv2.imshow(“Frame”, image)
      ^
      IndentationError: unindent does not match any outer indentation level

      du coup toujours perdu..lol..

      passez de bonnes fêtes de fin d’année !!!

      Répondre
  31. Stéphane KUENTZ Auteur de l’article

    Bonjour,
    Le problême d’indentation, vient du fait qu’il y a dans le code, une confusion entre l’emploi des espaces et de la tabulation.
    En Python, il est préférable de rédiger son code avec “uniquement” la touche TAB pour séparer chaque instruction. Le code est plus cohérent et facilement “décrypté” par l’interpréteur.
    N’hésitez pas à m’envoyer votre fichier picamtest2.py, par courriel.
    stephane.kuentz@hotmail.com
    @++

    Répondre
  32. Arbras

    Merci pour ce tutoriel très sympa et simple qui m’a donné envie d’en savoir plus sur le deep learning. D’un point de vue pratique, le code proposé envoie des mails à courir si on le laisse tourner, ce qui fait “ramer” le raspberrypi et sature la boîte mail 😉 Je cherche donc à filtrer la détection ou l’envoi à des objets plus ciblés. Celà pourrait passer par un entraînement du réseau sur des sujets précis. Un bon champ d’investigation en perspective…

    Répondre
  33. Nabla

    Salut stef-k,

    Très bonne idée de tuto qui me donne envie de m’y mettre enfin (avant, la compil … Pfff).
    Bon, le seul truc qui m’embête, comme tu peux t’en douter avec moi, c’est la relation avec Google 😉

    Au plaisir,
    ici ou ailleurs

    Répondre
    1. Fréd59

      Super le tuto.

      OpenCV enfin installé sur mon RPI3B+ avec PIP.
      Le test fonctionne parfaitement avec l’astuce de Sébastien, attention au ‘ au lieu des “.

      Je veux utiliser Opencv pour faire de la reconnaissance de caractères pour lire mon compteur d’eau. Est ce que quelq’un a déjà fait?

      Fréd.

      Répondre
      1. Hervé

        Bonsoir,
        Je me souviens avoir vu ça. Le principe utilisé était :
        – capture de l’image
        – découpe, une image pour chaque chiffre unitaire
        – comparaison des images récupérées avec les images des chiffres compteur de 0 à 9 capturées préalablement.

        Répondre
  34. Fred59

    Bonjour,

    Oui, c’est à cause ou plutôt grâce à Sébastien WARIN que je me suis lancé dans ce projet.
    Mais est ce que quelqu’un à mis en pratique?
    Moi oui et je galère un peu sur le post-traitement des images avec opencv.
    J’ai un méchant reflet générer par les LED utilisées pour éclairer les chiffres à lire.
    Je ne sais plus combien d’essais j’ai fait. Tantôt avec les LED IR, des LED blanches (6) puis seulement 3 puis 3 +3 afin de générer des reflets à des endroits différent en espérant qu’un traitement d’image de type logique pourrait supprimer les reflets mais rien n’y fait.
    Je séche complètement. Je ne sais pas comment mettre des images sur le blog pour me faire plus comprendre.
    Merci pour vos propositons….

    Fréd

    Répondre
  35. alba

    Bonjkour,

    J’ai besoin d’aide, suite à un plantage total… j’ai refait l’installation mais maintenant j’ai ce propblème, comme si la caméra était déjà utilisée :
    python3 reconnaissance_objets.py –prototxt MobileNetSSD_deploy.prototxt.txt –model MobileNetSSD_deploy.caffemodel?raw=true
    …chargement du modèle…
    …démarrage de la Picamera…
    mmal: mmal_vc_port_enable: failed to enable port vc.null_sink:in:0(OPQV): ENOSPC
    mmal: mmal_port_enable: failed to enable connected port (vc.null_sink:in:0(OPQV))0x10742f0 (ENOSPC)
    mmal: mmal_connection_enable: output port couldn’t be enabled
    Traceback (most recent call last):
    File “reconnaissance_objets.py”, line 48, in
    vs = VideoStream(usePiCamera=True, resolution=(1280,720)).start()
    File “/usr/local/lib/python3.5/dist-packages/imutils/video/videostream.py”, line 18, in __init__
    framerate=framerate)
    File “/usr/local/lib/python3.5/dist-packages/imutils/video/pivideostream.py”, line 10, in __init__
    self.camera = PiCamera()
    File “/usr/lib/python3/dist-packages/picamera/camera.py”, line 433, in __init__
    self._init_preview()
    File “/usr/lib/python3/dist-packages/picamera/camera.py”, line 513, in _init_preview
    self, self._camera.outputs[self.CAMERA_PREVIEW_PORT])
    File “/usr/lib/python3/dist-packages/picamera/renderers.py”, line 558, in __init__
    self.renderer.inputs[0].connect(source).enable()
    File “/usr/lib/python3/dist-packages/picamera/mmalobj.py”, line 2212, in enable
    prefix=”Failed to enable connection”)
    File “/usr/lib/python3/dist-packages/picamera/exc.py”, line 184, in mmal_check
    raise PiCameraMMALError(status, prefix)
    picamera.exc.PiCameraMMALError: Failed to enable connection: Out of resources

    Merci d’avance

    Répondre
  36. yoann

    Bonjour,

    Merci pour ce tuto je l’ai essayé et c’est assez sympa!
    Cependant le fps est juste horrible, de l’ordre de 1 image toute les 2s.
    Est-ce le cas chez vous? ceci est du a la puissance du raspberry?

    Merci

    Répondre
  37. Nico

    pi@raspberrypi:~/Desktop/Raspberry/reconnaissance_objetswebcamusb $ sudo python3 reconnaissance_objets.py
    usage: reconnaissance_objets.py [-h] -p PROTOTXT -m MODEL [-c CONFIDENCE]
    reconnaissance_objets.py: error: the following arguments are required: -p/–prototxt, -m/–model

    J’ai tout suivi à la lettre, si une personne aurait la solution à mon problème je lui serrais éternellement reconnaissant.

    Répondre
    1. alba

      A essayer (il y a 2 tirets) :

      python3 reconnaissance_objets.py –prototxt MobileNetSSD_deploy.prototxt.txt –model MobileNetSSD_deploy.caffemodel?raw=true

      Répondre
  38. Yann

    Bonjour à tous

    J’ai un problème avec l’une des premières commandes :
    $ sudo pip install opencv-contrib-python
    Selon la console aucun distribution ne correspond à opencv-contrib-python.
    J’ai essayé plusieurs fois, même après reboot du Raspberry et j’ai toujours la même erreur.
    Est-ce que quelqu’un a déjà rencontré ce problème et quelle solution avez vous trouvé svp ?
    Merci par avance !

    Répondre
  39. Alex

    Bonjour j’ai un problème quelqu’un a une solution ?

    pi@raspberrypi:~/Desktop/reconnaissance_objets $ python3 reconnaissance_objets.py –prototxt MobileNetSSD_deploy.prototxt.txt –model MobileNetSSD_deploy.caffemodel?raw=true
    usage: reconnaissance_objets.py [-h] -p PROTOTXT -m MODEL [-c CONFIDENCE]
    reconnaissance_objets.py: error: the following arguments are required: -p/–prototxt, -m/–model

    Alex

    Répondre
  40. Yann

    Ok problème apparemment résolu en passant par le site https://www.piwheels.org/ pour télécharger le package opencv-contrib-python.
    Il suffit d’ajouter l’adresse https://www.piwheels.org/simple dans le fichier config de pip pour que pip télécharge automatiquement opencv-contrib-python depuis piwheels.
    Cette solution évite de devoir compiler “à la main” pour ceux qui rencontreraient le même problème que moi.

    Répondre
  41. Alex

    Bonjour merci de votre réponse rapide mais mon fichier pip.conf contenais deja l’adresse donc j’ai toujours le meme probleme si vous avez une autre solution je suis preneur !

    Alex

    Répondre

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Complétez ce captcha SVP * Time limit is exhausted. Please reload CAPTCHA.

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.