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
- Raspberry Pi 4 (ou modèle supérieur)
- Caméra pour Raspberry Pi (module caméra officiel ou webcam USB compatible)
- Carte microSD (32 Go minimum) avec Raspberry Pi OS
- Clavier, souris et écran pour la configuration initiale
- Connexion internet (Wi-Fi ou Ethernet pour l’interface web)
Étape 1 : Installation et configuration initiale du Raspberry Pi
- Installer Raspberry Pi OS sur votre carte microSD en utilisant Raspberry Pi Imager.
- Démarrer et configurer le Raspberry Pi (réseau, date, langue).
- 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 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:
dansdetect_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.