Experiment 2: Ermittlung der Luminanzwerte
This commit is contained in:
9
.obsidian/workspace.json
vendored
9
.obsidian/workspace.json
vendored
@@ -27,15 +27,16 @@
|
|||||||
"state": {
|
"state": {
|
||||||
"type": "markdown",
|
"type": "markdown",
|
||||||
"state": {
|
"state": {
|
||||||
"file": "Notizen/16.10.2025.md",
|
"file": "Paperung/Experimente/Experiment 2 - NN performance.md",
|
||||||
"mode": "source",
|
"mode": "source",
|
||||||
"source": false
|
"source": false
|
||||||
},
|
},
|
||||||
"icon": "lucide-file",
|
"icon": "lucide-file",
|
||||||
"title": "16.10.2025"
|
"title": "Experiment 2 - NN performance"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
]
|
],
|
||||||
|
"currentTab": 1
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"direction": "vertical"
|
"direction": "vertical"
|
||||||
@@ -188,7 +189,7 @@
|
|||||||
"pdf-plus:PDF++: Toggle auto-paste": false
|
"pdf-plus:PDF++: Toggle auto-paste": false
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"active": "59d92020d0753901",
|
"active": "82d87f6698a469e1",
|
||||||
"lastOpenFiles": [
|
"lastOpenFiles": [
|
||||||
"Notizen/16.10.2025.md",
|
"Notizen/16.10.2025.md",
|
||||||
"Prewrite/Genereller Maßstab.md",
|
"Prewrite/Genereller Maßstab.md",
|
||||||
|
|||||||
@@ -67,3 +67,96 @@ Yolo S -> sehr gute Performance Laufzeit tradeoff
|
|||||||
Alle Entscheidungen gut begründen -> z.B. welche Yolo Version, warum?
|
Alle Entscheidungen gut begründen -> z.B. welche Yolo Version, warum?
|
||||||
|
|
||||||
Ergebnisse Interpretieren
|
Ergebnisse Interpretieren
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# Vorbereitung:
|
||||||
|
## Auswahl des Test-Datensatzes:
|
||||||
|
Es gibt einige Datensätze für Pupillensegmentierung mit verschiedensten Medien aufgenommen: VR, AR: z. B. NVGaze oder OpenEDS, Eye-Tracking-Brillen z. B. 500k oder LPW.
|
||||||
|
|
||||||
|
Da wir den Einfluss von Verschiedenen Formen untersuchen, ist ein Datensatz mit verschiedenen Personen relevant. Da suchen wir Personen, die
|
||||||
|
Datensätze, die explizit verschiedene Ethnien enthalten sind rar. Viele Datensätze sind von der Domäne her (VR, AR) zu weit vom hier vorliegenden Thema entfernt und enthalten somit Noise, die wir nicht repräsentieren können (z. B. Lichtbrechung durch Linsen der VR-Brille, Verdeckung gewisser Gesichtspartien durch die VR-Brille).
|
||||||
|
|
||||||
|
Für diese Arbeit wurde sich für den 500k-Datensatz entschieden, da dieser direkt Bilder und Pupillen-Masken liefert (ohne wie z. B. bei LPW über TEyeD gehen zu müssen). Außerdem ist er in zwei Teile geteilt, wobei der erste aus 10 Aufnahmen mit laborähnlichen Bedingungen besteht, was die Einflussfaktoren wie Beleuchtungsänderung, Verdeckung, Reflektionen, etc. minimiert. Des Weiteren ist er mehrfach im Rahmen vorheriger Abschlussarbeiten am CHI verwendet worden, was theoretisch eine gewisse Vergleichbarkeit zu diesen Arbeiten ermöglicht.
|
||||||
|
|
||||||
|
## Konstruktion des Datensatzen
|
||||||
|
Der 500k Datensatz wird als zwei Videos geliefert. Im Datensatz sind Videos von 20 Teilnehmern. Das erste Video enthält 10 Aufnahmen unter kontrollierten, laborähnlichen auffnahmen. Das zweite Video enthält 10 schwierige Aufnahmen unter realien Bedingungen mit wechselnden Beleuchtungsszenarien, Reflektionen und Verdeckung z. B. durch eine Brille.
|
||||||
|
|
||||||
|
Wir wollen den isolierten Einfluss von unterschiedlichen Formen des Auges untersuchen, daher bietet sich das erste Video mit den laborähnlichen Aufnahmen an. Das erste Video enthält insgesamt 509379 Bilder. Dabei sei Angemerkt, dass zwischen den einzelnen Aufnahmen einige Bilder mehrfach vorkommen. Pro Teilnehmer sind enthält es im Schnitt 50937 Bilder. Was in etwa 14 Minuten Videomaterial bedeutet. Die genauen Zeitpunkte und Frame-Nummern der Teilnehmer wurden manuell mit Hilfe des Programms [VirtualDub2](http://virtualdub2.com/) ermittelt. Dieses Programm erlaubt es ein Video zu öffnen und Bild für Bild zu inspizieren. Durch ziehen der Laufleiste wurde der ungefähre Zeitraum ermittelt, an dem das Subjekt wechselt. Dann wurde Frame für Frame vor bzw. zurück gegangen, bis der exakte Frame des Wechsels gefunden wurde. VirtualDub2 zeigt dann die Frame-Nummer und den exakten Zeitstempel an.
|
||||||
|
|
||||||
|
## 1. Extraktionsversuch
|
||||||
|
Zunächst wurde versucht, für jeden Teilnehmer einer bestimmte Anzahl Bilder zu erfassen, indem sie über die Laufzeit des Videos in regelmäßigen Abständen extrahiert wurden. Da Bilder, die kurz nacheinander aufgenommen wurden aus Prinzip für gewöhnlich sehr Ähnlich aussehen, dann wäre das Abtasten des Videos über länge Zeiträume weniger ähnlich. Das war tatsächlich aber nicht so, und viele Bilder sahen fast identisch aus.
|
||||||
|
|
||||||
|
Zur Auswertung der Ergebnisse werden nicht alle Bilder aus dem Datensatz herangezogen. Pro Teilnehmer 155 Bilder mit gleichmäßigen Zeitabständen innerhalb ihrer Aufnahmer extrahiert. Das stellt sicher, dass die Bilder eines Patienten unterschiedlich sind (weil zwei aufeinander folgende Bilder oft fast identisch aussehen können). Da es 10 Teilnehmer in diesem Video gibt, ergibt das insgesamt 1550 Bilder, für das Testset. Davon werden fünf Bilder pro Teilnehmer aus dem Testset herangezogen um die durchschnittliche Helligkeitswerte für die Teilnehmer zu extrahieren, und als Parameter für das Bilder generieren zu verwenden. Diese Bilder werden aus dem Testset exkludiert.
|
||||||
|
|
||||||
|
TODO: Darauf hinweisen, dass dadurch technisch gesehen ein vom Testset informierter Datensatz erzeugt wird.
|
||||||
|
|
||||||
|
## 2. Extraktionsversuch:
|
||||||
|
|
||||||
|
Also war ein Ansatz nötig, der tatsächlich visuell unterschiedliche Bilder extrahiert.
|
||||||
|
|
||||||
|
Wir möchten nach wie vor eine feste Anzahl an Bildern extrahieren. Wie Meiko auch (und die Paper, die Meiko auch Zitiert hatte) verwenden wir den Structural Similarity Index (SSIM) um die Zahl der Bilder zu reduzieren.
|
||||||
|
|
||||||
|
```
|
||||||
|
Algorithmus aus extract_frames.py:
|
||||||
|
Phase 1:
|
||||||
|
1. Wir steppen mit einem bestimmten Stride über das Video eines Teilnehmers.
|
||||||
|
2. Wenn der SSIM des aktuellen Bildes im Vergleich zum zuletzt gewählten Bild unter dem Schwellwert liegt, merken wir es uns.
|
||||||
|
|
||||||
|
-> Dadurch entfernen wir Frames, die zeitlich nah beieinander liegen und sehr ähnlich aussehen.
|
||||||
|
|
||||||
|
Phase 2:
|
||||||
|
1. Alle Bilder aus Phase 1 werden auf 32 x 32 herunterskaliert, zu einem 1024-Komponenten-Vektor geplättet und auf den Bereich 0..1 normiert.
|
||||||
|
2. Wähle einen zeitlich mittleren Kandidaten als erstes finales Bild aus.
|
||||||
|
3. Wiederhole, bis die gewünschte Anzahl finaler Bilder gefunden wurde:
|
||||||
|
4. Bestimme für jeden verbleibenden Kandidaten den kleinsten Abstand zu den bereits final ausgewählten Bildern.
|
||||||
|
5. Wähle den Kandidaten, dessen kleinster Abstand am größten ist.
|
||||||
|
6. Füge das zugehörige Bild zu den finalen Bildern hinzu.
|
||||||
|
```
|
||||||
|
|
||||||
|
Phase 1 reduziert also die Zahl der Bilder drastisch und wählt visuell unterschiedliche Bilder aus. Da diese Menge immer noch zu groß war, und dort dises Temporale Sampling zu den selben Problemen geführt hat berechnen wir dann eine klassiche Distanz zwischen den Bildern um anhand der enthaltenen Grauwerte die unterschiedlichkeit der Bilder zu bewerten.
|
||||||
|
|
||||||
|
TODO: Auflisten, wie viele Bilder pro Person nach Phase 1 übrig blieben. Parameter auch noch auflisten (insbesondere Schwellwert für SSIM von 0.5 -> Grund: Ausprobiert, hat gut reduziert, da wir ja nach einem schön kleinen Datensatz suchen)
|
||||||
|
|
||||||
|
Die x unterschiedlichsten Bilder pro Teilnehmer wurden zusätzlich gesondert abgespeichert, um für die Kalibrierung der Luminanzwerte verwendet zu werden.
|
||||||
|
|
||||||
|
## Bestimmung der Luminanz-Werte des Testdatensatzes
|
||||||
|
Die in der Datenextraktion ausgewählten Bilder wurden mit Hilfe des LEyes-parameter-Pickers, der am CHI entwickelt wurde bestimmt (Github-Link). Der LEyes-Parameter-Picker, der in Abbildung XYZ gezeigt wird erlaubt es einen Ordner mit Bildern zu öffnen. Die Bilder des Datensatzes können dann geöffnet werden und Segmentierungsmasken (Roter Bereich in der Abbildung) können mit einem Füll-Werkzeug oder einem Pinsel-Werkzeug gemalt werden. Die Anwendung zeigt dann für den gesamte Datensatz verschiedene Metriken wie durchschnittliche Luminanz und Standardabweichung an.
|
||||||
|
|
||||||
|
(TODO: Gucken, ob ich dass erwähnen möchte)
|
||||||
|
Für diese Arbeit wurden einige Änderungen und Erweiterungen am Parameter-Picker vorgenommen:
|
||||||
|
1. Anzeigen von 5, 10, 90 und 95%-Quantile der Luminanz-Werte
|
||||||
|
2. .... das ist glaube ich für meine Arbeit irrelevant
|
||||||
|
|
||||||
|
Für jeden der fünf Teilnehmer wurden die fünf als am znterschiedlichsten bewerteten Bilder gewählt. Somit fand die Kalibierung anhand von 50 Bildern statt. Ziel der Kalibrierungsbilder ist nicht, die gesamte visuelle Vielfalt des Datensatzes abzubilden sondern stabile Schätzungen für Kenngrößen wie Mittelwert, Standardabweichung, Quantile / Min-Max-nahe Grenzen.
|
||||||
|
Im Parameters Picker wurden erst 1 Bild pro Person, dann 2, dann 3 bis fünf segmentiert. Dabei hat sich gezeigt, dass bereits nach wenigen Bildern pro Teilnehmer die Kenngrößen nur noch wenig Veränderung aufweisen. Somit wurden 5 Bilder pro Testperson als praktikabler Kompromiss zwischen Arbeitsaufwand und statistischer Stabilität gewählt.
|
||||||
|
|
||||||
|
Da ein möglichst diverses Set erzeugt wurde, gab es auch einige Bilder, auf denen die Augen fast oder vollständig geschlossen waren. Damit dennoch fünf Bilder pro Teilnehmer vorlagen wurden in diesen Fällen statt den betroffenen Bildern jeweils die nächsten vom Algorithmus ausgewählten Bilder hinzugezogen. Dabei ist anzumerken, dass die Segmentierungsmasken, die im Datensatz für Pupille und Lidspaltöffnung vorhanden sind nicht direkt verwendet werden können, da z.B. Glanzlichter und ggf. Wimpern auf bzw. vor der Pupille nicht in die Grauwertverteilung für die Pupille einbezogen werden dürfen, da diese separat gerendert werden. Daher mussten Manuell neue Masken erstellt werden. (eben mit dem Parameter Picker)
|
||||||
|
|
||||||
|

|
||||||
|
**Markierung der Iris um die Luminanzwerte zu extrahieren:** Beachte, wie Glanzlichter und Schatten nicht markiert werden, da diese nicht in der Statistik berücksichtigt werden dürfen. Würde man die Schatten mit segmentieren, würde das die durchschnittliche Helligkeit zu niedrig ansetzen, und somit tendenziell unfair nah an der Pupille dran sein. Bei Glanzlichtern wäre sie zu hell.
|
||||||
|
|
||||||
|
Es wurden die Werte für die Pupille, Iris, Aderhaut und die Haut bestimmt.
|
||||||
|
|
||||||
|
Für Pupille und Iris wurde speziell darauf geachtet, dass die Glanzlichter nicht mit in die Wertung einfließen, da sie in der Pipeline gesondert modelliert werden und die Kalibrierung fälschlich nach oben verschieben würden.
|
||||||
|
Für Iris und Sclera wurde zusätzlich darauf geachtet, dass extrem dunkle Schatten nicht mitgewertet werden. Das wurde getan, um eine Verschiebung in die Dunkelheit zu verhindern. Dabei sei angemerkt, dass derzeit keine Schatten in der Pipeline modelliert werden. Wenn der großteil des Auges im Schatten lag, dann wurden diese mit segmentiert, weil sie dann in der aktuellen Pipeline einen "gültigen" Helligkeitswert darstellen.
|
||||||
|
Für die Haut wurde darauf geachtet, dass Augenbrauen und Wimpern nicht einberechnet werden.
|
||||||
|
|
||||||
|
In der Bildgenerierungspipeline wird für Haut, Sclera und Pupille jeweils ein zufälliger Wert aus einer Konfigurierten Normalverteilung ermittelt. Für die Iris wird eine Textur in der jeder Pixel einen zufälligen Grauwerte aus einer aus einer Normalverteilung als Grauwert erhält.
|
||||||
|
|
||||||
|
In der Konfiguration für die Bild-Generierung kann für jeden diese vier Bereiche die Normalverteilung konfiguriert werden. Dazu kann ein Mittelwert sowie die Standardabweichung festgelegt werden. Zusätzlich können ein Minimal- und ein Maximalwert eingestellt werden. Das stellt sicher, dass keine extremen Ausreißer außerhalb der angegebenen Reichweite erzeugt werden. Die Standardabweichung und die Normalverteilung wurden direkt auf die mit dem Parameter-Picker ermittelten Werte festgelegt. Für die Minima- und Maximalwerte wurden jedoch nicht die ermittelten Maximal- und Minimalwerte verwendet. Stattdessen wurde das 5%-Quantil als Minimalwert und das 95%-Quantil als Maximalwert gewählt. Das wurde getan, da Aufnahmen mit Kameras immer ein wenig Rauschen haben und somit extreme Ausreißer nicht als valide Werte angenommen werden können. So wurde z. B. für die Haut ein Wertebereich von \[0 - 242\] ermittelt. Die 5%- und 95%-Quantile sind jedoch 66 und 217. Eine Helligkeit von 0 ist für die Haut unplausibel. Es kann sein, dass ein Pixel tatsächlich einen Wert von 0 hat, z. B. weil er einen sehr dunklen Schatten repräsentiert, in der vorliegenden Pipeline würde das zufällige ziehen des Wertes 0 - oder nahe 0 - die gesamte Haut, und folglich fast das gesamte Bild schwarz wäre. Durch dass wählen des 5%-Quantils als Untergrenze wird sichergestellt, dass zwar durchaus ein dunkler, aber dennoch stets ein im Vergleich zum Testset ein plausibler Grauwert gewählt wird.
|
||||||
|
|
||||||
|
Es sei an dieser Stelle angemerkt, dass zwar kein direktes Leck von Test-Daten in das Training vorliegt, aber durch das wählen der Luminanz-Bereiche anhand der Test-Daten, liegt hier ein geringfügig vom Testset informiertes Training vor. Das ist für diese Arbeit akzeptabel, da ziel dieser Untersuchung nicht die allgemeine Generalisierungsfähigkeit von Neuronalen Netzen anhand der generierten synthetischen Daten ist, sondern nur der Einfluss von verschiedenen Augenformen von Interesse für dieses Experiment ist.
|
||||||
|
|
||||||
|
# Generieren der synthetischen Daten
|
||||||
|
|
||||||
|
# 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
|
||||||
|
4. [ ] Optimierungen in alte Pipeline aufnehmen
|
||||||
|
5. [ ] Die Trainings-Bilder generieren (5000 alt, 5000 neu)
|
||||||
|
6. [ ] Trainings der Modelle
|
||||||
Reference in New Issue
Block a user