Guide utilisateur

Chapitre 4 — Fenêtres auxiliaires

En plus de la fenêtre principale (viewport 3D plus inspecteur), RadianceKit gère six autres fenêtres, qui s'ouvrent toutes via le menu Aide. Le menu comporte huit entrées, de haut en bas : User Guide (⌘?), Keyboard Shortcuts (⌘/), Open Training Logs… (⇧⌘L), Open Exports Folder…, Manage Storage…, Pareto Dashboard… (⇧⌘D), Holdout Analysis… (⇧⌘H), BayesOpt Console… (⇧⌘B). Les deux entrées « Open … » n'ouvrent pas de fenêtre de l'application, mais le Finder ; elles ne sont donc pas traitées plus en détail ici. Trois des fenêtres — Dashboard, Holdout, BayesOpt — sont des outils d'analyse autonomes : ils fonctionnent indépendamment de la fenêtre principale et lisent ou écrivent des fichiers JSON sur le disque. Chacune de ces trois fenêtres s'ouvre via le menu Aide, puis tu choisis toi-même le fichier ou le dossier que tu souhaites analyser — via « Open Reports Folder… », « Open transforms.json… » ou le bouton « Start ». Ces trois fenêtres sont les seules à ne pas être traduites : leurs boutons, curseurs et titres de colonnes restent en anglais dans chaque version linguistique. Les libellés mentionnés ici se retrouvent donc exactement tels quels à l'écran.

Les trois fenêtres simples (User Guide, Keyboard Shortcuts, Manage Storage) et les deux entrées de menu liées aux dossiers (Open Training Logs / Open Exports Folder) reçoivent une courte entrée par élément de contrôle. Les trois fenêtres d'analyse sont documentées plus en détail — chacune avec une introduction expliquant ce que tu vois dans la fenêtre, quand tu devrais l'ouvrir et comment interpréter l'image affichée.

À la fin du chapitre se trouve une section de renvoi vers l'inspecteur de la fenêtre principale : ce que tu peux utilement lire dans le graphique de perte en direct et dans l'affichage du nombre de gaussiennes pendant un entraînement en cours.

Guide utilisateur (W1–W4)

Fenêtre du guide utilisateur avec barre latérale à gauche et contenu Markdown rendu à droite
Fenêtre du guide utilisateur avec barre latérale à gauche et contenu Markdown rendu à droite

Ce que c'est : Une fenêtre d'aide intégrée qui affiche le fichier guide_<langue>.md fourni avec l'app. La langue est déterminée à partir des réglages (onglet General → Language) ou, si « System » y est indiqué, à partir des préférences linguistiques de macOS. La mise en page est classique : à gauche la barre latérale avec tous les titres, à droite le texte courant.

Quand tu as besoin d'un rappel rapide sur un point précis — donc en guise d'aide-mémoire. La référence détaillée, c'est ce manuel ; la fenêtre d'aide intégrée en est la version courte pour une consultation rapide. Elle est mise à jour à chaque version de l'app, mais reste plus superficielle sur le fond.

W1NavigationSplitView (barre latérale + détail)

Help → User Guide (⌘?).

TECHNIQUE

Mise en page à deux colonnes avec une barre latérale étroite (au moins 180 pt de large) pour l'arborescence du contenu et une zone de détail défilante pour le contenu Markdown proprement dit. La fenêtre a une taille minimale de 700 × 500 pt. À la première ouverture, la fenêtre charge le fichier guide_<lang>.md correspondant depuis le bundle de l'app (repli sur guide_en.md), le parse en enregistrements de blocs (titres H1–H4, paragraphes, listes, tableaux, séparateurs) et extrait séparément la structure des titres pour la barre latérale. Le formatage en ligne (gras, italique, code en ligne) est rendu via le moteur Markdown intégré. La langue est lue depuis les réglages de l'app, avec le cas particulier du chinois (zh-Hans) et du portugais brésilien (pt-BR), qui sont conservés en tant que tags de locale complets, car ces variantes se distinguent de zh et pt respectivement.

W2List (barre latérale des titres)

Colonne de gauche dans la fenêtre du guide utilisateur.

TECHNIQUE

Liste de tous les titres H2 et H3 du document Markdown actuel. Les entrées H2 apparaissent sans retrait avec un poids de police medium, les entrées H3 avec un retrait de 16 pt à gauche et un style de premier plan atténué. Tous les autres niveaux — H1 comme H4 et au-delà — n'apparaissent pas dans la barre latérale, car ils la rendraient sinon peu lisible. Les ID d'ancre sont générés à partir du texte du titre par slugification (minuscules + espaces transformés en tirets + filtrage sur lettres/chiffres/tirets — le même algorithme qu'utilise GitHub pour ses ancres Markdown, si bien que des URL externes vers la doc pourraient potentiellement pointer vers la même ancre). La liste utilise le style natif macOS.

W3Button (saut titre → ancre)

Un bouton par ligne de barre latérale.

TECHNIQUE

Chaque entrée de la barre latérale est un bouton qui définit l'ancre actuelle, mais qui a visuellement l'apparence d'un élément de liste. Une variable d'observation déclenche alors le saut de défilement vers l'ancre correspondante avec une animation douce sur 0,3 s. Après le saut, la valeur de l'ancre est réinitialisée, afin que le clic suivant sur la même ancre se déclenche à nouveau (sinon l'observateur ne se redéclencherait pas, car la valeur n'aurait pas changé).

W4ScrollView (contenu détaillé)

Colonne de droite.

TECHNIQUE

Zone de contenu défilante, empilée verticalement, avec rendu paresseux (lazy rendering), car les guides plus longs peuvent facilement dépasser 200 blocs Markdown — une variante non paresseuse instancierait tout en même temps. Chaque bloc reçoit son propre ID, soit l'ancre du titre (que reçoit chaque titre, indépendamment du niveau), soit un espace réservé indexé. La largeur maximale est de 720 pt, le padding de 32 horizontal / 24 vertical, afin que les lignes longues conservent une mise en page bien lisible. Les tableaux sont rendus cellule par cellule avec des piles horizontales et des lignes de séparation ; le code en ligne via le moteur Markdown intégré. Les vrais blocs de code sont actuellement traités comme des paragraphes — une limitation connue de la fenêtre d'aide.

Raccourcis clavier (W5–W6)

Fenêtre des raccourcis clavier — cinq groupes Navigation/Views/Capture/Editor/Training avec colonne de touches à gauche et description à droite
Fenêtre des raccourcis clavier — cinq groupes Navigation/Views/Capture/Editor/Training avec colonne de touches à gauche et description à droite

Liste de référence statique en cinq sections. Navigation: Mouse Drag (Orbit/Fly), Shift+Drag/Right-Drag (Pan), Scroll (Zoom), WASD (mouvement Fly-Through), Q/E (Up/Down), F (Toggle Orbit/Fly), Double-click (Re-center), Cmd+Scroll (ajustement du FoV). Views: R (Reset Camera), T (rotation automatique), P (Camera Playback), B (cycle d'arrière-plan), 0–9 (sauter à Training-Cam 1=10%/5=50%/0=dernière), Left/Right Arrow (cam précédente/suivante). Capture: S (capture d'écran vers le bureau), V (vidéo turntable), C (copier les infos caméra). Editor: Tab (mode édition), Click/Drag (sélection par peinture), Option+Click (désélectionner), X / Delete (supprimer la sélection), Cmd-Z (annuler la dernière suppression), [ / ] (taille de pinceau plus petite/plus grande), Esc (annuler la sélection). Training: Option+Space (mettre en pause/reprendre l'entraînement), Cmd+E (exporter la scène). Il n'y a rien de plus ici — pour démarrer, annuler et prolonger l'entraînement, tu passes par le menu Training (chapitre 1).

Ce que c'est : Un simple aperçu statique de tous les raccourcis clavier — Navigation, Views, Capture, Editor, Training. Le contenu est intégré en dur et n'est pas chargé depuis un fichier.

Quand tu cherches le moyen le plus rapide de faire quelque chose dans le viewport. WASD-Fly-Through, R pour réinitialiser la caméra, B pour le cycle d'arrière-plan — tout est indiqué ici.

W5ScrollView (zone de contenu)

Aide → Raccourcis clavier (⌘/).

TECHNIQUE

Une simple zone de défilement contenant une liste verticale. Marge intérieure de 20 pt tout autour, pas d'arborescence de navigation latérale (la liste est assez courte). Le contenu est regroupé en cinq sections (Navigation, Views, Capture, Editor, Training). Par combinaison de touches, une ligne avec du texte traduisible dans les deux colonnes. La colonne de gauche (code de touche) est fixée à 180 pt de largeur, afin que les descriptions à droite restent alignées verticalement. Aucune interaction hormis le défilement — cliquer sur une ligne ne déclenche rien, les raccourcis clavier sont de véritables modificateurs de touches dans le menu et sur le viewport.

W6VStack (sections de raccourcis)

À l'intérieur du ScrollView.

TECHNIQUE

Sections empilées alignées à gauche avec 16 pt d'espacement. À l'intérieur des cinq sections, un titre suivi d'une série de lignes. Les titres utilisent un style de sous-titre secondaire — volontairement pas de format Title, car les sections n'ont pas besoin d'être navigables. Le contenu est volontairement plat (pas de disclosure, pas de recherche, pas de filtre), pour que le composant fonctionne sans changement sur toutes les versions de macOS et que le fichier reste lisible.

Gérer le stockage (W7–W12)

Fenêtre Manage Storage — l'en-tête affiche « 1,356 items · 55.1 GB total », tableau des fichiers PLY exportés triés par date, avec pour chacun icône + nom de fichier + taille + date
Fenêtre Manage Storage — l'en-tête affiche « 1,356 items · 55.1 GB total », tableau des fichiers PLY exportés triés par date, avec pour chacun icône + nom de fichier + taille + date

Vue en tableau de tous les fichiers gérés par RadianceKit. L'en-tête indique 1 356 éléments, 55,1 Go au total. Barre d'outils en haut : « Show in Finder » + « Refresh ». Chaque ligne : icône d'export, nom de fichier (p. ex. training_20260718T194416Z.ply), date d'export, taille (varie ici de 7,8 Mo à 2,24 Go), icône loupe (Reveal) et icône corbeille (Move to Trash). Le tri se fait d'abord par catégorie, puis à l'intérieur d'une catégorie par date, les plus récents en haut. Dans cette capture, les exports PLY dominent, car ce dossier a surtout servi à sauvegarder des résultats d'entraînement.

Ce que c'est : Un aperçu de l'utilisation disque pour tout ce que RadianceKit dépose sous ~/Documents/RadianceKit/ — logs, exports, scènes, ensembles de capture (venant du compagnon iOS), imports (copies de mise en attente des images d'entrée). Par entrée : une taille en octets et deux boutons : « afficher dans le Finder » et « déplacer vers la corbeille ». Ce n'est PAS un nettoyage automatique — l'app ne supprime rien d'elle-même ; c'est toi qui décides pour chaque entrée. Cette fenêtre est traduite : en français, elle s'appelle « Gérer le stockage », les deux boutons de l'en-tête s'appellent « Afficher dans le Finder » et « Actualiser », les boutons de ligne « Afficher dans le Finder » et « Mettre à la corbeille ». Les noms anglais dans les entrées ci-dessous sont les intitulés de la version anglaise.

Quand le disque se remplit. Ce sont surtout les logs qui s'accumulent (un fichier JSONL par tentative d'entraînement, plus le _qualityMetrics.json) ; les exports aussi, bien sûr (PLY à 100 % de données brutes, un par export). Utile également après un plantage, quand le répertoire de mise en attente des imports contient encore d'anciennes copies des images d'entrée.

W7Bouton « Show in Finder »

En-tête, en haut à droite de la fenêtre du navigateur de stockage.

TECHNIQUE

Ouvre le dossier de données de RadianceKit dans le Finder — exactement le répertoire dont ce fenêtre liste le contenu. Tu vois ainsi directement la structure des dossiers (Logs, Exports, Scenes, Captures, Imports) et peux aussi déplacer ou copier les fichiers toi-même avec le Finder. L'action ouvre une nouvelle fenêtre Finder ; la liste dans la fenêtre ne se met pas à jour automatiquement — c'est le rôle de « Refresh » (W8).

W8Bouton « Refresh »

En-tête, à côté du bouton Finder.

TECHNIQUE

Déclenche un balayage en arrière-plan, exécuté sur une tâche asynchrone initiée par l'utilisateur, afin que le scan de grands arbres de répertoires ne bloque pas l'interface. Le parcours proprement dit traverse chaque sous-dossier connu (Logs, Exports, Scenes, Captures, Imports) et génère une entrée de stockage par enfant direct. Pour chaque entrée, la taille récursive est déterminée — de préférence la consommation disque réelle (y compris le partage de hardlinks APFS), avec repli sur la taille logique du fichier.

W9Liste (entrées de stockage)

Contenu principal sous l'en-tête.

TECHNIQUE

Liste avec, par ligne, cette disposition : icône SF Symbol spécifique à la catégorie (document pour les logs, flèche vers le haut pour les exports, cube pour les scènes, iPhone pour les ensembles de capture, bac pour les imports), nom + sous-titre (libellé de type + date de modification formatée), compteur d'octets à droite (aligné à droite, en police à chasse fixe), bouton Reveal (icône loupe), bouton Trash (corbeille). Tri : d'abord par type (les scènes en premier, puis les exports, logs, captures, imports, autre), puis par date de modification décroissante (les plus récents en haut). Si le scan est encore en cours, la zone affiche à la place une progression « Scanning… ». Si rien n'a été trouvé, un affichage d'état vide avec icône de bac apparaît.

W10Bouton de ligne « Reveal in Finder »

Par ligne, icône loupe à droite.

TECHNIQUE

Ouvre le Finder et sélectionne l'élément spécifique (fichier ou dossier). Différence avec W7 : W7 ouvre le répertoire racine ; W10 marque précisément cette seule entrée. Flux de travail pratique : identifie une entrée volumineuse, clique sur la loupe, puis copie-la par exemple sur un volume externe.

W11Bouton de ligne « Move to Trash »

Par ligne, icône corbeille à droite de la loupe.

TECHNIQUE

Déclenche la boîte de dialogue de confirmation (W12). Ce n'est qu'après confirmation que s'exécute l'opération standard macOS « déplacer vers la corbeille » (donc réversible, pas de suppression directe). Après mise à la corbeille réussie, l'entrée est retirée de la liste et le compteur total d'octets est mis à jour. En cas d'erreur, une boîte de dialogue d'erreur modale s'affiche.

W12ConfirmationDialog (confirmation de suppression)

Déclenché par W11, affiché sous forme de feuille macOS.

TECHNIQUE

Boîte de dialogue de confirmation standard avec un titre dynamique « Delete <name>? » et une ligne de message indiquant explicitement que l'entrée atterrit dans la corbeille et peut être restaurée depuis là (jusqu'à ce que la corbeille soit vidée). Deux boutons : « Move to Trash » comme action destructive (affichée en rouge) et « Cancel » avec liaison automatique à la touche Échap. La boîte de dialogue est non-modale en ce sens qu'elle ne bloque que cette fenêtre, pas toute l'app — c'est le standard macOS pour les suppressions réversibles.

Pareto Dashboard (W13–W22)

Pareto Dashboard — état vide avant import de rapports
Pareto Dashboard — état vide avant import de rapports

État vide (après première ouverture) — état vide avec appel à l'action « Open Reports Folder… ». Les points de données apparaissent dès que des rapports d'entraînement sont chargés, voir la capture suivante.

Pareto Dashboard avec 384 rapports de benchmark chargés — Gaussians vs PSNR avec front de Pareto, Scene/Strategy/Mip-Filter
Pareto Dashboard avec 384 rapports de benchmark chargés — Gaussians vs PSNR avec front de Pareto, Scene/Strategy/Mip-Filter

La barre d'outils en haut affiche à droite « 384 reports of 384 » (tous les rapports du dossier sélectionné ont été analysés avec succès) ; à gauche du bouton « Open Reports Folder… » figure le nom du dossier chargé, ici « Benchmarks ». Axes : sélecteur d'axe X sur Gaussians, sélecteur d'axe Y sur PSNR (dB), à côté la case active « Show Pareto Front ». Légende en haut à gauche : bleu = mcmc, vert = classic, orange = hybrid, plus la forme de symbole pour Mip-Splatting On/Off. La ligne en pointillés du front de Pareto suit les meilleures valeurs de PSNR atteintes et plafonne autour de PSNR≈30 dB à partir d'environ 300K Gaussians ; le nuage de points s'étend jusqu'à plus de 1,5 million de Gaussians. Puces de filtre à droite : plus de 30 scènes (entre autres bicycle, bonsai, family, flowers, garden, kitchen, stump, truck ainsi que les séries de tests 360, drone et photo numérotées), 3 strategies (classic, hybrid, mcmc), 3 options Mip-Splatting (All, On, Off) avec « All » actif. Aucun filtre de scène ou de strategy n'est actuellement défini, d'où le nuage de points dense.

Ce que c'est : Un outil de comparaison multi-runs. Tu as entraîné par le passé plusieurs scènes ou la même scène avec différents préréglages — chaque analyse de benchmark produit, pour chaque session d'entraînement, un fichier de rapport JSON qui contient entre autres le PSNR final, le SSIM, le LPIPS, le nombre de Gaussians et la durée réelle. Il n'existe pas de bouton dédié à cette analyse dans l'interface ; le Dashboard exploite ce qui se trouve déjà comme rapport dans le dossier sélectionné. Il lit tout un dossier de tels rapports en une seule fois et les trace sous forme de nuage de points 2D avec des axes sélectionnables. Le front de Pareto (l'ensemble des points non dominés) est en plus tracé sous forme de ligne en pointillés.

Après avoir créé au moins trois ou quatre rapports d'entraînement. Avec moins de points, la ligne de front n'est pas significative. Cas d'usage typique : tu as essayé de reconstruire une scène extérieure et as testé successivement P3 Balanced (Classic), P4 Quality (Classic), P8 Quality (MCMC) et P9 Drone / Aerial — maintenant tu veux savoir quelle configuration offre le meilleur PSNR par seconde de temps d'entraînement ou laquelle demande le moins de Gaussians pour un PSNR donné.

Les deux axes sont librement sélectionnables (axe X : Gaussians, temps d'entraînement, PSNR, SSIM, LPIPS, … ; axe Y de même). Le calcul du front de Pareto sait, pour chaque métrique, si « plus petit = meilleur » (LPIPS, Gaussians, Training Time, BRISQUE) ou « plus grand = meilleur » (PSNR, SSIM, FSIM, MS-SSIM) — la ligne va donc, selon le choix des axes, du bas à gauche vers le haut à droite ou du haut à gauche vers le bas à droite, toujours le long de la meilleure combinaison atteinte. Un point est Pareto-optimal si AUCUN autre point n'est au moins aussi bon dans LES DEUX dimensions (donc aucun autre ne le domine). Les points Pareto-optimaux se situent sur la ligne, les autres points se trouvent à droite/au-dessus (selon l'orientation des axes) de celle-ci. Les points SUR la ligne sont les vrais candidats au « meilleur préréglage » ; les points ÉLOIGNÉS de la ligne représentent du temps d'entraînement gaspillé.

Tu peux restreindre la sélection à une scène donnée (si tu veux par exemple comparer uniquement des runs extérieurs), à une strategy donnée (classic, hybrid ou mcmc), ou à Mip-Splatting activé/désactivé (Mip-Splatting est un réglage optionnel pour utilisateurs avancés, d'où l'intérêt d'une comparaison directe).

Tu as trois rapports pour la scène « truck » dans un dossier de rapports : Run A (P4 Quality (Classic), 524K Gs, 105 s, PSNR 23.4), Run B (P8 Quality (MCMC), 150K Gs, 693 s, PSNR 24.6), Run C (P5 Ultra Detail, 1.25M Gs, 312 s, PSNR 25.8). Règle l'axe X sur Training Time, l'axe Y sur PSNR. Le Run B se trouve en haut à droite, le Run C encore plus en haut à droite, le Run A en bas à gauche. Le front de Pareto relie A et C — tous deux non dominés. Le Run B est « perdu » (C est meilleur à la fois en temps ET en PSNR). Conclusion : pour « truck », la voie MCMC ne vaut pas le coup ; soit rapide + correct (A), soit long + très bon (C). Enregistre la configuration de C comme préréglage à part (Inspector → I1 Save Preset).

Action suivante : Enregistrer la meilleure configuration comme préréglage. Concrètement : regarde les points du front de Pareto (le survol affiche PSNR/SSIM/LPIPS/Gs/Time dans l'infobulle), décide lequel te convient le mieux dans le compromis temps/qualité, ouvre le rapport correspondant (le nom du fichier contient l'horodatage du run), copie sa configuration d'entraînement dans un nouveau run ou enregistre-la comme préréglage via l'Inspector après la prochaine session d'entraînement.

W13Bouton « Open Reports Folder… »

Barre d'outils en haut à gauche.

TECHNIQUE

Ouvre une boîte de dialogue de sélection de dossier avec l'invite « Select a folder containing benchmark .json reports ». Après validation, une tâche en arrière-plan analyse séquentiellement tous les fichiers .json du dossier. Les rapports défaillants (JSON corrompu, schéma incorrect) sont collectés et affichés en bas de la sidebar sous la forme « N file failed to parse » — aucun crash. Si un second clic survient pendant qu'un premier chargement est encore en cours, la tâche précédente est annulée afin que deux résultats n'écrivent pas simultanément dans l'état.

Le dossier sélectionné n'est pas mémorisé durablement : après avoir rouvert la fenêtre via Aide → Pareto Dashboard… (⇧⌘D), tu dois le sélectionner à nouveau ici. Le nom du dossier chargé apparaît ensuite à droite du bouton.

W14Sélecteur « X-Axis »

Au-dessus du graphique, à gauche.

TECHNIQUE

Menu déroulant avec tous les axes de métriques disponibles du module Dashboard (PSNR, SSIM, LPIPS, nombre de Gaussians, temps d'entraînement, etc.). La valeur par défaut est le nombre de Gaussians. Lors du changement, le point survolé est réinitialisé, car une position auparavant mise en évidence n'a plus de sens dans le nouveau système de coordonnées des axes. Le sélecteur est limité à la largeur du contenu afin de ne pas s'étirer sur toute la largeur.

W15Sélecteur « Y-Axis »

Au-dessus du graphique, à côté de X-Axis.

TECHNIQUE

Identique à W14, sauf que la valeur par défaut est PSNR. Le choix d'axe est mémorisé indépendamment, donc l'utilisateur peut aussi choisir des combinaisons absurdes (X=PSNR, Y=PSNR — projetterait tous les points sur une diagonale). De telles combinaisons ne sont toutefois pas bloquées ; c'est un choix délibéré, car une comparaison « SSIM vs PSNR » peut tout à fait être intéressante pour voir à quel point les métriques se comportent de façon cohérente.

W16Bascule « Show Pareto Front »

À droite des sélecteurs d'axe.

TECHNIQUE

Une case à cocher, activée par défaut. Le front de Pareto est superposé au nuage de points sous forme de ligne — en pointillés (motif de tiret 4–4), gris semi-transparent, épaisseur de ligne 1,5 pt. Attention : Dans la version livrée, la case n'a aucun effet sur le graphique — la ligne de front est toujours tracée, cochée ou non. Le front est recalculé à chaque changement d'axe et après chaque modification de filtre.

W17Puces de filtre « Scene »

Sidebar droite dans la fenêtre du Dashboard.

TECHNIQUE

Puces de filtre pour chaque scène présente dans les rapports chargés. Mise en page en flux propre qui redistribue automatiquement les puces sur plusieurs lignes dès que la largeur est épuisée. Les puces actives reçoivent le fond d'accentuation, les inactives un fond de matériau standard neutre. La sélection multiple est possible (sémantique d'ensemble) ; si aucune puce n'est sélectionnée, toutes les scènes sont considérées comme « laissées passer » — autrement dit, la logique d'ensemble est « sélection vide = tout », pas « sélection vide = rien ».

W18Puces de filtre « Strategy »

Sous le filtre Scene dans la sidebar.

TECHNIQUE

Exactement comme W17, mais pour les strategies d'entraînement — typiquement les trois valeurs « classic », « hybrid » et « mcmc », dérivées du champ Strategy des JSON de rapport de benchmark. Utile si tu as mélangé des rapports de plusieurs strategies et que tu ne veux voir qu'un seul type (par exemple « ne montrer que les runs MCMC parce que j'ai déjà exclu Classic »).

W19Puces de filtre « Mip-Splatting »

Sous le filtre Strategy dans la sidebar.

TECHNIQUE

Filtre à trois valeurs (au lieu d'un ensemble comme W17/W18) : « All » / « On » / « Off ». Contexte : Mip-Splatting est une extension multi-échelle qui aide ou non selon la scène — elle reste donc un réglage volontairement activable et non un standard. Quand tu compares Mip on/off, tu veux souvent pouvoir séparer très nettement. D'où le filtre ternaire dédié avec les états « tout laisser passer », « uniquement Mip activé », « uniquement Mip désactivé ». La section de la sidebar apparaît dès que l'ensemble chargé contient au moins des rapports — donc pratiquement toujours ; elle ne disparaît que si rien n'est chargé du tout.

W20ChipButton (bascule de filtre, all/on/off)

Composant auxiliaire, utilisé dans W17/W18/W19.

TECHNIQUE

Enveloppe de bouton minimaliste. Contenu : texte d'étiquette avec taille de police Caption et un remplissage de 10 horizontal / 5 vertical. Fond conditionnel : si actif → couleur d'accentuation de l'app avec texte blanc ; sinon fond de matériau standard neutre avec la couleur de texte normale (s'adapte aux apparences claire et sombre). La forme est une capsule (en forme de pilule). Style de bouton simple, pour que le matériau de la capsule ne soit pas recouvert par une bordure système.

W21Graphique (nuage de points Pareto)

Zone centrale du Dashboard.

TECHNIQUE

Diagramme Swift Charts avec deux couches : 1. un point par rapport — position issue des métriques X et Y choisies, couleur selon la Strategy, symbole selon le statut Mip. Taille de symbole normale 80, mise en évidence 200 (si l'ID correspond au rapport actuellement survolé). 2. une ligne pour le front de Pareto (voir W16 — elle est toujours tracée). De plus, le point actuellement survolé affiche le nom de la scène sous forme de petite capsule au-dessus de lui.

Overlay du graphique : un rectangle transparent capte les mouvements de la souris ; à chaque frame, la position de point la plus proche au sens euclidien dans le cadre du tracé est déterminée et le rapport survolé est mis à jour si la distance est inférieure à 24 px (sinon réinitialisé). Tu obtiens ainsi l'infobulle sans cliquer — le survol suffit.

W22Infobulle (détail au survol)

Sous le graphique, affichée au survol.

TECHNIQUE

Pile horizontale : nom de la scène (Headline), étiquette Strategy (Caption), ligne de séparation, puis les métriques PSNR/SSIM/LPIPS/Gs/Time chacune dans un petit groupe vertical (étiquette + valeur en police à chasse fixe). Si Mip était activé, une étiquette- capsule « Mip » supplémentaire en couleur d'accentuation. Fond flou semi-transparent, rectangle arrondi avec un rayon de 8 pt. N'est affichée que si la souris est effectivement au-dessus d'un point. Disparaît automatiquement en la quittant.

Analyse Holdout (W23–W29)

Holdout Analysis — état vide avant le chargement d'un transforms.json
Holdout Analysis — état vide avant le chargement d'un transforms.json

État vide avec Empty-State et appel à l'action « Open transforms.json… ». Accepte le format NeRF-Studio et Instant-NGP. Les marqueurs de caméra apparaissent dès qu'un transforms.json est chargé — voir figure suivante.

Holdout-Globe avec 86 caméras, 5 folds, stratégie Angular active
Holdout-Globe avec 86 caméras, 5 folds, stratégie Angular active

L'en-tête affiche le fichier chargé (transforms.json) et le nombre de caméras (« 86 cameras »). Barre latérale gauche : sélecteur de stratégie avec deux options — Angular (longitudinal) actif (trie les caméras selon leur angle longitudinal autour de l'orbite et les répartit ensuite tour à tour sur les folds) vs Linear (round-robin) (la même répartition tour à tour, mais selon l'ordre des images plutôt que selon l'angle de vue). Le curseur k-Folds est réglé sur 5, le sélecteur de Test-Fold sur Fold 1. Le bouton d'export génère un fold-assignment.json pour une utilisation ultérieure dans des outils d'évaluation externes. Panneau central : projection Globe 3D de toutes les 86 caméras, réparties sur toute la sphère — points verts = Train, points rouges = fold de test actuel (Fold 1 avec 18 caméras). Barre latérale droite (Angular Correlation) : par fold le nombre de caméras + Mean Nearest Angle (Fold 1 : 18 caméras / 8,5°, Fold 2 : 17 / 6,1°, Fold 3 : 17 / 6,2°, Fold 4 : 17 / 6,7°, Fold 5 : 17 / 6,4°) — une valeur plus petite signifie que chaque caméra de test a une caméra d'entraînement proche, le test est donc plus facile.

Ce que c'est : Un visualiseur 3D pour l'agencement de tes caméras avec une logique de validation croisée. Tu charges un transforms.json (le format standard de Nerfstudio / Instant-NGP pour les poses de caméra), l'app lit toutes les caméras, projette leurs directions de vue sur une sphère unité et les affiche sous forme de petits marqueurs sphériques sur un globe virtuel. Elle répartit ensuite les caméras en k folds (selon la stratégie choisie : angular ou linear), marque en vert la part d'entraînement et en rouge la part de test (Holdout), et calcule pour chaque fold un score Angular-Correlation qui t'indique à quel point le fold de test est éloigné du fold d'entraînement dans l'espace des angles de vue.

Quand tu veux faire une évaluation Holdout — c'est-à-dire : dans quelle mesure ton modèle généralise-t-il à des angles de vue non vus ? Le standard à l'entraînement est « every-8th view comme Holdout » (convention Mip-NeRF360), mais c'est une répartition très linéaire. Si tes images sont par exemple regroupées temporellement (d'abord un côté de l'objet, puis l'autre), alors « every-8th » n'est pas représentatif — une position séquentielle aléatoire se retrouve dans le test, mais tous ses voisins sont dans l'entraînement, c'est trop facile. Avec « angular », on stratifie plutôt sur l'espace des angles de vue : chaque fold contient des caméras de toutes les zones de l'orbite, de sorte que le test évalue réellement les lacunes de généralisation.

Angular vs Linear : - Angular (standard) : trie toutes les caméras selon leur angle longitudinal (coordonnée φ autour de l'axe Y) puis les répartit tour à tour sur les k folds — la première caméra de l'anneau va dans Fold 1, la deuxième dans Fold 2, et après k caméras le cycle recommence depuis le début. Avantage : chaque fold contient des caméras de toutes les directions de l'orbite, réparties uniformément sur l'anneau. Bon pour des prises de vue en orbite classiques, car la répartition ne dépend alors plus de l'ordre de prise de vue. - Linear (Round-Robin) : la même répartition tour à tour, mais selon la position de l'image plutôt que selon l'angle (index de fold = image_index modulo k). C'est la simple répartition « every-k-th ». Fonctionne quand l'ordre des images n'a AUCUN biais spatial (par ex. prises de vue de drone triées aléatoirement). Fonctionne mal si les images sont regroupées temporellement — les images voisines se retrouvent alors dans des folds différents et le test devient trop facile.

Dans le globe 3D, tu vois immédiatement : points verts (entraînement) et points rouges (test). Si les points rouges sont tous regroupés dans un coin, le holdout est mauvais (pas un bon test de généralisation). S'ils sont répartis uniformément parmi les verts, il est bon. Le score Angular-Correlation par fold (barre latérale droite, en degrés) indique en plus : une valeur plus petite = le test est proche de l'entraînement (chaque caméra de test a une caméra d'entraînement proche, test facile) ; une valeur plus grande = le test est éloigné de l'entraînement (généralisation plus difficile).

Tu as capturé ta scène Truck avec 251 images, exportes via l'élément de menu M33 (Export SfM transforms.json) un fichier nerfstudio. Ouvre la fenêtre Holdout (⇧⌘H), charge le JSON via « Open transforms.json… », regarde le globe. k=5 (par défaut) te donne 5 folds. Clique sur « Fold 3 » — vérifie si les marqueurs rouges sont à peu près uniformes. Si oui : « Export fold-assignment.json ». Le fichier exporté est destiné à des outils d'évaluation externes (Nerfstudio, Instant-NGP) ; RadianceKit lui-même ne le relit pas et continue de s'entraîner par rapport à son propre standard de Holdout « every-8th ». La fenêtre sert donc ici à juger si ton ensemble de caméras permet réellement un test équitable.

W23Bouton « Open transforms.json… »

Barre d'outils en haut à gauche.

TECHNIQUE

Ouvre une boîte de dialogue de sélection de fichier limitée aux fichiers JSON. Après confirmation, le module Holdout charge le fichier. Le loader analyse aussi bien le format nerfstudio (intrinsèques de caméra plus liste de frames avec chemin d'image et matrice de transformation) que le format instant-ngp (structure identique). Pour chaque frame, la direction de vue est extraite de la matrice de transformation (axe z de la base locale de la caméra) et enregistrée. Si l'analyse échoue, un message apparaît dans la barre latérale gauche — mais seulement si une scène y était déjà chargée ; lors de la toute première tentative, la fenêtre reste dans l'état vide sans message visible.

Le fichier chargé n'est pas mémorisé de façon permanente : après avoir ouvert la fenêtre via Aide → Holdout Analysis… (⇧⌘H), tu le sélectionnes à nouveau ici. Son nom apparaît ensuite à droite du bouton.

W24Sélecteur « Strategy » (angular/linear)

Barre latérale gauche, en haut.

TECHNIQUE

Sélecteur radio avec deux options : Angular et Linear. Le changement de stratégie déclenche automatiquement un recalcul des folds. Les directions de vue forment une liste de vecteurs unitaires 3D sur la sphère ; la stratégie Angular les trie selon leur angle longitudinal φ puis les assigne tour à tour aux folds, la stratégie Linear effectue la même assignation tour à tour sur l'index de frame et ignore complètement la géométrie. Les deux stratégies produisent donc des folds de taille égale ; elles ne diffèrent que par le critère de tri utilisé au préalable.

W25Curseur « k Folds »

Barre latérale gauche, au milieu.

TECHNIQUE

Curseur de 3 à 10, pas de 1. Lors d'un changement, le calcul des folds est automatiquement relancé, de sorte que la liste des folds, les indices d'entraînement/test et le score par fold sont immédiatement recalculés. La valeur choisie est affichée en chiffres à chasse fixe à droite du libellé.

Règle empirique : k=5 est le standard (te donne 20% de test par fold, c'est courant pour la validation croisée). k=10 si tu as beaucoup de données et as besoin de plus de folds pour la puissance statistique. k=3 si tu as peu de données.

W26Sélecteur « Test Fold »

Barre latérale gauche, sous le curseur k.

TECHNIQUE

Sélecteur de menu. Il liste exactement autant d'entrées que de folds configurés, intitulées « Fold 1 » à « Fold N ». Si l'index précédemment choisi est ≥ k (par ex. parce que tu as réduit k de 10 à 5), il est automatiquement réinitialisé à 0. Le fold de test choisi est affiché en rouge dans le globe, tous les autres en vert.

W27Bouton « Export fold-assignment.json »

Barre latérale gauche, en bas.

TECHNIQUE

Ouvre une boîte de dialogue d'enregistrement avec le nom de fichier par défaut fold-assignment.json. Après confirmation, le module Holdout encode la répartition actuelle dans un schéma JSON (attribution de fold par frame plus un bloc de méta-données de stratégie). Le fichier est destiné à des outils d'évaluation externes — RadianceKit ne le relit pas. Le bouton est grisé tant qu'aucun fichier de caméras n'est chargé. Un succès s'affiche sous la forme « Saved to (filename) », une erreur d'écriture sous la forme « Export failed: … » — les deux apparaissent au même endroit sous le bouton et tous deux en texte vert, la couleur ne distingue donc pas les cas.

W28SCNView (3D Camera Globe)

Panneau central de la fenêtre Holdout.

TECHNIQUE

Vue de globe SceneKit. La scène est composée : d'une sphère en fil de fer (rayon 1.0, 36 segments, gris foncé), de trois segments d'axes colorés (rouge/vert/bleu pour X/Y/Z, chacun de longueur 1.2), et pour chaque caméra d'une petite sphère marqueur (rayon 0.03) à la position de direction de vue correspondante sur la sphère unité (légèrement à l'extérieur, pour qu'elle ne disparaisse pas DANS la sphère en fil de fer). Les marqueurs ne sont PAS reconstruits à chaque changement de fold — une reconstruction n'est nécessaire que si la liste de frames change (c'est-à-dire qu'un nouveau JSON est chargé). À la place, une mise à jour sur place des couleurs de matériau s'exécute à chaque mise à jour : rouge pour les indices de test, vert pour l'entraînement, gris clair si ni l'un ni l'autre. Ainsi, les mouvements du curseur restent performants même avec N > 1000 caméras.

Le contrôle de la caméra est activé — tu peux faire pivoter le globe à la souris, zoomer, effectuer un panoramique. L'éclairage évite que les marqueurs paraissent plats. L'arrière-plan est gris foncé.

W29FoldCard (Tap to Select Fold)

Barre latérale droite, section « Angular Correlation ».

TECHNIQUE

Une vue en carte par fold — rectangle arrondi avec un rayon de 6 pt, un padding de 10, une disposition verticale avec deux lignes (en haut « Fold N » + nombre de caméras, en bas « Mean nearest angle: » + valeur en degrés). Couleur de fond conditionnelle : fold actif = couleur d'accent semi-transparente, folds inactifs = matériau standard neutre. Un tap sélectionne le fold, et le globe change de couleur en direct.

Le score « Mean nearest angle » est l'angle minimal moyen par caméra de test vers la caméra d'entraînement la plus proche (calculé en interne en radians, affiché en degrés dans l'interface).

Console BayesOpt (W30–W39)

Console BayesOpt — état vide avant le démarrage d'un essai
Console BayesOpt — état vide avant le démarrage d'un essai

État vide avec sélecteur d'espace de recherche (RadianceKit defaults (6-dim)), curseur de budget d'essais (par défaut 40), graine aléatoire (42) et trois panneaux vides pour le graphique de convergence, le journal des essais et la liste des paramètres de l'espace de recherche. Le graphique de convergence et le tableau des essais se remplissent dès qu'un run a été démarré — voir la figure suivante.

Console BayesOpt après 40 essais — le graphique de convergence monte fortement jusqu'à l'essai 13, meilleure valeur 0.9943, journal des essais avec tags init/bo/restart
Console BayesOpt après 40 essais — le graphique de convergence monte fortement jusqu'à l'essai 13, meilleure valeur 0.9943, journal des essais avec tags init/bo/restart

Statut en haut à droite « Finished — best 0.9943 after 40 trials », à côté le bouton « Save Best Config » ; en haut à gauche le bouton « Start ». Barre latérale gauche : sélecteur d'espace de recherche sur RadianceKit defaults (6-dim), budget d'essais 40, graine aléatoire 42. La liste des paramètres montre les six hyperparamètres à régler avec leurs plages de valeurs : mipSmoothing3DScale [0.05, 0.5], mipFilter2DVariance [0.1, 0.6], densifyGradThreshold [5e-07, 5e-06], ssimWeight [0.05, 0.5], mcmcNoiseScale [1e-05, 0.0001], mcmcRelocationInterval [50, 200]. Au centre : graphique de convergence « Convergence (best value so far) » (X = index de l'essai 0–40, Y = valeur objective 0–1) — points bleus = échantillons initiaux, points verts = acquisition BayesOpt, points orange = essais de redémarrage (#22 avec 0.5303 et #31 avec 0.4885). La ligne bleue de meilleure valeur monte fortement jusqu'à l'essai ~5, puis n'apporte plus qu'une amélioration marginale jusqu'à l'essai ~13, à partir de là un plateau plat proche de 1.0. Barre latérale droite : journal des essais, ici défilé jusqu'aux essais #8–#36, avec score + tag (init/bo/restart). Le bouton Save Best Config en haut à droite écrit bayesopt-best.json.

Ce que c'est : Une console d'optimisation bayésienne pour la recherche d'hyperparamètres. BayesOpt est une méthode automatique qui essaie de trouver, avec le moins d'expériences possible, le point optimal d'une fonction inconnue — typiquement : « quelle combinaison de plafond de gaussiennes, de poids SSIM et de seuil de densification donne le meilleur PSNR pour ma classe de scène ? » Au lieu d'une grille de 6^4 = 1296 essais, BayesOpt essaie environ 40–100 essais informés et s'approche ainsi de l'optimum.

Important : La version actuelle livrée dans l'app n'exécute pas l'optimisation contre de vrais runs d'entraînement (cela prendrait des jours), mais contre un objectif de démonstration synthétique — un paysage multimodal au caractère de montée de colline avec un léger bruit. C'est intentionnel : la fenêtre doit te montrer le comportement de l'optimiseur (courbe de convergence, points d'échantillonnage, meilleur-jusqu'ici) et te faire comprendre les définitions d'espace de recherche. Pour de vrais runs BayesOpt pilotés par l'entraînement (comme ceux effectués lors du développement des préréglages fournis), un chemin d'évaluation séparé en dehors de l'app est utilisé ; la fenêtre est la variante en direct à observer.

Trois cas d'usage : 1. Tu veux comprendre comment BayesOpt fonctionne — lance alors un run de démonstration et observe le graphique de convergence. 2. Tu prévois une nouvelle classe de scène (par exemple « aquariums » ou « meubles anciens ») pour laquelle les quinze préréglages intégrés ne conviennent pas parfaitement. Définis mentalement un espace de recherche, vérifie-le ici avec « Bowl demo (1-dim) » ou « densify-until + ssim-weight + grad-thresh », exporte ensuite la meilleure configuration en JSON et utilise-la comme point de départ pour un vrai run d'entraînement. 3. Tu veux inspecter les espaces de recherche standard fournis (sous-ensemble Mip, RadianceKit Defaults) — ils sont listés dans le panneau de paramètres de la barre latérale gauche.

- Graphique de convergence (colonne centrale) : Y = meilleure valeur de fonction objective atteinte jusqu'ici. X = index de l'essai. Au début monte fortement (BayesOpt essaie les échantillons initiaux au hasard, certains d'entre eux ont de la chance), puis devient de plus en plus plat, car la région proche de l'optimum est épuisée. Si la ligne reste plate pendant 20+ essais, tu peux arrêter le run — d'autres essais n'apporteront plus rien. Les points individuels dans le graphique sont les valeurs d'essai individuelles (donc pas « meilleur jusqu'ici »), colorés selon la phase : bleu = échantillon initial, vert = acquisition bayesopt, orange = redémarrage. - Tableau des essais (colonne droite) : #1, #2, #3, … avec à chaque fois la valeur et le tag de phase. Le meilleur essai jusqu'ici est marqué d'une étoile jaune. À partir du tableau, tu peux identifier le meilleur essai et examiner ses valeurs de paramètres plus tard lors de l'export. - Inspecteur d'espace de recherche (barre latérale gauche) : montre pour le préréglage choisi tous les noms de paramètres et leurs plages de recherche [lo, hi]. Si tu te trouves sur le préréglage « RadianceKit defaults (6-dim) », tu vois par exemple « densifyGradThreshold [5e-7, 5e-6] » — donc log-uniforme entre ces deux valeurs.

Choisis le préréglage « RadianceKit defaults (6-dim) », budget d'essais 40, graine 42. Clique sur « Start ». Observe : les 8 premiers essais sont bleus (échantillons initiaux, hypercube latin), les suivants verts (acquis par BayesOpt). Le graphique de convergence monte fortement jusqu'à l'essai ~13, puis s'aplatit. Vers l'essai ~30–40, la meilleure valeur se stabilise. Clique sur « Save Best Config » — un bayesopt-best.json est enregistré avec le nom du préréglage, l'index de l'essai, la valeur et les valeurs de paramètres décodées. Ce JSON, tu peux ensuite le reprendre manuellement dans ta définition de préréglage.

W30Bouton « Start »

Barre d'outils à gauche, en état Idle/Finished.

TECHNIQUE

Remet la liste des essais à zéro, passe à l'état Running, génère un nouvel identifiant de run (pour la détection d'obsolescence en cas de clics multiples sur Start) et crée une nouvelle porte de pause. Puis démarre une tâche en arrière-plan qui exécute l'optimiseur comme flux asynchrone. Le nombre d'échantillons initiaux croît avec le budget, mais au plus jusqu'à 8 — donc typiquement 8 échantillons hypercube latin à partir d'un budget de 28, moins pour un petit budget. Les mises à jour des essais sont reçues de façon incrémentale et ajoutées à la liste. Protection contre les runs obsolètes : si entre-temps un second clic sur Start redéfinit l'identifiant de run, les mises à jour de l'ancien run sont rejetées.

Style d'action principale pour l'apparence proéminente du bouton.

W31Bouton « Pause »

Barre d'outils à gauche, en état Running.

TECHNIQUE

Active la porte de pause et passe à l'état Paused. L'effet réel : le runner attend dans une boucle de sondage de 50 ms avant d'évaluer la prochaine fonction objective. Cela signifie qu'un essai en cours est mené jusqu'au bout (c'est synthétique et ne dure que quelques microsecondes), mais aucun autre essai n'est déclenché. Dès que Resume est activé, cela continue là où c'était arrêté.

W32Bouton « Stop »

Barre d'outils à gauche, en état Running et Paused.

TECHNIQUE

Annule la tâche du runner, remet la référence à zéro, libère la porte de pause (si encore en pause), et passe à l'état Finished (s'il existe des essais) ou Idle (s'il n'y en a pas). Les essais déjà calculés restent visibles dans la liste — Stop ne les supprime pas. Le rôle de bouton destructif affiche le bouton en rouge, car il interrompt le run.

W33Bouton « Resume »

Barre d'outils à gauche, en état Paused.

TECHNIQUE

Libère la porte de pause et repasse à l'état Running. La tâche du runner tourne déjà (elle attend dans la boucle de sondage) ; dès que la boucle constate que la pause est levée, elle continue et démarre l'essai suivant.

W34Bouton « Save Best Config »

Barre d'outils à droite, toujours visible (mais grisée tant qu'aucun meilleur run n'est disponible).

TECHNIQUE

Ouvre une boîte de dialogue d'enregistrement avec un nom de fichier par défaut bayesopt-best.json, limité à JSON. Après confirmation, un dictionnaire de charge utile est construit : nom du préréglage, index de l'essai, valeur (score objectif), paramètres (dictionnaire des noms de paramètres décodés → valeurs). Le décodage projette les coordonnées normalisées de l'espace de recherche dans [0,1]^d de retour vers la plage de valeurs d'origine (avec des échelles log-uniforme/linéaire/entière selon le cas). La sortie JSON est mise en forme lisible et avec des clés triées. En cas d'erreur d'écriture, cela est (dans la version de démonstration actuelle) ignoré silencieusement — pas d'UI d'erreur, car c'est un chemin de démonstration.

Le bouton reste gris tant qu'aucun essai n'a été effectué.

W35Sélecteur « Search Space »-préréglage

Barre latérale gauche, en haut.

TECHNIQUE

Sélecteur de menu avec quatre options de préréglage : - « RadianceKit defaults (6-dim) » — l'espace de recherche standard complet avec les six hyperparamètres standard. - « Mip subset (2-dim) » — seulement mipSmoothing3DScale [0.05, 0.5] log-uniforme et mipFilter2DVariance [0.1, 0.6] linéaire. Utile si tu veux régler le Mip-Splatting pour une classe de scène. - « densify-until + ssim-weight + grad-thresh » — trois paramètres pertinents pour la densification (densifyGradThreshold log-uniforme, ssimWeight linéaire, densifyUntilIter entier). - « Bowl demo (1-dim) » — espace de recherche pédagogique à un seul paramètre pour des démos « comment fonctionne BayesOpt ».

Tant qu'un run est actif, l'espace de recherche ne peut pas être changé (cela perturberait l'optimiseur).

W36Curseur « Trial Budget »

Barre latérale gauche, sous le sélecteur d'espace de recherche.

TECHNIQUE

Curseur de 10 à 200, pas de 5. Par défaut 40. Cela signifie : BayesOpt peut faire au maximum N essais. Parmi eux, les quelques premiers sont des échantillons initiaux (hypercube latin), le reste sont de vrais essais BayesOpt. Règles empiriques pour la pratique : un espace de recherche à d dimensions nécessite environ dix à vingt fois d en essais pour obtenir un bon optimum. Pour les 6 dimensions par défaut, donc 60–120, pour le sous-ensemble Mip à 2 dimensions, 20–40, pour la démo Bowl à 1 dimension, 10–20.

Pendant le run, le curseur est désactivé.

W37Curseur « Random Seed »

Barre latérale gauche, sous le curseur de budget.

TECHNIQUE

Curseur de 1 à 100, pas de 1. Par défaut 42. La graine est transmise à la fois aux échantillons initiaux hypercube latin et à la composante de bruit de l'objectif de démonstration. Reproductibilité : même graine + même espace de recherche + même budget donne une séquence d'essais exactement identique. Utile pour « tes collègues obtiennent-ils tous le même run s'ils reproduisent la démo ? ». Désactivé pendant le run.

W38Graphique (Convergence)

Colonne centrale de la fenêtre.

TECHNIQUE

Diagramme Swift Charts avec deux couches : 1. une ligne pour « meilleure-valeur-jusqu'ici » par essai — une courbe monotone croissante ou constante en couleur d'accent. 2. un point par essai avec la valeur objective individuelle, coloré selon la phase. Taille de symbole 40. Trois libellés de phase : « init » (bleu), « bo » (vert), « restart » (orange).

Une petite légende montre les couleurs de phase en haut à gauche. Si la liste des essais est vide (avant le premier démarrage), un affichage d'état vide avec icône de graphique et l'indication « Press Start to begin a BayesOpt run. » s'affiche à la place.

W39Tableau (Trial Log)

Colonne droite de la fenêtre.

TECHNIQUE

Zone de défilement avec des lignes d'essai empilées paresseusement. Par ligne, une pile horizontale : numéro d'essai (3 chiffres en police à chasse fixe, à gauche), valeur (police à chasse fixe, alignée à droite, 70 pt de large), tag de phase (capsule, remplie à 25% d'opacité — gris pour « init », bleu pour « bo », orange pour « restart » ; ce sont volontairement des couleurs différentes des couleurs des points dans le graphique voisin), en option une étoile jaune si cet essai est actuellement le meilleur. Un mécanisme de défilement automatique saute automatiquement à la fin dès qu'un nouvel essai s'ajoute — de sorte que tu puisses suivre le déroulement en direct au bas de l'écran sans avoir à faire défiler toi-même.

Fenêtre principale : historique de la perte et nombre de Gaussians (I39–I41, renvoi croisé)

Trois des affichages de l'inspecteur dans la fenêtre principale méritent une explication à part, car ils sont constamment visibles pendant un entraînement en cours et qu'il existe des règles empiriques importantes pour savoir quand le tracé a l'air sain. Les affichages se trouvent dans l'inspecteur, dans la section Progression, dans le groupe dépliable Historique de la perte (voir chapitre 2 — Inspecteur), et complètent l'analyse holdout de la fenêtre auxiliaire ci-dessus.

Quand la courbe de perte est-elle saine ? Une courbe de perte saine montre trois phases : (1) Warmup — pendant les 200 à 500 premières itérations, la perte chute fortement d'une valeur élevée (typiquement 0,15–0,25 pour L1+SSIM combinés selon la scène) jusqu'à environ la moitié. Si la perte ne diminue PAS pendant cette phase, c'est généralement que l'entrée est fautive (images corrompues, poses SfM médiocres, nombre de Gaussians initiaux trop faible). (2) Densification — entre environ 500 et densifyUntilIteration (classiquement 15K, MCMC jusqu'à 20K ou 25K), la perte continue de baisser, souvent avec de petits sauts vers le bas lorsque les opérations de densification insèrent de nouveaux Gaussians et que l'optimiseur les exploite. Le nombre de Gaussians augmente pendant cette phase. (3) Refinement — ensuite, la perte entre dans une traîne de plus en plus plate. Valeurs finales typiques à titre indicatif : une scène d'objet bien éclairée (par exemple le Truck de Tanks-&-Temples avec P4 Quality) atteint L1 ≈ 0,023, tandis que les scènes extérieures étendues comme celles de Mip-NeRF 360 restent naturellement au-dessus (0,04–0,07).

Que signifie un plateau ? Un plateau (la courbe de perte reste horizontale sur plusieurs milliers d'itérations) a deux interprétations : (a) le modèle a convergé, poursuivre l'entraînement n'apporte plus rien — c'est le bon cas. (b) le modèle est bloqué (minimum local, mauvaise information de gradient, un plafond atteint sur la limite du buffer) — le mauvais cas. Les deux ont l'air identiques sur le graphique. Pour les distinguer : regarde le nombre de Gaussians. S'il est également plat ET proche du plafond MCMC (par exemple 150K sur 150K avec le préréglage P8 Quality (MCMC)), tu es à la limite — soit augmenter le plafond, soit accepter le plateau. Si le nombre de Gaussians continue de croître mais que la perte ne baisse pas, c'est que le modèle est bloqué.

Quand arrêter vs continuer l'entraînement ? Règle empirique : si aucune amélioration de la perte minimale pendant 10K itérations → arrête, les itérations supplémentaires sont gaspillées. Avant cela : via le menu Entraînement → Continue Training → « +5,000 iterations », tu peux encore ajouter une prolongation si tu observes une amélioration limite (il n'existe pas de raccourci clavier pour cela). Attention : avec MCMC, le plateau est souvent réel — le plafond est la limite naturelle.

Un plateau du nombre de Gaussians n'est PAS un signal de « terminé ». Il signifie seulement que MCMC a atteint son plafond ou que la Classic Densification est à bout. La vraie question du « terminé » n'est répondue que par PSNR/SSIM/LPIPS sur un ensemble de test indépendant — les chiffres correspondants se trouvent dans les rapports de benchmark que tu analyses dans le Pareto Dashboard (W13–W22). La fenêtre Holdout (W23–W29) ne fournit pas ces métriques ; elle évalue seulement si ton ensemble de caméras permet réellement une répartition équitable entre vues d'entraînement et vues de test.

PSNR/Holdout est la vérité, la perte n'est qu'un indicateur indirect. La perte est une métrique relative : elle diminue à mesure que ton modèle s'adapte aux vues d'entraînement. Mais une perte faible ne signifie pas automatiquement un bon modèle — si le modèle a appris par cœur les images d'entraînement (overfitting), la perte serait faible, mais le PSNR sur des vues non vues (holdout) serait mauvais. C'est pourquoi, pour l'évaluation finale de la qualité, il faut toujours regarder les métriques holdout, et non la seule perte finale.

Résumé des règles empiriques

- User Guide et Keyboard Shortcuts sont une aide statique — rapides pour des questions ponctuelles, mais pour aller en profondeur, utilise ce manuel. - Ouvre Manage Storage dès que le disque descend sous 10% d'espace libre. Les logs et le staging des imports sont les coupables habituels. - Le Pareto Dashboard n'a de sens qu'après au moins trois ou quatre rapports d'entraînement. Axe X = coût (Time / Gs), axe Y = qualité (PSNR / SSIM). Le front de Pareto montre les combinaisons efficaces. - Utilise Holdout Analysis avant de publier des benchmarks PSNR avec d'autres — cela t'assure que ton ensemble de test est vraiment représentatif. La répartition en folds exportée est destinée aux outils externes ; RadianceKit continue de s'entraîner contre « every-8th ». - BayesOpt Console est avant tout un outil d'apprentissage et d'inspection pour les définitions d'espace de recherche — il calcule sur une fonction de démonstration, pas sur de véritables exécutions d'entraînement. - Le plateau de loss et le plateau du nombre de gaussiennes doivent être interprétés séparément. La limite de cap n'est pas un signal de « terminé ». Seule la PSNR sur le holdout mesure la vraie qualité. - 10K itérations sans amélioration du min-loss → arrête l'entraînement.