Chaque appartement doit avoir exactement une entrée. Cette passe corrige les cas de surplus ou d'absence.
Un appartement français possède toujours exactement un hall d'entrée. Après les passes 0 à 4, certains appartements peuvent se retrouver avec 0 ou 2+ entrées. La Passe 5 corrige ces incohérences.
Dans l'habitat français, l'entrée est le point de distribution principal de l'appartement. Elle connecte le palier ou l'extérieur aux espaces de vie. Chaque logement en possède une et une seule.
La passe itère sur chaque appartement (cluster) et distingue deux situations problématiques : surplus (≥ 2 entrées détectées) et absence (0 entrée détectée). Chaque cas a sa propre stratégie de correction.
Avant le comptage, les entrées situées trop haut (centroïde Z > ref_z + 2.5 m) sont reclassées en corridor (conf 0.80). En maison, l'entrée est toujours au rez-de-chaussée. Les entrées verrouillées (conf = 1.0) ne sont jamais dégradées.
Quand un appartement a deux entrées ou plus, il faut en conserver une seule et reclasser les autres.
L'algorithme sélectionne l'entrée à conserver selon une hiérarchie de priorité :
entrance_ids (seed du clustering spatial)Chaque entrée qui n'est pas le keeper est reclassée en corridor avec une confiance de 0.80. Ce choix reflète le fait qu'un « faux hall d'entrée » est presque toujours un espace de circulation.
Les entrées avec une confiance ≥ 0.90 ne sont jamais reclassées, même si elles ne sont pas le keeper. Cela évite de dégrader une classification quasi-certaine dans les cas d'appartements atypiques (duplex, etc.).
# Sélection du keeper — priorité décroissante locked_match = [r for r in entrance_halls if r.confidence >= 0.95] btw_match = [r for r in entrance_halls if str(r.id) in btw_entrance_set] if locked_match: keeper = locked_match[0] elif btw_match: keeper = btw_match[0] else: keeper = max(entrance_halls, key=lambda r: r.confidence) # Reclasser les surplus (sauf haute confiance) for r in entrance_halls: if r is not keeper: if r.confidence >= 0.90: continue r.room_type = "corridor" r.confidence = 0.80
Si aucun hall d'entrée n'a été détecté dans l'appartement, la passe tente de promouvoir le meilleur candidat.
L'algorithme parcourt les pièces de l'appartement et cherche celle dont l'identifiant appartient à entrance_ids (le jeu de seeds du clustering spatial, calculé en amont par centralité).
Un candidat n'est pas promu s'il est déjà classé comme corridor, living_room, kitchen ou bedroom avec une confiance ≥ 0.65. Ces pièces sont considérées comme suffisamment fiables pour ne pas être écrasées.
Si le candidat passe les gardes-fous, il est promu en entrance_hall avec une confiance de 1.0 (verrouillée). L'algorithme s'arrête au premier candidat promu (break).
# Promotion du seed clustering en entrance_hall if len(entrance_halls) == 0: for r in rooms: if str(r.id) in btw_entrance_set: # Ne pas écraser une pièce bien classée if r.room_type in ("corridor", "living_room", "kitchen", "bedroom") \ and r.confidence >= 0.65: continue r.room_type = "entrance_hall" r.confidence = 1.0 break
Statistiques de corrections observées sur les jeux de données de validation.
La Passe 5 garantit l'invariant 1 entrée = 1 appartement avant le raffinement final des post-passes.
| Situation | Action | Type résultant | Confiance |
|---|---|---|---|
| Entrée à Z > ref + 2.5 m | Reclassement | corridor | |
| Surplus : entrée non-keeper (conf < 0.90) | Reclassement | corridor | |
| Surplus : entrée non-keeper (conf ≥ 0.90) | Préservée | entrance_hall | |
| Absence : seed clustering trouvé | Promotion | entrance_hall | |
| Absence : seed = pièce bien classée (conf ≥ 0.65) | Ignorée | — | — |