Machine Learning & Computer Vision · Simplon x Microsoft

WildAIprint — Classification d'empreintes animales par Réseau Convolutif (ResNet50) & API Flask

Conception et entraînement d'un pipeline complet de vision par ordinateur pour la reconnaissance de 13 espèces animales à partir d'un jeu de données de 1 500 empreintes de terrain. Modèle Keras basé sur un backbone ResNet50 (Transfer Learning & Fine-Tuning en 2 phases avec suivi MLflow), exporté en model.keras et servi par une API Flask locale conteneurisée sous Docker Compose pour une inférence en temps réel (< 80ms) sans dépendance cloud.

13 Espèces Reconnues
83% Précision de Validation
< 80ms Inférence Locale CPU
Docker Conteneurisé & Autonome
MOTEUR RESNET50 · KERAS / TF
EXPÉRIMENTATION MLFLOW · 1 500 IMAGES
VALIDATION ACC 0.83 (83%) SANS OVERFIT
Volet 01 · Pipeline & Données

Le Défi de Terrain & Préparation du Dataset

Identifier avec certitude les traces d'animaux sauvages sur le terrain pose un défi complexe en vision par ordinateur : les empreintes sont imprimées sur des substrats hétérogènes (terre meuble, boue, neige, feuilles mortes), soumises à de fortes variations d'éclairage et fréquemment altérées par l'érosion.

Pour construire un modèle robuste, le jeu de données regroupe 1 500 images réparties sur 13 espèces animales (Castor 96, Chat 108, Chien 144, Coyote 126, Écureuil 114, Lapin 66, Loup 108, Lynx 144, Ours 132, Puma 132, Rat 60, Raton laveur 138, Renard 132). Un pipeline rigoureux de nettoyage automatisé a été mis en œuvre : suppression des fichiers corrompus et élimination des doublons par hachage MD5.

La préparation s'appuie sur un split reproductible 80% entraînement / 20% validation (batch 16, graine fixe 12). Une stratégie d'augmentation de données complète l'apprentissage : enrichissement offline (rotations, symétries, variations d'exposition) et couches Keras d'augmentation à la volée (RandomFlip, RandomZoom, RandomBrightness) pour garantir une invariance maximale aux conditions de prise de vue.

1 500 Images Labellisées 13 Classes Faune Déduplication MD5 Split 80/20 Reproductible
Volet 02 · Transfer Learning & Fine-Tuning

Architecture ResNet50, Entraînement en 2 Phases & MLflow

Pour surpasser les limites d'un réseau convolutif entraîné from scratch sur un dataset spécialisé, le système adopte un backbone ResNet50 pré-entraîné sur ImageNet (sans top classifier). Les images RGB 256×256 sont traitées par une tête dense personnalisée associant GlobalAveragePooling2D, une couche de régularisation Dropout(0.5), une couche Dense(128, activation='relu') suivie d'un Dropout(0.3) et d'une sortie Dense(13, softmax).

L'optimisation s'est articulée en deux phases méthodiques : d'abord le gel du backbone pour entraîner exclusivement la tête de classification (optimiseur Adam, learning rate 1e-3), puis un fine-tuning contrôlé en dégelant les 30 dernières couches de ResNet50 avec un pas d'apprentissage très fin (lr=1e-5) et un callback EarlyStopping.

L'ensemble des expérimentations a été instrumenté via MLflow Tracking (autolog Keras), avec équilibrage dynamique des poids (compute_class_weight) pour compenser les classes minoritaires (Rat, Lapin) et scheduler ReduceLROnPlateau. Le modèle atteint une précision de validation de 83% avec des courbes d'apprentissage et de loss parfaitement parallèles et stables, confirmant l'absence de surapprentissage.

01 Input (256×256) Normalisation & Augmentation
02 ResNet50 Backbone Transfer Learning ImageNet
03 Tête Custom & Dropout GlobalAvgPool + Dense 128
04 Softmax 13 Classes Export model.keras
ResNet50 Backbone Fine-Tuning 2 Phases MLflow Tracking 83% Précision Validation
Volet 03 · Application & Docker

Application Web Flask, Inférence Locale & Docker

Pour être véritablement exploitable par des agents de protection de la faune ou des naturalistes sur le terrain, l'outil ne pouvait pas dépendre d'une connexion internet ou d'un service cloud distant. Les artefacts générés (model.keras pour les poids et class_names.json pour le mapping ordonné des classes) sont chargés en mémoire au démarrage d'une API web autonome sous Flask.

L'ensemble du système (serveur Flask, moteur d'inférence TensorFlow/Keras, base SQLite pour l'historique des relevés géolocalisés) est conteneurisé via Docker Compose. Une simple commande permet de déployer l'environnement complet de manière reproductible et isolée, garantissant un temps de réponse moyen inférieur à 80 millisecondes par requête d'inférence sur CPU standard.

Flask API Docker & Docker Compose Artefacts model.keras & JSON Inférence CPU < 80ms
Dataset de Terrain · Inspecteur Morphologique

Exploration des 13 Espèces Fauniques & Signatures Morphologiques

01 / 13
CLASSE 01 / 13 · PRÉCISION 96.4% Puma / Cougar
Félin · Empreinte d'Auteur

Puma / Cougar

Puma concolor · Famille des Félidés
Griffes : Rétractiles · Zéro marque visible au sol
Coussinet : 4 pelotes · Base trilobée asymétrique
Démarche : Pas direct feutré · Trace nette en ligne

Grand félin discret. L'absence systématique de griffes au sol et la forme asymétrique du coussinet plantaire (trois lobes nets à l'arrière) constituent la signature morphologique principale extraite par les premiers blocs de convolution du CNN.

Rappel Modèle : 96.4%
Inférence CPU : 64ms
Substrats : Neige, boue, terre meuble
Sélecteur Rapide · Cliquez pour basculer d'espèce

Collaboration & Dépôts Publics

Projet d'équipe mené dans le cadre de la formation Simplon x Microsoft avec Yasmine Sayad, Valentin Phan, Brunel et Valentin Périès. Chaque membre a exploré des architectures candidates ; le modèle ResNet50 retenu pour la webapp finale est celui développé par Yasmine Sayad, tandis que Valentin Périès a piloté le suivi MLflow, le nettoyage du dataset et l'inférence locale Flask.