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

Écran OLED

Câble USB C

Petit dissipateur thermique 9×9 mm

Jeu de fils Dupont

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.

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 :

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 :

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 :

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 :

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

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 :

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-lite | XIAO | |
|---|---|---|
| SDA | GPIO19 | D4 / GPIO5 |
| SCL | GPIO23 | D5 / 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 :

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 :

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 :

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 :

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 😉

