Apprenez à classifier automatiquement les pièces d'un bâtiment BIM — sans aucun machine learning, juste de la géométrie et de la topologie.
Un outil qui devine la fonction de chaque pièce (chambre, cuisine, SDB…) à partir d'un modèle Revit — sans jamais lire les noms.
Dans un modèle Revit, chaque pièce a un nom donné par l'architecte (« Séjour », « CH1 », « SDB »…). Mais ces noms sont incohérents d'un projet à l'autre. On veut deviner la fonction réelle de chaque pièce sans ces noms.
Le classifieur analyse uniquement la géométrie (surface, fenêtres, portes) et la topologie (qui est connecté à qui dans le graphe spatial). Pas de machine learning — juste des règles métier architecturales organisées en 5 passes successives.
97.7% de précision sur 1 217 pièces (multi-projets) et 93.4% sur 362 pièces (projet LD-CLL). Le tout avec zéro dépendance externe — Python stdlib uniquement.
3 étapes, 2 minutes, zéro dépendance à installer.
Vérifiez votre version :
Aucune dépendance à installer (pip install non nécessaire). Le projet n'utilise que la bibliothèque standard Python.
requirements.txt à installer, pas de virtualenv obligatoire, pas de GPU. Tout tourne sur CPU en quelques secondes.Où trouver quoi dans le dépôt.
spatial_graph_P1.json — Multi-projets (1 217 pièces labellisées)spatial_graph_P2.json — Projet LD-CLL (362 pièces)spatial_graph_P3.json à P5.json — Datasets supplémentairesblind_classifier.py — Le cœur : toutes les règles de classification (5 passes)apartment_clustering_v2.py — Regroupe les pièces par appartementexport_viewer.py — Génère le viewer HTML interactif_baseline.py — Lance le benchmark d'accuracyrules/ — 8 modules de règles modularisés (géométrique, topologique…)wl/ — Algorithme de hashing Weisfeiler-Lehman
Deux façons de lancer le classifieur : interface web ou ligne de commande.
La manière la plus simple. Lance un serveur local avec une UI pour tout contrôler.
1. Cliquez sur un dataset (P1, P2…) ou collez le chemin d'un JSON
2. Cliquez « Lancer la classification » pour voir l'accuracy
3. Cliquez « Générer le Viewer HTML » pour la visualisation complète
4. Cliquez « Ouvrir le Viewer ↗ » pour explorer le résultat
Pour les utilisateurs avancés ou l'automatisation.
Classification + Viewer interactif :
Benchmark d'accuracy uniquement :
Comment le classifieur devine la fonction de chaque pièce, passe par passe.
Détecte les entrées d'appartement par analyse de graphe pur (betweenness + closeness centrality). Identifie les nœuds « ponts » entre parties communes et intérieur.
Calcule une empreinte unique de chaque appartement (Weisfeiler-Lehman). Si elle matche un des 24 templates connus → classification instantanée avec confiance 1.0.
9 règles basées sur la surface, le nombre de portes/fenêtres, le ratio de séparateurs. Ex : « surface 2-3m² + 0 fenêtre + 0 séparateur → WC ».
Utilise le voisinage des pièces déjà classées (« ancres ») pour deviner les pièces restantes. Ex : « WC connecté uniquement à une chambre → SDB ».
Vérifie la cohérence au niveau de l'appartement entier : unicité de la cuisine, détection de la buanderie dans les grands logements, récupération des cuisines manquantes.
Dernier filet de sécurité : si un appartement n'a pas de cuisine, de séjour ou de WC, tente de reclasser une pièce ambiguë pour combler le manque.
Corrections fines par WL local, détection de hubs, reclassement corridor↔entrée, toilet→buanderie, storage→WC. Dernière couche d'optimisation.
Comment un agent IA peut faire de la recherche expérimentale pendant que vous dormez — et comment nous l'avons appliqué à ce projet.
Autoresearch est un framework créé par Andrej Karpathy (ex-directeur IA chez Tesla, co-fondateur d'OpenAI) en mars 2026. L'idée fondatrice : au lieu d'écrire du code, on écrit un programme pour l'agent qui écrit le code.
Le concept repose sur trois piliers :
train.py). Cela limite le périmètre d'action et rend chaque changement auditable.
val_bpb). Pas de subjectivité : le score monte ou descend.
program.md remplace le chercheur humain. C'est un document qui décrit la boucle expérimentale, les règles de décision (keep/discard), et les gardes anti-régression.
Le cœur d'autoresearch est une boucle infinie en 4 étapes :
L'agent lit le code, analyse les erreurs du dernier run, et propose une modification ciblée. Ex : « Baisser le seuil de surface WC de 3.0 à 2.8m² ».
L'agent modifie le fichier, fait un git commit, puis lance le script d'évaluation. La sortie est redirigée vers un log pour ne pas polluer le contexte.
L'agent extrait la métrique du log (grep "^score:"). Si le grep est vide → crash. Sinon, il compare au score précédent.
Si le score s'améliore et que les gardes anti-régression passent → keep, on avance. Sinon → discard, git reset --hard HEAD~1. On log le résultat dans results.tsv et on recommence.
Voici à quoi ressemble le results.tsv après une session autonome sur nanochat :
Chaque ligne = une expérience complète (~5 min). L'agent a exploré des changements d'architecture, d'optimiseur, de taille de batch — trouvant des améliorations que des chercheurs humains avaient manquées.
Nous avons adapté le framework autoresearch à la classification de pièces BIM. L'adaptation est remarquable car notre domaine n'utilise aucun réseau de neurones — c'est de la recherche sur des règles métier.
train.pyblind_classifier.pyCe que l'agent explore dans notre cas :
Voici une interaction réaliste avec l'agent sur notre classifieur :
Au-delà de l'optimisation de seuils, la méthode autoresearch ouvre des axes de recherche radicalement nouveaux :
apartment_clustering_v2.py est actuellement read-only. Mais on pourrait créer un second pipeline autoresearch dédié, avec sa propre métrique (ex: Adjusted Rand Index entre clusters prédits et clusters réels).
Agent: J'observe que 3 appartements sont fusionnés en 1 cluster sur P2.
Hypothèse: ajouter un critère de séparation par niveau.
→ ARI passe de 0.87 à 0.91. KEEP.
→ Downstream: accuracy_P2 monte de 93.4 à 94.2 (+0.8%).
pareto_score = score × (1 - 0.001 × num_rules)
EngineAntigravity) décide quelles features extraire. Un autoresearch en amont pourrait explorer : quelles données supplémentaires du modèle BIM faudrait-il exporter ?
Adversaire: Je crée une pièce de 9m², 1 porte, 0 fenêtre, sep_ratio=0.4.
→ Le classifieur dit "kitchen". Le label est "storage".
Défenseur: J'ajoute une garde : kitchen requiert ≥1 fenêtre OU sep_ratio>0.6.
→ L'adversaire ne peut plus exploiter ce pattern. Score +0.3%.
graph_templates.py comme nouveaux templatesprogram.md légèrement différent (un plus conservateur, un plus radical, un spécialisé sur les faux positifs…). Après 100 expériences chacun, on fusionne les meilleures découvertes.
Agent-A (conservateur): 12 keeps / 88 discards. Score: 96.1
Agent-B (radical): 4 keeps / 96 discards. Score: 97.3 (!)
Agent-C (spécialiste WL): 8 keeps / 92 discards. Score: 96.5
→ On cherry-pick les 24 keeps et on les combine. Score final: 97.8
program.md est lui-même un sujet de recherche. Comme le dit Karpathy : « Vous ne programmez plus le programme — vous programmez le programme qui programme le programme. » Itérer sur le program.md (ton, niveau de détail, stratégie d'exploration) peut avoir autant d'impact que les expériences elles-mêmes.Comment interpréter la visualisation interactive.
Les questions les plus fréquentes.
.json dans le dossier data/python classify_launcher.pypython src/export_viewer.py data/mon_fichier.json
autoresearch/) :git checkout -b autoresearch/montestsrc/blind_classifier.pypython autoresearch/run_baseline.pyautoresearch/program.md pour le protocole complet.
python --version (≥ 3.10 requis)python au lieu de python3