Créez un système de surveillance pour animaux avec Raspberry Pi

DALL·E 2024 11 04 12.35.13 A clean minimalistic landscape style illustration showing a Raspberry Pi with icons for camera animal detection notifications and a web interface

Le Raspberry Pi est un ordinateur monocarte polyvalent qui, associé à des composants appropriés, peut être transformé en un système de surveillance intelligent pour animaux. Ce guide détaillé vous accompagnera pas à pas dans la création d’un tel système, intégrant la détection de mouvement, la reconnaissance d’animaux et l’envoi de notifications.

Vue d’ensemble du projet

Le projet permet de créer une solution de surveillance avancée pour animaux, capable de :

  • Détecter les mouvements à l’aide de la caméra.
  • Identifier les animaux via l’intelligence artificielle (IA).
  • Envoyer des notifications personnalisées par e-mail incluant des images et le type d’animal détecté.
  • Gérer les paramètres de configuration (types d’animaux, e-mail, alertes) via une interface web.

Matériel requis

  1. Raspberry Pi 4 (ou modèle supérieur)
  2. Caméra pour Raspberry Pi (module caméra officiel ou webcam USB compatible)
  3. Carte microSD (32 Go minimum) avec Raspberry Pi OS
  4. Clavier, souris et écran pour la configuration initiale
  5. Connexion internet (Wi-Fi ou Ethernet pour l’interface web)

Étape 1 : Installation et configuration initiale du Raspberry Pi

  1. Installer Raspberry Pi OS sur votre carte microSD en utilisant Raspberry Pi Imager.
  2. Démarrer et configurer le Raspberry Pi (réseau, date, langue).
  3. Mettre à jour le système :
sudo apt update && sudo apt upgrade -y

Étape 2 : Préparer la caméra et installer les bibliothèques d’IA

2.1 Activer et tester la caméra

Activez la caméra :

sudo raspi-config

Tester la caméra :

raspistill -o test.jpg

2.2 Installer OpenCV et TensorFlow Lite

Installer OpenCV pour la détection d’image :

    sudo apt install python3-opencv -y
    

    Télécharger et configurer le modèle MobileNet SSD pour la reconnaissance d’animaux :

    mkdir ~/models && cd ~/models
    wget https://storage.googleapis.com/download.tensorflow.org/models/tflite/coco_ssd_mobilenet_v1_1.0_quant_2018_06_29.zip
    unzip coco_ssd_mobilenet_v1_1.0_quant_2018_06_29.zip
    

    Étape 3 : Détection de mouvements et reconnaissance des animaux

    Nous allons créer un script Python pour analyser les images et détecter les animaux.

    Créez un fichier animal_surveillance.py :

      nano animal_surveillance.py
      

      Ajoutez le code suivant pour configurer la détection de mouvement, la capture d’images, et la reconnaissance des animaux :

      import cv2
      import tensorflow as tf
      import numpy as np
      from datetime import datetime
      import os
      
      # Charger le modèle TensorFlow Lite
      interpreter = tf.lite.Interpreter(model_path="~/models/detect.tflite")
      interpreter.allocate_tensors()
      input_details = interpreter.get_input_details()
      output_details = interpreter.get_output_details()
      
      # Définir les classes d'animaux détectables
      ANIMAL_CLASSES = {16: "Oiseau", 17: "Chat", 18: "Chien"}
      DETECTION_THRESHOLD = 0.5
      
      # Initialiser la caméra
      camera = cv2.VideoCapture(0)
      first_frame = None
      
      # Fonction pour détecter les animaux
      def detect_animal(frame):
          input_shape = input_details[0]['shape']
          frame_resized = cv2.resize(frame, (input_shape[1], input_shape[2]))
          input_data = np.expand_dims(frame_resized, axis=0)
          interpreter.set_tensor(input_details[0]['index'], input_data)
          interpreter.invoke()
          boxes = interpreter.get_tensor(output_details[0]['index'])[0]
          classes = interpreter.get_tensor(output_details[1]['index'])[0]
          scores = interpreter.get_tensor(output_details[2]['index'])[0]
          for i in range(len(scores)):
              if scores[i] >= DETECTION_THRESHOLD:
                  return ANIMAL_CLASSES.get(int(classes[i]), "Inconnu")
          return None
      
      # Fonction pour détecter les mouvements
      def detect_motion():
          global first_frame
          ret, frame = camera.read()
          gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
          gray = cv2.GaussianBlur(gray, (21, 21), 0)
      
          if first_frame is None:
              first_frame = gray
              return None
      
          delta_frame = cv2.absdiff(first_frame, gray)
          thresh_frame = cv2.threshold(delta_frame, 25, 255, cv2.THRESH_BINARY)[1]
          thresh_frame = cv2.dilate(thresh_frame, None, iterations=2)
          contours, _ = cv2.findContours(thresh_frame.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
      
          for contour in contours:
              if cv2.contourArea(contour) < 5000:
                  continue
              animal = detect_animal(frame)
              if animal:
                  timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
                  image_path = f"/home/pi/captures/{animal}_{timestamp}.jpg"
                  cv2.imwrite(image_path, frame)
                  return animal, image_path
          return None, None
      
      if __name__ == "__main__":
          os.makedirs("/home/pi/captures", exist_ok=True)
          print("Surveillance animale en cours...")
          while True:
              animal, image_path = detect_motion()
              if animal:
                  print(f"Animal détecté : {animal}")
                  # Notifications et alertes peuvent être ajoutées ici
      

      Le script détecte le mouvement, reconnaît les animaux, et enregistre une capture d’image pour chaque détection.

      Étape 4 : Interface Web avec Flask pour configurer les paramètres et afficher les captures

      Pour une gestion plus facile, nous allons créer une interface web permettant de configurer les paramètres d’alerte et de visualiser les images capturées.

      4.1 Installation de Flask

      pip3 install flask
      

      4.2 Création du Serveur Flask

      Créer un fichier app.py pour l’interface :

        nano app.py
        

        Ajouter le code Flask suivant pour configurer l’interface web :

        from flask import Flask, render_template, request, redirect, url_for
        import os
        
        app = Flask(__name__)
        
        # Stockage des paramètres
        config = {
            "email": "destination_email@example.com",
            "animals": ["Chat", "Chien"]
        }
        
        @app.route("/")
        def index():
            captures = os.listdir("/home/pi/captures/")
            captures = [f"/static/captures/{capture}" for capture in captures]
            return render_template("index.html", config=config, captures=captures)
        
        @app.route("/settings", methods=["POST"])
        def settings():
            config["email"] = request.form["email"]
            config["animals"] = request.form.getlist("animals")
            return redirect(url_for("index"))
        
        if __name__ == "__main__":
            app.run(host="0.0.0.0", port=5000)
        

        Créer le modèle HTML index.html pour gérer la configuration et visualiser les captures :

        <!DOCTYPE html>
        <html lang="en">
        <head>
            <meta charset="UTF-8">
            <title>Surveillance Animale</title>
        </head>
        <body>
            <h1>Configuration de Surveillance Animale</h1>
            <form action="/settings" method="post">
                <label for="email">E-mail de Notification :</label>
                <input type="email" name="email" value="{{ config.email }}" required><br>
                <label>Animaux Suivis :</label><br>
                <input type="checkbox" name="animals" value="Chat" {% if "Chat" in config.animals %}checked{% endif %}> Chat<br>
                <input type="checkbox" name="animals" value="Chien" {% if "Chien" in config.animals %}checked{% endif %}> Chien<br>
                <button type="submit">Enregistrer</button>
            </form>
            <h2>Captures :</h2>
            {% for capture in captures %}
                <img src="{{ capture }}" width="300"><br>
            {% endfor %}
        </body>
        </html>
        

        Démarrer le serveur Flask :

        python3 app.py
        

        Accédez à l’interface via http://<adresse_ip_du_raspberry_pi>:5000.

        Étape 5 : Configuration des notifications e-mail avec captures et détails d’animaux

        5.1 Installation et configuration de l’envoi d’e-mails

        Pour envoyer des notifications, nous utiliserons smtplib, une bibliothèque Python standard pour envoyer des e-mails via un serveur SMTP (par exemple, Gmail).

        Créer un fichier de configuration pour stocker vos informations de connexion e-mail de manière sécurisée.

          Créez un fichier config.py

          nano config.py
          

          Ajoutez les informations de connexion suivantes (en remplaçant par votre adresse et mot de passe) :

          EMAIL_ADDRESS = "votre_email@gmail.com"
          EMAIL_PASSWORD = "votre_mot_de_passe"
          

          Sauvegardez et fermez le fichier.

          Activer l’accès aux applications moins sécurisées dans votre compte Google (si vous utilisez Gmail), car smtplib nécessite une autorisation pour accéder à votre compte via SMTP.

          5.2 Ajouter la fonction d’envoi d’e-mails dans le script de surveillance

          Modifiez animal_surveillance.py pour inclure la fonction d’envoi d’e-mails, intégrant l’image capturée et le type d’animal détecté

          Ouvrez animal_surveillance.py et ajoutez la fonction suivante pour l’envoi des e-mails :

          import smtplib
          from email.mime.multipart import MIMEMultipart
          from email.mime.text import MIMEText
          from email.mime.image import MIMEImage
          import config  # Importer le fichier config pour récupérer l'email et le mot de passe
          
          def send_email_alert(image_path, detected_animal):
              # Créer un e-mail
              msg = MIMEMultipart()
              msg['From'] = config.EMAIL_ADDRESS
              msg['To'] = config.EMAIL_ADDRESS  # Envoyer à vous-même ou à l’adresse spécifiée dans config
              msg['Subject'] = f"Alerte : {detected_animal} détecté !"
          
              # Ajouter le corps du message
              body = f"Un {detected_animal} a été détecté par le système de surveillance animale."
              msg.attach(MIMEText(body, 'plain'))
          
              # Ajouter l'image en pièce jointe
              with open(image_path, 'rb') as f:
                  img_data = f.read()
                  image = MIMEImage(img_data, name=os.path.basename(image_path))
                  msg.attach(image)
          
              # Envoi de l'e-mail via SMTP
              try:
                  server = smtplib.SMTP('smtp.gmail.com', 587)
                  server.starttls()
                  server.login(config.EMAIL_ADDRESS, config.EMAIL_PASSWORD)
                  server.sendmail(config.EMAIL_ADDRESS, config.EMAIL_ADDRESS, msg.as_string())
                  server.quit()
                  print("E-mail envoyé avec succès.")
              except Exception as e:
                  print(f"Erreur lors de l'envoi de l'e-mail : {e}")
          

          Intégrer la fonction d’envoi d’e-mails dans le script de détection :

          • Modifiez la partie if animal: dans detect_motion() pour envoyer un e-mail avec les détails de l’animal détecté.
          if animal:
              timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
              image_path = f"/home/pi/captures/{animal}_{timestamp}.jpg"
              cv2.imwrite(image_path, frame)
              print(f"{animal} détecté. Image sauvegardée : {image_path}")
              send_email_alert(image_path, animal)  # Appel de la fonction d'envoi d'e-mail
          

          Sauvegardez et fermez le fichier animal_surveillance.py.

          Tester le script en exécutant :

          python3 animal_surveillance.py
          

          Lorsque le système détecte un mouvement et reconnaît un animal, il envoie un e-mail à l’adresse configurée avec l’image de l’animal détecté et le type d’animal dans le sujet de l’e-mail.

          Conclusion

          Ce guide fournit un système de surveillance animal intelligent complet utilisant le Raspberry Pi. Grâce à la détection de mouvement, la reconnaissance d’animaux, une interface web de configuration et des notifications e-mail détaillées, ce projet est une solution puissante et flexible pour surveiller vos animaux. Vous pouvez facilement personnaliser les paramètres d’alerte et ajouter de nouveaux types d’animaux via la configuration web.