Skip to Content

Capteur d’occupation de pièce Edge AI avec ESP32 et détection de personnes

Capteur d’occupation de pièce Edge AI avec ESP32 et détection de personnes

Dans ce tutoriel, nous allons utiliser l’Edge AI pour détecter le nombre de personnes dans une pièce (occupation) avec un XIAO ESP32-S3-Sense et un ESP32 lite. Si vous n’avez jamais utilisé le XIAO-ESP32-S3 Sense auparavant, jetez un œil au Getting started with XIAO-ESP32-S3-Sense tutoriel d’abord.

Nous allons déployer un modèle de détection de personnes sur le XIAO ESP32-S3-Sense en utilisant la plateforme SenseCraft AI. Le modèle fonctionnera sur l’ESP32 sans avoir besoin d’interagir avec un serveur pour effectuer la détection ou le comptage des personnes.

Un capteur d’occupation de pièce a de nombreuses applications pratiques, tant en DIY qu’en milieu professionnel. Dans les maisons intelligentes, il peut ajuster l’éclairage, le chauffage et les systèmes de sécurité en fonction de la présence. Dans les bureaux, écoles et espaces commerciaux, il aide à surveiller l’utilisation des salles, gérer l’efficacité énergétique et améliorer l’utilisation de l’espace. Les magasins et lieux publics peuvent l’utiliser pour le comptage des personnes, la gestion des files d’attente et la conformité aux normes de sécurité.

Commençons !

Pièces requises

Vous aurez besoin d’une carte XIAO ESP32-S3-Sense et d’un second ESP32. Notez que le XIAO ESP32-S3-Sense peut devenir très chaud sous une charge de calcul élevée. Je recommande d’y fixer un petit Heatsink dissipateur thermique à l’arrière de la carte (voir la pièce listée ci-dessous).

Pour le second ESP32, j’ai choisi un ESP32 lite plus ancien, mais tout autre ESP32 ou Arduino fonctionnera très bien également.

Seeed Studio XIAO ESP32-S3-Sense

ESP32 lite Lolin32

ESP32-lite

OLED display

Écran OLED

Câble USB C

Petit dissipateur thermique 9×9 mm

Dupont wire set

Jeu de fils Dupont

Half_breadboard56a

Plaque d’essai (breadboard)

Makerguides is a participant in affiliate advertising programs designed to provide a means for sites to earn advertising fees by linking to Amazon, AliExpress, Elecrow, and other sites. As an Affiliate we may earn from qualifying purchases.

Architecture du capteur d’occupation

Notre système de capteur d’occupation sera composé des éléments suivants : un XIAO ESP32S3 Sense avec une caméra qui exécute un modèle de détection de personnes, un ESP32-lite qui analyse les détections pour compter les personnes, et un OLED pour afficher le compteur de personnes.

Architecture of Room Occupancy Sensor System
Architecture du système de capteur d’occupation de pièce

Les deux ESP32 et l’OLED communiquent via I2C. L’ESP32 que nous allons programmer avec l’Arduino IDE et le modèle de détection de personnes sera déployé sur le XIAO ESP32S3 Sense depuis le SenseCraft AI platform. Si vous souhaitez en savoir plus sur le XIAO ESP32-S3-Sense, consultez le Getting started with XIAO-ESP32-S3-Sense tutoriel.

La raison pour laquelle nous avons besoin du second ESP32-lite est que nous ne pouvons pas (facilement) exécuter d’autres codes sur le XIAO ESP32S3 Sense à part le modèle de détection de personnes. Cela a l’avantage que vous n’avez pas besoin d’écrire de code pour la détection de personnes et que vous ne vous souciez pas de la charge de calcul supplémentaire sur le XIAO ESP32S3 Sense. L’inconvénient est que vous n’avez pas un contrôle total sur le modèle de détection (et que vous avez besoin du second ESP32).

La photo suivante montre le système monté sur une breadboard avec une batterie externe comme source d’alimentation :

Room Occupancy Sensor System on Breadboard
Système de capteur d’occupation de pièce sur breadboard

Comme vous pouvez le voir, j’ai fixé la breadboard à un petit support pour que la caméra soit orientée vers l’avant. Dans la section suivante, nous déployons le modèle de détection de personnes sur le XIAO ESP32S3 Sense.

Déployer le modèle de détection de personnes

Rendez-vous sur la page de sélection des modèles SenseCraft à https://sensecraft.seeed.cc/ai/model. Dans l’onglet « Pretrained Models » de la barre latérale, sélectionnez sous Task : « Detection » et sous Supported Devices : « XIAO ESP32S3 Sense ». Ensuite, tapez « Person » dans la barre de recherche pour filtrer les modèles de détection de personnes :

Model Selection
Sélection du modèle

En juillet 2025, il n’y a qu’un seul résultat. Cliquez sur le modèle Person Detection–Swift YOLO (marqué en jaune) à droite.

Cela ouvrira une nouvelle page avec une description du modèle de détection et un bouton vert « Deploy Model » à droite :

Description of selected Person Detection Model
Description du modèle de détection de personnes sélectionné

Connectez votre carte XIAO ESP32-S3-Sense via USB à votre ordinateur, puis cliquez sur « Deploy Model ». Suivez les étapes. Si vous avez besoin d’aide, consultez le Face Detection with XIAO ESP32-S3-Sense and SenseCraft AI tutoriel, qui décrit le processus de déploiement en détail.

Tester le modèle de détection de personnes

Une fois le modèle déployé, il démarre automatiquement et envoie des images avec des cadres autour des personnes détectées vers votre navigateur web, où vous pouvez suivre un flux en direct dans la section Preview. En haut à droite de cette section se trouve un bouton « Stop » pour arrêter le modèle en cours d’exécution. L’image ci-dessous montre la fenêtre Preview avec les détections de personnes :

Preview of detected persons
Aperçu des personnes détectées

Pour tester le modèle, j’ai simplement placé l’image suivante avec des personnes devant la caméra.

Photo de personnes dans une pièce (source)

Vous pouvez voir que le modèle détecte la plupart des personnes sur la photo, mais ce n’est pas parfait. Il y a deux réglages (Confidence et IoU threshold) sous la fenêtre Preview que vous pouvez ajuster pour améliorer la précision de la détection.

Si le système détecte trop peu de personnes, baissez le seuil de confiance ; s’il détecte des objets comme des personnes, augmentez ce seuil.

Si vous constatez qu’une même personne est couverte par plusieurs cadres de détection, baissez le seuil IoU. À l’inverse, si les cadres sont trop grands, augmentez ce seuil. Pour plus de détails, consultez le Face Detection with XIAO ESP32-S3-Sense and SenseCraft AI tutoriel.

Dans la section suivante, nous allons écrire le code pour compter les personnes dans la pièce. Ce code tournera sur l’ESP32-lite.

Connexion du ESP32-S3-Sense au ESP32-lite

Comme mentionné, le modèle de détection de personnes tourne sur la carte XIAO ESP32-S3-Sense. Nous pouvons communiquer avec cette carte via I2C. Le schéma de câblage suivant montre comment connecter le XIAO ESP32-S3-Sense à l’ESP32-lite :

Connecting XIAO ESP32-S3-Sense to ESP32 lite via I2C
Connexion du XIAO ESP32-S3-Sense à l’ESP32-lite via I2C

Les broches I2C sur l’ESP32-lite sont SDA=GPIO19 et SCL=GPIO23. Les broches correspondantes sur l’ESP32-S3-Sense sont SDA=D4/GPIO5 et SCL=D5/GPIO4. Notez que le schéma ci-dessus montre l’arrière des cartes, où les sorties digitales sont étiquetées (D0…D10).

ESP32-liteXIAO
SDAGPIO19D4 / GPIO5
SCLGPIO23D5 / GPIO4

Si vous utilisez un autre ESP32 ou Arduino, les broches matérielles I2C seront différentes. Assurez-vous de connecter les bonnes broches, sinon la communication échouera.

Dans la section suivante, nous allons tester cette connexion en récupérant les détections du XIAO ESP32-S3-Sense et en les affichant sur l’ESP32-lite.

Code pour la communication série

Pour que le code suivant fonctionne, vous devez d’abord installer la Seeed_Arduino_SSCMA bibliothèque. Ouvrez le LIBRARY MANAGER, cherchez « Seeed_Arduino_SSCMA » et cliquez sur le bouton INSTALL :

Installing Seeed_Arduino_SSCMA library
Installation de la bibliothèque Seeed_Arduino_SSCMA

Ensuite, connectez l’ESP32-lite à votre ordinateur via USB et téléversez le code suivant :

#include <Wire.h>
#include <Seeed_Arduino_SSCMA.h>

SSCMA detector;

void setup() {
  Serial.begin(115200);
  Wire.begin();
  detector.begin(&Wire);
  Serial.println("running...");
}

void loop() {
  if (!detector.invoke(1, false, false)) {
    for (int i = 0; i < detector.boxes().size(); i++) {
      boxes_t &b = detector.boxes()[i];
      Serial.printf("Box[%d] conf=%d [%3d %3d %3d %3d]\n",
                    i, b.score, b.x, b.y, b.w, b.h);
    }
  }
}

Ce code invoque le détecteur de personnes tournant sur l’ESP32-S3-Sense et affiche les scores de confiance ainsi que les cadres de détection pour chaque personne détectée dans le Moniteur Série. Consultez le Face Detection with XIAO ESP32-S3-Sense and SenseCraft AI, si vous avez des questions sur ce code.

Si tout est correctement câblé et fonctionne, vous devriez voir les résultats de détection affichés dans le Moniteur Série comme suit :

Person detection results on Serial Monitor
Résultats de détection de personnes sur le Moniteur Série

Dans la section suivante, nous écrivons le code pour compter le nombre de personnes.

Code pour l’occupation de la pièce

Une fois que nous avons les cadres de détection des personnes, calculer l’occupation de la pièce est simple. Il suffit de compter le nombre de cadres de détection.

Mais il serait pratique de voir ce nombre sur un écran pour rendre le système indépendant d’une connexion USB à un PC. Nous ajoutons donc un petit écran OLED au circuit pour afficher le nombre de personnes dans la pièce. L’image ci-dessous montre le schéma de câblage :

Connecting OLED to ESP32-lite
Connexion de l’OLED à l’ESP32-lite

Il suffit de connecter l’alimentation de l’ESP32 (3.3V et GND) à l’OLED, puis de connecter SCL et SDA en parallèle à la connexion I2C existante.

Le code suivant tourne sur l’ESP32-lite. Il communique avec le détecteur de personnes sur l’ESP32-S3-Sense via I2C. Il invoque le détecteur, récupère le nombre n de cadres de détection et affiche ce nombre sur l’OLED :

#include <Wire.h>
#include <Seeed_Arduino_SSCMA.h>
#include <Adafruit_SSD1306.h>

SSCMA detector;
Adafruit_SSD1306 oled(128, 64, &Wire, -1);

void setup() {
  Wire.begin();
  detector.begin(&Wire);

  oled.begin(SSD1306_SWITCHCAPVCC, 0x3C);
  oled.setRotation(3);
  oled.setTextSize(6);
  oled.setTextColor(WHITE);
}

void loop() {
  if (!detector.invoke(1, false, false)) {
    int n = detector.boxes().size();
    oled.clearDisplay();  
    oled.setCursor(10, 20);
    oled.printf("%d", n);  
    oled.display();
  }
}

Notez que le code utilise la bibliothèque Adafruit_SSD1306, que vous pouvez installer via le Library Manager comme d’habitude. Regardons le code de plus près.

Bibliothèques

D’abord, nous incluons la bibliothèque Wire pour la communication I2C, Seeed_Arduino_SSCMA pour communiquer avec le modèle de détection de personnes, et la bibliothèque Adafruit_SSD1306 pour contrôler l’OLED.

#include <Wire.h>
#include <Seeed_Arduino_SSCMA.h>
#include <Adafruit_SSD1306.h>

Objets

Ensuite, nous créons l’objet detector et l’objet oled :

SSCMA detector;
Adafruit_SSD1306 oled(128, 64, &Wire, -1);

Setup

Dans la fonction setup, nous initialisons le détecteur et l’OLED :

void setup() {
  Wire.begin();
  detector.begin(&Wire);

  oled.begin(SSD1306_SWITCHCAPVCC, 0x3C);
  oled.setRotation(3);
  oled.setTextSize(6);
  oled.setTextColor(WHITE);
}

Notez que l’adresse I2C de l’OLED que j’utilise est 0x3C. Si vous avez un OLED avec une adresse différente, vous devrez modifier le code ici.

Loop

Enfin, nous avons la fonction loop, où nous invoquons le modèle de détection, récupérons le nombre de cadres et affichons ce nombre comme compteur de personnes sur l’OLED :

void loop() {
  if (!detector.invoke(1, false, false)) {
    int n = detector.boxes().size();
    oled.clearDisplay();  
    oled.setCursor(10, 20);
    oled.printf("%d", n);  
    oled.display();
  }
}

Si vous observez le détecteur de personnes, vous remarquerez que les détections ne sont pas stables. Les cadres apparaissent et disparaissent, même pour une image statique. Dans un scénario réel, où les personnes bougent dans une pièce, les occultations et les changements d’éclairage ajoutent encore plus de variabilité. Les trois exemples suivants illustrent cette variabilité même pour une image fixe :

Unstable detection of persons
Détection instable des personnes

Stabilisation du comptage des personnes

Pour rendre le comptage des personnes un peu plus stable, vous pouvez calculer une moyenne glissante. Les fonctions suivantes font la moyenne de trois comptages consécutifs n, ce qui stabilise un peu le résultat :

int average3(int n) {
  static int prev1 = 0, prev2 = 0;

  int avg = (n + prev1 + prev2 + 1) / 3; 
  prev2 = prev1;
  prev1 = n;

  return avg;
}

Dans la fonction loop, vous l’appelez comme suit :

void loop() {
  if (!detector.invoke(1, false, false)) {
    int n = detector.boxes().size();
    n = average3(n);
    ...
    oled.printf("%d", n);  
    oled.display();
  }
}

Le compromis est, bien sûr, que le compteur de personnes met plus de temps à réagir aux changements du nombre de personnes dans la pièce. Mais cela convient si vous souhaitez ajuster le chauffage, la ventilation, l’éclairage ou le volume de la musique en fonction du nombre de personnes. Des changements trop rapides de ces conditions ne sont généralement pas nécessaires.

Et voilà !

Conclusions et commentaires

Dans ce tutoriel, nous avons construit un capteur d’occupation de pièce. Notre capteur fonctionne comme un dispositif Edge AI et n’a pas besoin d’être connecté à un serveur. La détection des personnes et le calcul du nombre de personnes se font directement sur l’appareil.

La plateforme SenseCraft AI facilite grandement le déploiement d’un modèle sur le XIAO ESP32-S3-Sense, mais l’inconvénient est que vous avez besoin d’un second microcontrôleur pour tout traitement supplémentaire. De plus, votre contrôle sur le modèle est limité et je n’ai pas vu de méthode pour récupérer les détections de personnes ni le flux vidéo.

Cependant, si vous diffusez la vidéo vers un serveur de toute façon, vous pourriez aussi y exécuter le détecteur de personnes. Jetez un œil à nos Object Detection with ESP32-CAM and YOLO et les Stream Video with with XIAO-ESP32-S3-Sense tutoriels.

En raison de la puissance de calcul limitée, vous ne pouvez exécuter que des modèles d’IA relativement petits sur un microcontrôleur. La précision de la détection de personnes et donc des mesures d’occupation n’est pas aussi bonne que celle d’un modèle plus grand tournant sur un serveur avec GPU, par exemple.

En revanche, si la confidentialité est une préoccupation, que la communication Wi-Fi est instable ou que vous souhaitez fonctionner sur batterie, une solution Edge AI est préférable. Et même si la précision du modèle n’est pas excellente, elle est suffisante pour réguler le chauffage ou la ventilation d’une pièce.

Si vous avez des questions, n’hésitez pas à les laisser dans la section commentaires.

Bon bricolage 😉