

In dieser Übung werden wir jedes Bild laden und standardisieren (Mittelwert Null, Varianz Einheit), indem wir den
globalen Mittelwert und Standardabweichung jedes Farbkanals. Dazu sollten Sie eine Klasse
ImageStandardizer (in der Datei ex3.py). Diese Klasse sollte drei Methoden bereitstellen: __init__,
analyze_images und get_standardized_images. Sie können der Klasse weitere Methoden/Attribute hinzufügen
der Klasse hinzufügen, aber diese drei Methoden sind mit ihren Funktionen, wie unten beschrieben, erforderlich.
Die __init__ Methode dieser Klasse sollte:
- Ein Schlüsselwortargument input_dir (string) annehmen, das den Pfad zu einem Eingabeverzeichnis angibt.
Dies kann ein absoluter oder relativer Pfad sein.
- Dieses Eingabeverzeichnis rekursiv nach Dateien durchsuchen, die auf .jpg enden.
- Wenn es keine .jpg-Dateien gibt, wird ein ValueError ausgelöst.
- Wandle alle Pfade in absolute Pfade um und sortiere sie alphabetisch in aufsteigender Reihenfolge.
- Speichern Sie die sortierten absoluten Dateipfade in einem Attribut self.files.
- Erstellen Sie ein Attribut self.mean mit dem Wert None.
- Erstellen Sie ein Attribut self.std mit dem Wert None.
Die analyze_images Methode dieser Klasse sollte:
- Keine zusätzlichen Argumente annehmen.
- Die Mittelwerte und Standardabweichungen für jeden Farbkanal aller Bilder in der
Liste self.files. Jeder Mittelwert und jede Standardabweichung wird also drei Einträge haben: einen für
einen für den roten (R), einen für den grünen (G) und einen für den blauen Kanal (B).
- Speichern Sie den Durchschnitt über diese RGB-Mittelwerte aller Bilder im Attribut self.mean (globaler
RGB-Mittelwert). Dieser Wert sollte ein 1D-Numpy-Array des Datentyps np.float64 und mit
Form (3,) sein.
- Speichern Sie den Durchschnitt über diese RGB-Standardabweichungen aller Bilder in dem Attribut
self.std (globale RGB-Standardabweichung). Dieser Wert sollte ein 1D-Numpy-Array sein
des Datentyps np.float64 und mit der Form (3,) sein.
- Rückgabe des Tupels (self.mean, self.std).
Die Methode get_standardized_images dieser Klasse sollte:
- Keine zusätzlichen Argumente annehmen.
- einen ValueError auslösen, wenn self.mean oder self.std keine ist.
- Die Pixeldaten jedes Bildes liefern (Generatorfunktion), d.h. die Numpy-Rohdaten mit
Form (H, W, 3), in der Reihenfolge, in der die Bilddateien in self.files erscheinen. Dazu werden in
jeder Yield-Iteration, sollte die Methode:
- Das Bild laden und die Bilddaten (Pixel) in einem 3D-Numpy-Array des Datentyps
np.float32.
- Standardisieren Sie die Bilddaten mit dem globalen RGB-Mittelwert und der Standardabweichung in
self.mean und self.std. Dazu subtrahieren Sie den entsprechenden self.mean von
von den Pixelwerten und dividieren Sie anschließend die Pixelwerte durch self.std für jeden
Farbkanal.
- Geben Sie die standardisierten Bilddaten als 3D numpy-Array des Datentyps np.float32 aus.
- Hinweis: Achten Sie darauf, die Bilddaten in der Yield-Iteration einzeln zu laden, anstatt
die gesamten Daten einmal zu Beginn zu laden und danach einzelne Elemente auszugeben. (Wir tun so, als ob der gesamte Datensatz zu groß wäre, um ihn auf einmal in den
RAM auf einmal zu laden.)
Hinweise
- Sie können davon ausgehen, dass alle Dateien mit Dateinamen, die auf .jpg enden, gültige RGB-Bilder sind.
- Kleine Abweichungen aufgrund des Float-Datentyps sind zu erwarten und zulässig. Stellen Sie sicher, dass Sie
den angegebenen Datentyp für Berechnungen zu verwenden, da sonst die Abweichungen zu groß sind.
- Wenn möglich, führen Sie die Array-Operationen in-place aus, um weniger RAM zu verbrauchen und
schnellere Verarbeitung. Versuchen Sie auch, vektorisierte Operationen zu verwenden (teilen Sie z. B. nicht die Berechnungen von Mittelwert und
Standardabweichung nicht für jeden Farbkanal separat berechnen).
- Wie genau Sie die Lösung für diese Aufgabe gestalten, ist Ihnen überlassen, solange sie die
Anforderungen aus dem Übungstext erfüllt.