Mehr Experiment Schreiberei
This commit is contained in:
@@ -1,5 +1,9 @@
|
||||
Während der Implementierung der ViewLayers ist aufgefallen, dass die Zeit, die es dauert ein Bild und die Segmentierungsmasken zu rendern, gesunken ist im Vergleich zur Ausgangslage des Projekts. Um dieses Beobachtung zu validieren und deren Ursache zu finden wurde das folgende Experiment durchgeführt.
|
||||
|
||||
<span style="color: lime;">BEGIN GESCHRIEBEN</span>
|
||||
Während der Implementierung der ViewLayers ist aufgefallen, dass die Zeit, die es dauert ein Bild und die Segmentierungsmasken zu rendern, gesunken ist im Vergleich zur Ausgangslage des Projekts. Um dieses Beobachtung zu validieren und deren Ursache zu finden wurde das folgende Experiment durchgeführt.
|
||||
<span style="color: red;">END GESCHRIEBEN</span>
|
||||
## TODO: Herleitung der Parameter
|
||||
<span style="color: lime;">BEGIN GESCHRIEBEN</span>
|
||||
Ein Durchlauf des Scripts erzeugt eine definierte Anzahl an Bildern und den dazugehörigen Segmentierungsmasken.
|
||||
|
||||
Listing ... zeigt als Pseudo-Code den Groben Ablauf des Scripts. Anfangs wird einmalig die Konfiguration sowie geladen. Diese definiert einerseits die Wertebereiche für die später zufällig gewählten Parameter wie z. B. die möglichen Grauwerte für Haut, Sclera, Iris usw. Dort wird auch definiert, wie viele Bilder generiert werden sollen. Darauf folgt eine Schleife, die so viele Iterationen hat, wie Bilder generiert werden sollen (X). Für jede dieser Iterationen wird dann die zufällige Konfiguration bestimmt, also die Blickrichtung des Auges, die Grauwerte der Objekte in der Szene, wie weit das Augenlid geöffnet ist. Mit diesen Werten werden dann die Objekte in den Szenen modifiziert. Es werden auch Node-Trees für die Materialen und das Compositing neu erzeugt. Nachdem die Konfiguration abgeschlossen ist, wird das Bild und dessen Segmentierungsmasken gerendert.
|
||||
@@ -10,6 +14,8 @@ Listing ... zeigt als Pseudo-Code den Groben Ablauf des Scripts. Anfangs wird ei
|
||||
3. Modifiziere Blender-Szene mit zufälliger Konfiguration
|
||||
4. Rendere ein Bild und Segmentierungsmasken
|
||||
```
|
||||
<span style="color: red;">END GESCHRIEBEN</span>
|
||||
|
||||
Daraus ergeben sich mehrere Punkte, an denen die Laufzeit verbessert worden sein kann:
|
||||
|
||||
Da in der im Rahmen dieser Arbeit erweiterten Implementierung nur eine Szene existiert und in der Initialisierung für alle Szenen Logik ausgeführt wird, kann die Initialisierungszeit verkürzt sein. Da diese allerdings nur einmalig ausgeführt wird, kann sie höchstens Einfluss auf die Gesamtlaufzeit haben. Allerdings wurden Verbesserungen in der Render-Zeit einzelner Bilder beobachtet, somit müssen diese signifikanten Verbesserungen in der Schleife auftreten.
|
||||
@@ -18,6 +24,8 @@ Der nächste mögliche Aspekt ist die Zeit, die für die Konfiguration der Szene
|
||||
|
||||
Zuletzt müssen die Bilder gerendert werden. Das ist mit Abstand der aufwendigste Teil dieses Prozesses, der demensprechend die meiste Laufzeit in Anspruch nimmt. Daher ist auch zu erwarten, dass die Laufzeitverbesserungen in diesen Schritt entstehen. Sie können entweder durch den Wechsel von mehreren Szenen auf die ViewLayer entstanden sein, oder durch den Wechsel von Blender-Version 4.x auf die zum Zeitpunkt dieser Arbeit neueste Version 5.0.
|
||||
|
||||
<span style="color: lime;">BEGIN GESCHRIEBEN</span>
|
||||
|
||||
Unter diesen Gesichtspunkten ergeben sich folgende Laufzeiten die direkt gemessen werden können:
|
||||
- Initialisierungszeit ($t_{init}$):
|
||||
Wie lange dauert der Initialisierungsschritt. Aufgrund der geringen Arbeit, die in diesem Schritt passiert ist besten Falls eine minimale Verringerung der Laufzeit zu erwarten.
|
||||
@@ -32,13 +40,20 @@ Unter diesen Gesichtspunkten ergeben sich folgende Laufzeiten die direkt gemesse
|
||||
- Gesamtlaufzeit des Befehls ($t_{total}$)
|
||||
Zu Ausführen des Scripts wird per Kommandozeile Blender als Head-Less Instanz, also ohne sichtbares Fenster, gestartet. Dabei bekommt es sowohl den Pfad zur zu ladende Szene sowie zum auszuführenden Script übergeben. Diese ist für unsere Betrachtung keine sonderlich relevanten Informationen, da lediglich die einmalige Startzeit (und Stoppzeit) von Blender zusätzlich gemessen wird. Da dies allerdings einfach zu messen ist wird es der wissenschaftlichen Vollständigkeit zusätzlich erfasst. Mathematisch kann folgende Laufzeit erwartet werden: $t_{total} = t_{startup} + t_{script} + t_{shutdown}$.
|
||||
|
||||
<span style="color: yellow; font-size: 2em">TODO: Sind t_script und t_total interessant? Ich habe sie bisher noch nicht ausgewertet</span>
|
||||
|
||||
<span style="color: red;">END GESCHRIEBEN</span>
|
||||
|
||||
<span style="color: lime;">BEGIN GESCHRIEBEN</span>
|
||||
|
||||
Es ist zu erwarten, dass die Laufzeiten der Iterationen einer Aufwärmphase unterliegen, in der anfangs Iterationen relativ lange dauern und kürzer werden, bevor sie sich relativ zuverlässig um eine Asymptote sammeln. Daher müssen ausreichend viele Iterationen durchgeführt werden um einerseits die Aufwärmphase zu überwinden und dann ausreichend Datenpunkte für die Bestimmung von Mittelwert und Standardabweichung zu sammeln.
|
||||
In vorläufigen Tests wurde festgestellt, dass die Aufwärmphase nach etwa 10 Iterationen zuverlässig überwunden ist und die Laufzeit der Iterationen dann relativ stabil ist. Es wurde 120 als Anzahl der Iterationen, also der zu generierenden Bilder, gewählt. Das sollten genügend Iterationen sein, um zuverlässige Mittelwerte und Standardabweichungen unter Ausschluss der Aufwärmphase zu liefern.
|
||||
|
||||
Es wurden fünf Durchläufe durchgeführt, um einerseits mehrere Messwerte für die einmaligen Messwerte wie Initialisierungszeit und Gesamtlaufzeit zu sammeln. Außerdem erlaubt dies unerwartete Auswirkungen die Generierungszeit auszuschließen.
|
||||
|
||||
<span style="color: red;">END GESCHRIEBEN</span>
|
||||
# Testdurchläufe:
|
||||
<span style="color: lime;">BEGIN GESCHRIEBEN</span>
|
||||
Es werden grundsätzlich zwei Versionen von HEyes mit einander verglichen: Die original Implementierung von HEyes, auf der die vorliegende Arbeit aufbaut, und die fertige Implementierung dieser Arbeit mit allen zusätzlichen Funktionalitäten. Dabei ist anzumerken, dass die original Implementierung so angepasst wurde, dass die Messung alle nötigen Laufzeiten möglich ist.
|
||||
|
||||
1. Og Implementierung + Blender 4.5:
|
||||
@@ -50,6 +65,9 @@ Es werden grundsätzlich zwei Versionen von HEyes mit einander verglichen: Die o
|
||||
4. Neue Implementierung + Blender 5.0:
|
||||
Dies stellt die endgültige Version der neuen Implementierung und somit die endgültige Performance dar.
|
||||
|
||||
<span style="color: red;">END GESCHRIEBEN</span>
|
||||
|
||||
<span style="color: yellow; font-size: 2em">TODO: Den Check, ob die Messungen Einfluss haben wurde glaube ich nicht gemacht</span>
|
||||
Um die zusätzlichen Messwerte erfassen zu können, musste das Script angepasst werden. Um sicherzustellen, dass die Messung minimalen Einfluss auf die Laufzeiten hatte, wurde zusätzlich der Test ... auch ohne Instrumentalisierung durchgeführt und nur die Gesamtlaufzeit erfasst. Wenn die Ergebnisse zeigen, dass die Gesamtlaufzeiten innerhalb der Standardabweichung praktisch gleich sind, kann davon ausgegangen werden, dass die Instrumentalisierung des Codes keinen Einfluss auf die Gesamtlaufzeit sowie die Teillaufzeiten hatte.
|
||||
|
||||
> [!question]- TODO, falls ich Bock habe
|
||||
|
||||
@@ -239,7 +239,7 @@ test: images/test # Optionaler Pfad zu den Testdaten (relativ zu "path")
|
||||
classes:
|
||||
0: pupil
|
||||
```
|
||||
Ordnerstruktur:
|
||||
Ordnerstruktur: TODO: Die ist falsch
|
||||
```
|
||||
+ current
|
||||
+-+ train
|
||||
@@ -264,13 +264,139 @@ Ordnerstruktur:
|
||||
| | +-- XXXX.txt
|
||||
| | +-- ...
|
||||
```
|
||||
# TODO:
|
||||
#### TODO:
|
||||
1. [x] Nochmal die Bilder extrahieren, damit wir die Statisik haben, wie viele wir nach Phase 1 hatten. (Kommando ist in Experiment2/extracted_500k_images)
|
||||
1. [x] Dafür im Script wieder alle Testpersonen aktivieren
|
||||
2. [x] Nochmal gucken, ob 0.5 für SSIM-Schwellwert wirklich gut ist
|
||||
2. [x] Helligkeitswerte extrahieren
|
||||
3. [ ] Mit einem kleinen Yolo-Modell testen, ob das geplotte funktioniert
|
||||
3. [x] Mit einem kleinen Yolo-Modell testen, ob das geplotte funktioniert
|
||||
-> es schein einen runs-Ordner im root-Verzeichnis zu geben, da macht Yolo schon einiges
|
||||
4. [ ] Optimierungen in alte Pipeline aufnehmen
|
||||
5. [ ] Die Trainings-Bilder generieren (5000 alt, 5000 neu)
|
||||
6. [ ] Trainings der Modelle
|
||||
4. [x] Optimierungen in alte Pipeline aufnehmen
|
||||
5. [x] Die Trainings-Bilder generieren (5000 alt, 5000 neu)
|
||||
6. [x] Trainings der Modelle
|
||||
|
||||
# Auswertung:
|
||||
## Grundlagen:
|
||||
Zu berechnen:
|
||||
- IoU und Dice-Score
|
||||
- Pro Bild berechnen -> Boxplot/Violinplot
|
||||
- Durchschnitt und Std. Dev. über alle Bilder -> Tabelle
|
||||
## Tiefer gehen:
|
||||
- Da selbes Testset kann man gepaart vergleichen:
|
||||
- _Wilcoxon Signed-Rank Test_ auf die per-Bild-Dice/IoU-Werte
|
||||
- oder _Bootstrap-Konfidenzintervalle_ für die Differenz der Mittelwerte
|
||||
|
||||
## Anteil klarer Fehlerfälle:
|
||||
z. B.
|
||||
- Anteil Bilder mit IoU = 0
|
||||
- Anteil Bilder mit Dice < 0.5
|
||||
- Anteil Bilder, in denen die Pupille komplett verfehlt wurde
|
||||
- Anteil Bilder, in denen fälschlicherweise keine Pupille gefunden wurde
|
||||
- Anteil Bilder, in denen fälschlicherweise eine Pupille gefunden wurde
|
||||
- usw.
|
||||
|
||||
## Analyse nach Bildmerkmalen / Schwierigkeiten
|
||||
Wenn du aus den Daten oder Masken etwas ableiten kannst, dann unterteile nach:
|
||||
- **Okklusionsgrad**
|
||||
- **Pupillengröße**
|
||||
- **Pupillenexzentrizität / Blickwinkel**
|
||||
- **Helligkeit / Kontrast**
|
||||
- **Glint-Anzahl**
|
||||
- **Randnähe**
|
||||
|
||||
Dann siehst du nicht nur **welches Modell besser ist**, sondern auch **warum**.
|
||||
|
||||
## Boundary-Metrik als Ergänzung
|
||||
Falls dich die **Konturgenauigkeit** interessiert:
|
||||
- Boundary F1
|
||||
- Hausdorff Distance
|
||||
- Average Surface Distance
|
||||
|
||||
Für Pupillensegmentierung kann das nützlich sein, weil kleine Randfehler für die spätere Ellipsen- oder Mittelpunktbestimmung relevant sein können.
|
||||
|
||||
## Pupil center error
|
||||
Das RIT-Eyes-Paper nennt explizit, dass zusätzlich auch die **Abweichung des Pupillenzentrums** eine sinnvolle Metrik sein kann.
|
||||
Für dein Eye-Tracking-Thema ist das sogar **sehr relevant**, weil ein Modell mit ähnlichem Dice trotzdem einen schlechteren Pupillenmittelpunkt liefern kann.
|
||||
|
||||
-> Da der 500k-Datensatz sowas nicht direkt bietet, müssten wir wahrscheinlich
|
||||
Dann berechnest du den **Pupil Center Error** auf zwei Arten:
|
||||
- **Centroid-basiert**
|
||||
- **Ellipsenfit-basiert**
|
||||
|
||||
So kannst du zwei leicht unterschiedliche Fragen beantworten:
|
||||
- **Centroid:**
|
||||
Wie gut stimmt der Schwerpunkt der vorhergesagten Maske mit dem der Ground Truth überein?
|
||||
- **Ellipsenfit:**
|
||||
Wie gut stimmt das aus der globalen Pupillenform geschätzte Zentrum überein?
|
||||
Das hilft dir auch bei der Interpretation:
|
||||
- **Centroid schlechter, Ellipsenfit besser**
|
||||
→ eher lokale Formfehler / Löcher / kleine Artefakte
|
||||
- **beide schlecht**
|
||||
→ echte Lagefehler oder grobe Segmentierungsfehler
|
||||
- **Dice gut, aber Center Error schlecht**
|
||||
→ Segmentierung überlappt ordentlich, liegt aber leicht verschoben
|
||||
## Methodisch würde Gibbidy es so formulieren
|
||||
|
||||
> Zusätzlich zu Dice-Score und IoU wurde der Fehler des Pupillenzentrums im Bildraum bestimmt. Dazu wurde das Pupillenzentrum sowohl als Schwerpunkt der binären Pupillenmaske als auch als Mittelpunkt einer an die Pupillenkontur angepassten Ellipse berechnet. Der jeweilige Pupil Center Error wurde als euklidischer Abstand zwischen dem aus der Vorhersage bestimmten Zentrum und dem entsprechenden Zentrum der Ground-Truth-Maske angegeben.
|
||||
|
||||
## Inhaltlich wichtig für deine Argumentation
|
||||
Wenn dein Ziel ist zu zeigen, dass die **neue synthetische Pipeline** bessere Trainingsdaten liefert, dann ist die stärkste Story meist:
|
||||
1. **Höherer Dice/IoU auf realen Testdaten**
|
||||
2. **Weniger Ausreißer / robustere Verteilung**
|
||||
3. **Bessere Ergebnisse gerade in schwierigen Fällen**
|
||||
4. eventuell **besserer Pupillenmittelpunkt**
|
||||
|
||||
Das ist meist überzeugender als nur ein einzelner Durchschnittswert.
|
||||
|
||||
|
||||
# TODO:
|
||||
https://chatgpt.com/g/g-p-693e918aca0081919b456cb68144a742-masterarbeit/c/69b9ba88-3018-8390-a2af-0d57aa308a56
|
||||
## Tabelle 1 (pro Modell):
|
||||
### Hauptmetriken:
|
||||
- **Dice:** Mittelwert ± Standardabweichung, Median, IQR
|
||||
- **IoU:** Mittelwert ± Standardabweichung, Median, IQR
|
||||
### Ergänzende Metriken
|
||||
- **Center Error (Centroid):** Mittelwert ± Standardabweichung, Median, IQR
|
||||
- **Center Error (Ellipse):** Mittelwert ± Standardabweichung, Median, IQR
|
||||
|
||||
## Tabelle 2 (Vergleich neu vs. alt):
|
||||
- mittlere Differenz pro Metrik
|
||||
- Wilcoxon-p-Wert
|
||||
- 95%-Konfidenzintervall (weil ich das in einem anderen Experiment auch schon habe)
|
||||
|
||||
## Abbildungen
|
||||
- Boxplot/Violinplot Dice
|
||||
- Boxplot/Violinplot IoU
|
||||
- optional Center Error
|
||||
- Beispielbilder der schlechtesten Fälle
|
||||
|
||||
## Optional: Boundary Metriken berechnen
|
||||
|
||||
|
||||
|
||||
# Quantitative Untersuchung
|
||||
# 1. Anteil Bilder mit IoU = 0
|
||||
# 2. Anteil Bilder mit leerer vorhergesagter Maske (keine Pupille erkannt, obwohl in ground-thruth eine ist)
|
||||
# 3. Anteil Bilder mit fälschlich erkannter Pupille (eine Pupille erkannt, obwohl in ground-thruth KEINE ist)
|
||||
# 3. Anteil Bilder mit zu vielen Pupillen erkannt (mehrere Pupillen erkannt, obwohl in ground-thruth immer nur eine ist)
|
||||
|
||||
|
||||
Was ich jetzt habe (und noch Plane):
|
||||
1. Dice und IoU:
|
||||
1. Tabelle für Dice und IoU mit Mean, Std.Dev., Median, Q1, Q3 und IQR
|
||||
2. Boxplot für Dice und IoU
|
||||
3. TODO: Die Daten im Testset sind zu gleichen Teilen von 10 Probanden -> Boxplot pro Proband machen
|
||||
2. TODO: Konfidenzintervall oder Wilcoxon dingsbums
|
||||
3. Pupil center error (Für Centroid und Ellipse)
|
||||
1. Tabellen
|
||||
2. Boxplots
|
||||
3. TODO: Den Fall: keine Segmentierung in GT erwartet und auch korrekt nichts predicted -> Distanz von 0 oder doch lieber NaN?
|
||||
4. Qualitativer Vergleich:
|
||||
1. (Anzahl) Fälle in denen ein Modell Dice von 1 und das andere von 0 hat:
|
||||
Das bedeutet, dass keine Pupille in GT ist, aber eines der beiden Modelle hat eine Pupille "erkannt" (-> Dice = 0), während das andere korrekt keine erkannt hat (Dice = 1)
|
||||
2. (Anzahl) Fälle in denen beide Modelle Dice = 0 haben, also fälschlicherweise keine Pupille gefunden oder fälschlicherweise eine gefunden haben
|
||||
3. (Anzahl) Fälle in denen ein Modell Dice von 0 und das andere von > 0 hat:
|
||||
Das bedeutet, dass eine Modell hat versagt, das andere aber nicht (entweder korrekt keine Pupille segmentiert, oder zumindest teilweise segmentiert)
|
||||
4. TODO: In wie vielen Fällen ist Baseline Dice besser, in wie vielen ist Current Dice
|
||||
1. TODO: Fälle mit größter Dice-Differenz visuell beurteilen
|
||||
5. TODO: In wie vielen Fällen hat eines der beiden Modelle Dice < 0.5
|
||||
Reference in New Issue
Block a user