Bild laden und standardisieren

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MariaDB/MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
Antworten
kathilei_02
User
Beiträge: 1
Registriert: Dienstag 3. Mai 2022, 08:36

hallo, ich habe folgende Aufgabe und weiß leider nicht wie ich sie lösen soll. falls mir jemand helfen kann würde ich mich sehr freuen. :P :wink:


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.
__deets__
User
Beiträge: 14533
Registriert: Mittwoch 14. Oktober 2015, 14:29

Da wir hier ueblicherweise keine Hausaufgaben auf Bestellung abliefern: bitte zeig, was du versucht hast, und wo du konkret Verstaendnisprobleme oder Fehlermeldungen hast. Das ist ja auch schon eine recht fortgeschrittene Aufgabe, da sollten doch auch schon Grundlagen vorhanden sein. Wenn du Code postest, bitte mit den code-tags, das ist der </>-Knopf im vollstaendigen Editor.
Sirius3
User
Beiträge: 17746
Registriert: Sonntag 21. Oktober 2012, 17:20

Wieder einmal eine typische Aufgabenbeschreibung, wie man es nicht machen sollte. Eine Klasse sollte nach dem Aufruf von __init__ in einem benutzbaren Zustand sein, ist sie aber erst nach dem Aufruf von analyze_images.
Da die drei Schritte
1. Files suchen
2. Mittelwerte ausrechnen
3. normalisierte Bilddaten liefern
immer in dieser exakten Reihenfolge ablaufen müssen, ist eine Klasse an sich nicht sinnvoll. Drei Funktionen, wovon die zwei ersteren von der letzten aufgerufen würde, wäre deutlich weniger komplex.

Code: Alles auswählen

def find_files(path):
    ...

def calculate_mean(filenames):
    ...

def normalize_images(path):
    filenames = find_files(path)
    mean, std = calculate_mean(filenames)
    for filename in filenames:
        ...
        yield image
Antworten