Bachelorarbeit · TUM · 2026
Synthetic Eye Image Generation using Foundation Models
Kann ein von KI gemalter Hintergrund günstige synthetische Augenbilder fürs Training nützlicher machen? Ich habe es auf einer einzigen Gaming-GPU getestet. Es hat messbar geholfen und gezeigt, wie viel noch fehlt.
Das Problem
Blickschätzung bedeutet, aus einem Bild zu bestimmen, wohin eine Person schaut. Ein solches Modell braucht viele annotierte Bilder zum Training, und echte Aufnahmen sind langsam und teuer. Tools wie UnityEyes rendern auf normaler Hardware innerhalb von 24 Stunden eine Million annotierte Augenbilder, zeichnen aber nur die Augenpartie auf einem einfarbig grauen Hintergrund. Modelle, die damit trainiert werden, tun sich mit echten Fotos schwer. Das nennt man Sim-to-Real-Lücke.
Die Forschungsfrage
How can repainting synthetic images with foundation models improve gaze estimation model performance by closing the domain gap?Die Idee
Ich habe jeden Pixel des gerenderten Auges beibehalten und ein Diffusionsmodell nur den grauen Hintergrund neu malen lassen. Das nennt sich Outpainting. Weil das Auge selbst unverändert bleibt, stimmen die Blick-Labels weiterhin, ganz ohne neue Annotation. Den entstandenen Datensatz habe ich FluxEyes genannt.






Passend für eine GPU
Ich wollte nah an den geringen Hardware-Anforderungen bleiben, die UnityEyes so beliebt machen. Deshalb lief alles auf einer einzigen RTX 4080 mit 16 GB VRAM. Mit allen Komponenten braucht Flux.1 33 GB, Teile landen also im deutlich langsameren CPU-Speicher. Die Reduktion der Modellparameter von 32 auf 8 Bit und der Wechsel zu flex2, einem kleineren Community-Modell, senkten die Generierung von 42 Sekunden auf etwa 7 Sekunden pro Bild. Für eine Million Bilder wären das immer noch über zwei Monate, also habe ich das Budget auf 48 Stunden und 20.000 Bilder festgelegt.
Wie ich es getestet habe
Ich habe drei Datensätze mit je 20.000 Trainings- und 5.000 Testbildern verglichen: UnityEyes, FluxEyes und echte Fotos aus ETH-XGaze, gefiltert auf dieselben Kopfhaltungen und mit unterschiedlichen Personen in Training und Test. Auf jedem Datensatz habe ich ein auf ImageNet vortrainiertes ResNet50 über 25 Epochen trainiert und dann jedes Modell auf jedem Testset geprüft.
Was dabei herauskam
| Trainiert auf | Getestet auf UnityEyes | Getestet auf FluxEyes | Getestet auf XGaze (echt) |
|---|---|---|---|
| UnityEyes | 1,65 | 7,24 | 19,47 |
| FluxEyes | 2,46 | 1,88 | 17,87 |
| XGaze (echt) | 22 | 21,8 | 6,22 |
- Auf echten Fotos sank der Fehler von 19,47° auf 17,87°, also um etwa 8 %, allein durch den neu gemalten Hintergrund.
- Das nur auf UnityEyes trainierte Modell schnitt auf übermalten Bildern deutlich schlechter ab: 7,24° statt 1,65°. Für mich ein Zeichen, dass es sich auf den grauen Hintergrund gestützt hatte.
- Das auf echten Fotos trainierte Modell erreichte auf beiden synthetischen Sets fast denselben Wert, 22° und 21,8°. Das Übermalen hat also nichts verändert, was für den Blick wichtig ist.
Grenzen und nächste Schritte
Ein Fehler von rund 18° ist noch weit von den 6,22° entfernt, die ein Modell erreicht, wenn es auf echten Fotos trainiert und getestet wird, und 20.000 Bilder sind für dieses Feld wenig. Als Nächstes sehe ich zwei Schritte: UnityEyes als Basis ersetzen und das ganze Bild mit einem neu trainierten Diffusionsmodell erzeugen, das Blickziel und Kopfhaltung als Eingaben nimmt.
Gebaut mit
- Python
- PyTorch
- OpenCV
- Flux.1
- flex2
- ResNet50
- UnityEyes
Du baust gerade etwas? Erzähl mir davon.
Ich rede gern über Arbeit, Nebenprojekte oder eine gute Wanderroute.