Computational Visual Perception - Exam.pdf

Computational Visual Perception - Exam
Computational Visual Perception - Exam Aufgabe 1) Du arbeitest als Softwareentwickler in der Bildverarbeitung. Das Unternehmen, für das Du arbeitest, entwickelt eine Anwendung, die digitale Bilder analysiert und verarbeitet. Deine Aufgabe ist es, sicherzustellen, dass die Anwendung Bilder korrekt darstellt, verarbeitet und verschiedene Bildformate unterstützt. Die Anwendung muss auch in der Lage s...

© StudySmarter 2024, all rights reserved.

Computational Visual Perception - Exam

Aufgabe 1)

Du arbeitest als Softwareentwickler in der Bildverarbeitung. Das Unternehmen, für das Du arbeitest, entwickelt eine Anwendung, die digitale Bilder analysiert und verarbeitet. Deine Aufgabe ist es, sicherzustellen, dass die Anwendung Bilder korrekt darstellt, verarbeitet und verschiedene Bildformate unterstützt. Die Anwendung muss auch in der Lage sein, Bilder zu filtern und Bildmetadaten zu verarbeiten. Bei der Implementierung dieser Funktionen stößt Du auf verschiedene Begriffe und Technologien der digitalen Bilddarstellung, die Du verstehen und korrekt anwenden musst.

a)

Beschreibe die verschiedenen Farbräume (RGB, CMYK, YUV). Erkläre, in welchen Anwendungen sie bevorzugt verwendet werden und warum.

Lösung:

Farbräume und ihre Anwendungen in der Bildverarbeitung

  • RGB Farbraum:
    • Beschreibung: Der RGB-Farbraum basiert auf den drei Grundfarben Rot (R), Grün (G) und Blau (B). Farben werden durch Addieren dieser drei Grundfarben in verschiedenen Intensitäten erzeugt.
    • Anwendung: Der RGB-Farbraum ist der Standardfarbraum für elektronische Displays wie Monitore, Fernseher und Kameras.
    • Warum: RGB ist ideal für digitale Geräte, die Licht emittieren, da es auf dem Prinzip der additiven Farbmischung basiert, das dem natürlichen Sehempfinden des menschlichen Auges entspricht.
  • CMYK Farbraum:
    • Beschreibung: Der CMYK-Farbraum besteht aus den vier Farben Cyan (C), Magenta (M), Gelb (Y) und Schwarz (K). Er basiert auf dem Prinzip der subtraktiven Farbmischung, wobei Farben durch Mischen von Farbpigmenten erzeugt werden, die Lichtwellen herausfiltern.
    • Anwendung: CMYK wird hauptsächlich im Druckwesen verwendet, wie beispielsweise beim Drucken von Zeitschriften, Büchern und Plakaten.
    • Warum: CMYK ist optimal für Druckerzeugnisse, da Druckfarben auf Pigmenten basieren, welche Farben durch das Absorbieren von Lichtwellen erzeugen.
  • YUV Farbraum:
    • Beschreibung: Der YUV-Farbraum besteht aus drei Komponenten: Helligkeit (Y), und zwei Farbkomponenten (U und V), die die Farbabweichung von Grau repräsentieren. Dieser Farbraum teilt die Informationen in Helligkeit und Farbkomponenten auf.
    • Anwendung: YUV wird häufig in der Videoverarbeitung und Übertragung verwendet, wie bei TV-Signalen und Videokompression.
    • Warum: Der YUV-Farbraum ist effizient für die Speicherung und Übertragung von Videosignalen, da die menschliche Wahrnehmung empfindlicher auf Helligkeitsunterschiede als auf Farbunterschiede reagiert. Dies ermöglicht eine bessere Kompression von Videodaten, ohne die wahrgenommene Qualität signifikant zu beeinträchtigen.

b)

Ein Bild hat eine Auflösung von 1920x1080 Pixeln und eine Farbtiefe von 24 Bit. Berechne die ungefähre Speichergröße dieses Bildes in Megabyte (MB). Ermittle auch die Größe nach Anwendung einer verlustfreien PNG-Kompression, wenn die Kompression ein Verhältnis von 3:1 ergibt.

Lösung:

Berechnung der Speichergröße eines Bildes

  • Gegebene Daten:
    • Auflösung des Bildes: 1920x1080 Pixel
    • Farbtiefe: 24 Bit pro Pixel
  • Berechnung der ungefähren Speichergröße:
    • Zuerst berechnen wir die Gesamtanzahl der Pixel: Anzahl der Pixel = 1920 * 1080 diese Formel ergibt: 1920 * 1080 = 2.073.600 Pixel
    • Dann berechnen wir die Speichergröße in Bits: Speichergröße (Bits) = Anzahl der Pixel * Farbtiefe 2.073.600 Pixel * 24 Bit/Pixel = 49.766.400 Bits
    • Wandeln wir die Bits in Bytes um: Speichergröße (Bytes) = Speichergröße (Bits) / 8 49.766.400 Bits / 8 = 6.220.800 Bytes
    • Schließlich wandeln wir die Bytes in Megabytes um: Speichergröße (MB) = Speichergröße (Bytes) / (1024 * 1024) 6.220.800 Bytes / 1.048.576 = ungefähr 5,93 MB
  • Berechnung der Speichergröße nach verlustfreier PNG-Kompression:
    • Das Kompressionsverhältnis beträgt 3:1. Das bedeutet, dass die Datei nach der Kompression nur ein Drittel der ursprünglichen Größe hat.
    • Speichergröße nach Kompression = ursprüngliche Größe / Kompressionsverhältnis 5,93 MB / 3 = ungefähr 1,98 MB

Zusammenfassend

  • Die ungefähre Speichergröße des Bildes beträgt 5,93 MB.
  • Nach der verlustfreien PNG-Kompression beträgt die Speichergröße etwa 1,98 MB.

c)

Die Implementierung von Filtern und Transformationen ist ein wesentlicher Teil Deines Projekts. Erläutere, wie die Fourier-Transformation in der Bildverarbeitung verwendet wird, und gib ein Beispiel, wie sie auf ein Bild angewendet wird.

Lösung:

Verwendung der Fourier-Transformation in der Bildverarbeitung

  • Was ist die Fourier-Transformation? Die Fourier-Transformation (FT) ist ein mathematisches Verfahren zur Umwandlung eines Signals aus dem Zeit- (oder Raum-) Bereich in den Frequenzbereich. Dies bedeutet, dass ein Bild, das durch eine Funktion im Raum dargestellt wird, in seine Frequenzkomponenten zerlegt wird.
  • Anwendung in der Bildverarbeitung:
    • Frequenzdarstellung: Die Fourier-Transformation hilft dabei, die Frequenzkomponenten eines Bildes zu analysieren. Hochfrequenzkomponenten entsprechen schnellen Änderungen der Bildintensität (z.B. Kanten), während Niedrigfrequenzkomponenten den glatten Teilen des Bildes entsprechen.
    • Bilder glätten und Rauschen entfernen: Durch das Filtern spezieller Frequenzbereiche (z.B. durch Entfernen von Hochfrequenzrauschen) kann das Bild geglättet oder Rauschen reduziert werden.
    • Kanten und Details hervorheben: Um bestimmte Details oder Kanten in einem Bild hervorzuheben, können bestimmte Frequenzbereiche betont werden.
  • Beispiel: Anwendung der Fourier-Transformation auf ein Bild
  • Schritte:
    • Schritt 1: Konvertiere das Bild in Graustufen, falls es farbig ist.
    • Schritt 2: Wende die Fast-Fourier-Transformation (FFT) auf das Bild an, um es in den Frequenzbereich zu transformieren.
    • Schritt 3: Manipuliere das Frequenzspektrum (z.B. durch Filtern bestimmter Frequenzbereiche).
    • Schritt 4: Wende die inverse Fourier-Transformation an, um das Bild zurück in den Raum zu transformieren.
  • Python-Beispielcode:
  import numpy as np import cv2 import matplotlib.pyplot as plt  # Bild laden und in Graustufen umwandeln image = cv2.imread('image_path.jpg', cv2.IMREAD_GRAYSCALE)  # Fourier-Transformation durchführen f = np.fft.fft2(image) fshift = np.fft.fftshift(f)  # Magnitudenspektrum berechnen magnitude_spectrum = 20*np.log(np.abs(fshift))  # Magnitudenspektrum anzeigen plt.subplot(121),plt.imshow(image, cmap = 'gray') plt.title('Original Bild'), plt.xticks([]), plt.yticks([]) plt.subplot(122),plt.imshow(magnitude_spectrum, cmap = 'gray') plt.title('Magnitude Spectrum'), plt.xticks([]), plt.yticks([]) plt.show()  # Frequenzbereich filtern (z.B. Tiefpassfilter) rows, cols = image.shape crow, ccol = rows // 2 , cols // 2 fshift[crow-30:crow+30, ccol-30:ccol+30] = 0  # Inverse Fourier-Transformation f_ishift = np.fft.ifftshift(fshift) img_back = np.fft.ifft2(f_ishift) img_back = np.abs(img_back)  # Ergebnis anzeigen plt.subplot(121),plt.imshow(image, cmap = 'gray') plt.title('Original Bild'), plt.xticks([]), plt.yticks([]) plt.subplot(122),plt.imshow(img_back, cmap = 'gray') plt.title('Gefiltertes Bild'), plt.xticks([]), plt.yticks([]) plt.show()  

d)

Bildmetadaten enthalten wichtige Informationen über ein Bild. Ein Kunde fragt, wie die EXIF-Daten aus einem JPEG-Bild gelesen und verarbeitet werden können. Welche Informationen können aus EXIF-Daten extrahiert werden, und gib ein Beispiel in Python, wie man EXIF-Daten aus einem Bild liest.

Lösung:

Lesen und Verarbeiten von EXIF-Daten aus einem JPEG-Bild

  • Was sind EXIF-Daten? EXIF (Exchangeable Image File Format) ist ein Standard für Metadaten in Bilddateien wie JPEG. Diese Metadaten enthalten wichtige Informationen über das Bild und die Bedingungen, unter denen es aufgenommen wurde.
  • Mögliche Informationen, die aus EXIF-Daten extrahiert werden können:
    • Kameramodell und Hersteller
    • Datum und Uhrzeit der Aufnahme
    • Belichtungszeit
    • Blendenwert
    • ISO-Wert
    • Brennweite
    • GPS-Informationen (falls vorhanden)
    • Aufnahmebedingungen (z.B. Blitz verwendet, Weißabgleich)
  • Beispiel in Python zum Lesen von EXIF-Daten: Mit der Bibliothek Pillow (eine Erweiterung von PIL - Python Imaging Library) können EXIF-Daten aus einem Bild gelesen werden.
  from PIL import Image from PIL.ExifTags import TAGS, GPSTAGS  def get_exif_data(image_path):  # Bild öffnen  image = Image.open(image_path)  # EXIF-Daten extrahieren  exif_data = image._getexif()  # EXIF-Daten in einem lesbaren Format speichern  exif_dict = {}  if exif_data is not None:   for tag, value in exif_data.items():    tag_name = TAGS.get(tag, tag)    exif_dict[tag_name] = value  return exif_dict  # Pfad zum Bild image_path = 'dein_bild.jpg'  # EXIF-Daten abrufen exif_info = get_exif_data(image_path)  # EXIF-Daten anzeigen for tag, value in exif_info.items():  print(f'{tag}: {value}')  
  • Erläuterung:
    • Die Methode _getexif() extrahiert die EXIF-Daten aus dem Bild.
    • Die EXIF-Daten werden in einem Dictionary gespeichert, damit sie leichter zugänglich und lesbar sind.
    • Die EXIF-Tags werden mit Hilfe der TAGS-Konstanten in lesbare Strings umgewandelt.

Aufgabe 2)

In der Bildverarbeitung spielen Bildvorverarbeitungsmethoden eine entscheidende Rolle bei der Verbesserung und Vorbereitung von Bildern für weitere Analysen. Dabei werden Techniken wie Filterung und Normalisierung angewendet.

  • Filterung: Filter werden zur Rauschreduzierung und zur Kantenerkennung verwendet.
  • Zu den häufig verwendeten Filtern gehören Tiefpassfilter, Hochpassfilter und Medianfilter.
  • Normalisierung: Die Anpassung der Helligkeits- und Kontrastwerte wird vorgenommen, um Bilder zu standardisieren.
  • Die mathematische Darstellung der Normalisierung erfolgt durch: \(\frac{x - \text{min}(x)}{\text{max}(x) - \text{min}(x)}\)für die Skalierung auf das Intervall [0, 1].

a)

Beschreibe den Unterschied zwischen Tiefpassfilter und Hochpassfilter. Gib an, in welchen Situationen jeder dieser Filter bevorzugt angewendet wird.

Lösung:

Ein Grundverständnis der Filterung in der Bildverarbeitung ist entscheidend, um die Unterschiede zwischen Tiefpassfilter und Hochpassfilter zu erkennen und zu verstehen, wann jeder Filter angewendet werden sollte.

  • Tiefpassfilter: Ein Tiefpassfilter lässt niedrige Frequenzen passieren und unterdrückt hohe Frequenzen im Bild. Dies führt hauptsächlich zur Glättung des Bildes und zur Reduzierung von Rauschen. Er entfernt feine Details und Kanten, was oft erwünscht ist, um Unregelmäßigkeiten und Rauschen zu vermindern.
  • Der mathematische Hintergrund eines Tiefpassfilters kann beispielsweise durch die Faltung des Bildes mit einem Glättungskern beschrieben werden. Ein üblicher Glättungskern könnte so aussehen:

\[ F'(x, y) = \frac{1}{9} \begin{bmatrix} 1 & 1 & 1 \ 1 & 1 & 1 \ 1 & 1 & 1 \end{bmatrix} \times F(x, y) \] 
  • Hochpassfilter: Im Gegensatz dazu lässt ein Hochpassfilter hohe Frequenzen passieren und unterdrückt niedrige Frequenzen. Dies betont die Kanten und feinen Details im Bild. Hochpassfilter werden verwendet, um Kanten und feine Details hervorzuheben, die anderweitig in der Bildstruktur verloren gehen könnten.
  • Der mathematische Hintergrund eines Hochpassfilters kann durch die Faltung des Bildes mit einem Kantenverstärkungskern dargestellt werden. Ein üblicher Kantenverstärkungskern könnte so aussehen:

    \[ F'(x, y) = \begin{bmatrix} -1 & -1 & -1 \ -1 & 8 & -1 \ -1 & -1 & -1 \end{bmatrix} \times F(x, y) \] 

    Anwendung:

    • Tiefpassfilter: Wird häufig bei der Vorverarbeitung verwendet, um Rauschen zu entfernen, insbesondere in Situationen, in denen eine glatte Bilddarstellung wichtiger ist als feine Details. Typische Einsatzbereiche sind Rauschunterdrückung in medizinischen Bildgebungsverfahren oder Vorverarbeitung von gescannten Dokumenten.
    • Hochpassfilter: Wird bevorzugt eingesetzt, wenn die Kantenerkennung oder die Hervorhebung von Details wichtig ist. Typische Anwendungen sind die Kantenextraktion in der Computer Vision oder die Schärfung von unscharfen Bildern in der Fotografie.

    b)

    Erkläre den Medianfilter und wie er zur Rauschreduzierung in Bildern beiträgt. Implementiere eine einfache Python-Funktion, die einen Medianfilter auf ein 2D-Bild anwendet.

    def median_filter(image, filter_size):    # Dein Code hier

    Lösung:

    Der Medianfilter ist eine nichtlineare digitale Filtertechnik, die verwendet wird, um Rauschen aus Bildern zu entfernen. Im Gegensatz zu linearen Filtern, die den Mittelwert der Pixelwerte im Filterfenster berechnen, ersetzt ein Medianfilter jeden Pixelwert in einem Bild durch den Median der Pixelwerte in seinem Nachbarschaftsfenster. Dadurch werden Extremwerte, die typischerweise durch Rauschen verursacht werden, effektiver entfernt, während die Kanten im Bild besser erhalten bleiben.

    Funktionsweise des Medianfilters:

    • Für jeden Pixel im Bild wird ein rechteckiges Fenster (Filtergröße) definiert, das den Pixel und seine Nachbarn umfasst.
    • Die Pixelwerte innerhalb dieses Fensters werden gesammelt und sortiert.
    • Der Medianwert der sortierten Liste wird berechnet.
    • Der aktuelle Pixelwert wird durch diesen Medianwert ersetzt.
    Die folgende Python-Funktion implementiert einen Medianfilter für ein 2D-Bild:
    import numpy as npdef median_filter(image, filter_size):    # Bilddimensionen auslesen    m, n = image.shape    # Pad die Ränder des Bildes    pad_size = filter_size // 2    padded_image = np.pad(image, pad_size, mode='edge')    # Ergebnisbild initialisieren    filtered_image = np.zeros_like(image)    # Medianfilter anwenden    for i in range(m):        for j in range(n):            # Extrahiere das aktuelle Filterfenster            window = padded_image[i:i+filter_size, j:j+filter_size]            # Berechne den Median im Fenster            median_value = np.median(window)            # Setze den Medianwert in das Ergebnisbild            filtered_image[i, j] = median_value    return filtered_image

    Aufgabe 3)

    In der Vorlesung Computational Visual Perception hast Du gelernt, wie Bilddaten für maschinelle Lernmodelle vorbereitet werden. Ein entscheidender Schritt in diesem Prozess ist die Feature-Extraktion und -Selektion. Du wirst gebeten, verschiedene Techniken zur Feature-Extraktion zu erklären und deren Anwendung zu demonstrieren. Außerdem wirst Du Methoden zur Feature-Selektion anwenden, um die Relevanz der extrahierten Merkmale zu evaluieren und nur die wichtigsten Merkmale für Dein Modell zu wählen. Nutze hierfür die Algorithmen und mathematischen Konzepte aus der Vorlesung.

    a)

    Erkläre die Feature-Extraktionstechniken SIFT und HOG. Gehe auf die grundlegenden Prinzipien ein und beschreibe, wie sie jeweils Bildmerkmale extrahieren. Führe zudem die Unterschiede zwischen diesen beiden Techniken aus.

    • Hinweis: Diskutiere die Anwendungsszenarien beider Techniken und gehe dabei auf die Besonderheiten in der Erkennung von Objekten und Mustern ein.

    Lösung:

    Erklärung der Feature-Extraktionstechniken SIFT und HOGIm Folgenden werden die Feature-Extraktionstechniken SIFT und HOG erläutert. Dabei gehe ich auf die grundlegenden Prinzipien und die Extraktion von Bildmerkmalen ein und beschreibe die Unterschiede zwischen diesen Techniken.

    • Scale-Invariant Feature Transform (SIFT)
    SIFT (Scale-Invariant Feature Transform) ist eine Technik zur Erkennung und Beschreibung von lokalen Merkmalen in Bildern. Die Hauptschritte der SIFT-Extraktion sind:
    • Skalenraum-Erstellung: Es werden mehrere Bilder mit unterschiedlichen Skalierungen (durch Anwendung eines Gaussian-Filters) erstellt. Dadurch werden Merkmale skaleninvariant.
    • Extrempunkt-Erkennung: Die Differenz von Gaussian-Bildern (DoG) wird berechnet und dabei werden lokale Maxima/Minima identifiziert. Diese Extrempunkte entsprechen den potenziellen Merkmalen.
    • Schlüsselpunkt-Orientierung: Jeder extremale Punkt wird anhand des Bildgradienten eine Richtung zugewiesen, um rotationsinvariante Merkmale zu erhalten.
    • Schlüsselpunktbeschreibung: Um den Schlüsselpunkt herum wird ein 16x16 Fenster betrachtet und in 4x4 Unterregionen unterteilt. Der Gradientenverlauf wird für jede Unterregion in Histogrammen zusammengefasst.
    • Histogram of Oriented Gradients (HOG)
    HOG (Histogram of Oriented Gradients) ist eine Methode zur Merkmalsextraktion, die besonders gut bei der Erkennung von Objekten in Bildern funktioniert. Die wesentlichen Schritte der HOG-Extraktion sind:
    • Gradientenberechnung: Der Bildgradient (Richtungs- und Betraggradient) wird für jeden Pixel des Bildes berechnet, indem horizontale und vertikale Ableitungen angewendet werden.
    • Zellenbildung: Das Bild wird in kleine rechteckige Zellen unterteilt (meist 8x8 Pixel).
    • Orientierungshistogramme: Für jede Zelle wird ein Histogramm der Gradientenrichtungen erstellt. Die Orientierung der Gradienten wird in feste Bin-Werte unterteilt (meist 9 Bins).
    • Block-Normalisierung: Mehrere Zellen werden zu Blöcken gruppiert (meist 2x2 Zellen) und die Histogramme innerhalb eines Blocks werden normalisiert, um Beleuchtungsänderungen zu kompensieren.
      Unterschiede zwischen SIFT und HOG
      • Invarianz: SIFT ist skalen- und rotationsinvariant, da es Merkmale auf verschiedenen Skalen und Orientierungen extrahiert. HOG ist hingegen nur translational invariant, da es Hauptmerkmale in kleinen Bildbereichen erkennt und diese normalisiert.
      • Beschreibung von Merkmalen: SIFT verwendet charakteristische Punkte und beschreibt diese mittels eines Merkmalsvektors. HOG beschreibt das gesamte Bild oder größere Bildbereiche und verwendet Histogramme der Gradientenorientierungen.
      • Komplexität: SIFT ist rechenintensiver, da es mehr Schritte und Berechnungen erfordert (insbesondere die Skalenraum-Erstellung). HOG ist einfacher und schneller zu berechnen.
      • Anwendungsgebiete: SIFT eignet sich gut für Anwendungen, die hohe Invarianz erfordern, z.B. Objekt- und Mustererkennung in Bildern, die in verschiedenen Maßstäben vorliegen. HOG wird häufig in der Menschenerkennung verwendet, da es für translational invariante Mustererkennung effektiv ist.
      • Hinweis: SIFT wird oft verwendet, um robuste lokale Merkmale für Bildabgleich und Merkmalsverfolgung zu bekommen. HOG wird häufig in Kombination mit maschinellen Lernalgorithmen, wie zum Beispiel den Support Vector Machines (SVMs), für die Erkennung bestimmter Objekte in festen Größen eingesetzt.

      b)

      Schreibe in Python ein kurzes Beispielskript, das den SIFT-Algorithmus zur Feature-Extraktion verwendet. Lade ein Bild, wende den SIFT-Algorithmus an und visualisiere die extrahierten Merkmale.

      import cv2import matplotlib.pyplot as plt# Laden eines Beispielsbildesdef img = cv2.imread('example.jpg')# Konvertiere das Bild in Graustufengray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)# Initialisiere den SIFT-Detektorsift = cv2.SIFT_create()# Extrahiere die Schlüsselmerkmale und Deskriptorenkeypoints, descriptors = sift.detectAndCompute(gray, None)# Zeichne die Schlüsselmerkmale auf dem Bildimg_with_keypoints = cv2.drawKeypoints(gray, keypoints, img)# Visualisiere das Ergebnisplt.imshow(img_with_keypoints)plt.show()

      Lösung:

      Hier ist ein kurzes Beispielskript in Python, das den SIFT-Algorithmus zur Feature-Extraktion verwendet. Das Skript lädt ein Bild, wendet den SIFT-Algorithmus an und visualisiert die extrahierten Merkmale.

      import cv2import matplotlib.pyplot as plt# Laden eines Beispielsbildesimg = cv2.imread('example.jpg')# Konvertiere das Bild in Graustufengray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)# Initialisiere den SIFT-Detektorsift = cv2.SIFT_create()# Extrahiere die Schlüsselmerkmale und Deskriptorenkeypoints, descriptors = sift.detectAndCompute(gray, None)# Zeichne die Schlüsselmerkmale auf dem Bildimg_with_keypoints = cv2.drawKeypoints(gray, keypoints, img)# Visualisiere das Ergebnisplt.imshow(cv2.cvtColor(img_with_keypoints, cv2.COLOR_BGR2RGB))plt.show()
      Erklärung des Skripts:
      • Das Bild wird mit cv2.imread geladen.
      • Es wird in ein Graustufenbild konvertiert, da der SIFT-Algorithmus Graustufenbilder benötigt.
      • Der SIFT-Detektor wird initialisiert.
      • Die Schlüsselmerkmale und Deskriptoren werden mit sift.detectAndCompute extrahiert.
      • Die extrahierten Schlüsselmerkmale werden auf dem Bild mittels cv2.drawKeypoints visualisiert.
      • Das Ergebnis wird mit matplotlib.pyplot angezeigt.

      c)

      Du hast eine Bilddatenbank mit zahlreichen Features. Verwende die Chi-Quadrat Feature-Selektion, um die wichtigsten Features auszuwählen.

      • Formuliere zunächst die mathematische Grundlage von Chi-Quadrat zur Feature-Selektion. Gehe dabei auf die Berechnung der Teststatistik ein und erkläre, wie diese zur Bestimmung der Relevanz eines Features genutzt wird.
      • Schreibe anschließend einen kurzen Python-Code, der anhand eines Beispieldatensatzes die Chi-Quadrat Feature-Selektion durchführt.
      from sklearn.feature_selection import SelectKBest, chi2import pandas as pd# Beispieldatensatz ladendata = pd.read_csv('data.csv')X = data.drop('target', axis=1)y = data['target']# Chi-Quadrat Feature-Selektionchi2_selector = SelectKBest(chi2, k=5)X_kbest = chi2_selector.fit_transform(X, y)# Ausgabe der ausgewählten Featuresselected_features = X.columns[chi2_selector.get_support()]print('Ausgewählte Features:', selected_features)

      Lösung:

      Mathematische Grundlage der Chi-Quadrat Feature-SelektionDie Chi-Quadrat Feature-Selektion ist eine statistische Methode, um die Relevanz von Features (Merkmalen) zu bestimmen. Sie basiert auf dem Chi-Quadrat-Test, der prüft, ob eine signifikante Assoziation zwischen den unabhängigen Variablen (Features) und der abhängigen Variablen (Target) besteht. Die grundlegenden Schritte sind:

      • Chi-Quadrat-Teststatistik: Für jedes Feature wird die Chi-Quadrat-Teststatistik berechnet. Diese ist definiert als: \[\chi^2 = \sum \frac{(O_i - E_i)^2}{E_i}\] Dabei sind \(O_i\) die beobachteten Häufigkeiten und \(E_i\) die erwarteten Häufigkeiten.
      • Berechnung der erwarteten Häufigkeiten: Die erwarteten Häufigkeiten \(E_i\) werden unter der Annahme berechnet, dass keine Assoziation zwischen dem Feature und dem Zielwert besteht.
      • Teststatistik: Die Chi-Quadrat-Teststatistik wird dann verwendet, um die Hypothese zu prüfen, dass das Feature und der Zielwert unabhängig sind. Ein hoher Wert der Teststatistik indiziert, dass das Feature und der Zielwert abhängiger sind.
      • Feature-Selektion: Die Features mit den höchsten Chi-Quadrat-Werten werden als die wichtigsten identifiziert und ausgewählt, da sie die stärkste Assoziation mit dem Zielwert haben.
      Python-Code zur Chi-Quadrat Feature-SelektionHier ist ein kurzer Python-Code, der die Chi-Quadrat Feature-Selektion unter Verwendung eines Beispieldatensatzes demonstriert:
      import pandas as pd from sklearn.feature_selection import SelectKBest, chi2# Beispieldatensatz laden data = pd.read_csv('data.csv') X = data.drop('target', axis=1) y = data['target']# Chi-Quadrat Feature-Selektion chi2_selector = SelectKBest(chi2, k=5) X_kbest = chi2_selector.fit_transform(X, y)# Ausgabe der ausgewählten Features selected_features = X.columns[chi2_selector.get_support()] print('Ausgewählte Features:', selected_features) 
      Erklärung des Codes:
      • Der Beispieldatensatz wird mithilfe von pandas geladen und in Features (\(X\)) und Zielwerte (\(y\)) getrennt.
      • Der SelectKBest-Algorithmus mit dem chi2-Score-Funktor wird initialisiert, um die 5 besten Features auszuwählen.
      • Die ausgewählten Features werden transformiert und das X_kbest-Set enthält nur die besten Features.
      • Die Namen der ausgewählten Features werden aus dem ursprünglichen Datensatz extrahiert und ausgegeben.

      d)

      Integriere die ausgewählten Features in ein maschinelles Lernmodell und evaluiere seine Leistung. Schreibe einen Python-Code, der die gewählten Features für ein logistisches Regressionsmodell verwendet. Vergleiche die Modellleistung mit einem Modell, das alle Features nutzt.

      • Berechne die Genauigkeit und andere Evaluationsmetriken wie Präzision, Recall und F1-Score beider Modelle und interpretiere die Ergebnisse.
      from sklearn.linear_model import LogisticRegressionfrom sklearn.metrics import accuracy_score, precision_score, recall_score, f1_scorefrom sklearn.model_selection import train_test_split# Aufteilen der Daten in Trainings- und TestdatensatzX_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)# Modell mit allen Features trainierenmodel_all = LogisticRegression()model_all.fit(X_train, y_train)# Modell mit ausgewählten Features trainierenX_train_selected = chi2_selector.transform(X_train)X_test_selected = chi2_selector.transform(X_test)model_selected = LogisticRegression()model_selected.fit(X_train_selected, y_train)# Vorhersagen macheny_pred_all = model_all.predict(X_test)y_pred_selected = model_selected.predict(X_test_selected)# Evaluationsmetriken berechnenmetrics_all = {    'accuracy': accuracy_score(y_test, y_pred_all),    'precision': precision_score(y_test, y_pred_all, average='macro'),    'recall': recall_score(y_test, y_pred_all, average='macro'),    'f1': f1_score(y_test, y_pred_all, average='macro')}metrics_selected = {    'accuracy': accuracy_score(y_test, y_pred_selected),    'precision': precision_score(y_test, y_pred_selected, average='macro'),    'recall': recall_score(y_test, y_pred_selected, average='macro'),    'f1': f1_score(y_test, y_pred_selected, average='macro')}# Ausgabe der Ergebnisseprint('Metriken mit allen Features:', metrics_all)print('Metriken mit ausgewählten Features:', metrics_selected)

      Lösung:

      Um die ausgewählten Features in ein maschinelles Lernmodell zu integrieren und dessen Leistung zu evaluieren, führen wir einen Vergleich zwischen einem Modell, das alle Features nutzt, und einem Modell, das nur die ausgewählten Features nutzt. Hier ist der vollständige Python-Code zur Durchführung des Experiments:

      import pandas as pdfrom sklearn.feature_selection import SelectKBest, chi2from sklearn.linear_model import LogisticRegressionfrom sklearn.metrics import accuracy_score, precision_score, recall_score, f1_scorefrom sklearn.model_selection import train_test_split# Beispieldatensatz ladendata = pd.read_csv('data.csv')X = data.drop('target', axis=1)y = data['target']# Chi-Quadrat Feature-Selektionchi2_selector = SelectKBest(chi2, k=5)X_kbest = chi2_selector.fit_transform(X, y)# Aufteilen der Daten in Trainings- und TestdatensatzX_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)# Modell mit allen Features trainierenmodel_all = LogisticRegression()model_all.fit(X_train, y_train)# Modell mit ausgewählten Features trainierenX_train_selected = chi2_selector.transform(X_train)X_test_selected = chi2_selector.transform(X_test)model_selected = LogisticRegression()model_selected.fit(X_train_selected, y_train)# Vorhersagen macheny_pred_all = model_all.predict(X_test)y_pred_selected = model_selected.predict(X_test_selected)# Evaluationsmetriken berechnenmetrics_all = {    'accuracy': accuracy_score(y_test, y_pred_all),    'precision': precision_score(y_test, y_pred_all, average='macro'),    'recall': recall_score(y_test, y_pred_all, average='macro'),    'f1': f1_score(y_test, y_pred_all, average='macro')}metrics_selected = {    'accuracy': accuracy_score(y_test, y_pred_selected),    'precision': precision_score(y_test, y_pred_selected, average='macro'),    'recall': recall_score(y_test, y_pred_selected, average='macro'),    'f1': f1_score(y_test, y_pred_selected, average='macro')}# Ausgabe der Ergebnisseprint('Metriken mit allen Features:', metrics_all)print('Metriken mit ausgewählten Features:', metrics_selected)
      Erklärung des Codes:
      • Der Beispieldatensatz wird geladen und in Features (\(X\)) und Zielwerte (\(y\)) getrennt.
      • Die Chi-Quadrat Feature-Selektion wird durchgeführt, und die top 5 Features werden ausgewählt.
      • Die Daten werden in Trainings- und Testdatensätze aufgeteilt.
      • Ein logistisches Regressionsmodell wird für die gesamten Features trainiert und dann mit den ausgewählten Features trainiert.
      • Vorhersagen für den Testdatensatz werden erstellt.
      • Evaluationsmetriken wie Genauigkeit, Präzision, Recall und F1-Score werden für beide Modelle berechnet.
      • Die Ergebnisse werden ausgegeben und können verglichen werden.
      Interpretation der Ergebnisse:Durch den Vergleich der Metriken für beide Modelle kannst Du feststellen, ob die Feature-Selektion die Leistung des Modells verbessert oder verschlechtert hat.
      • Eine höhere Genauigkeit, Präzision, Recall und F1-Score für das Modell mit den ausgewählten Features deutet darauf hin, dass die Chi-Quadrat Feature-Selektion effektiv relevante Merkmale identifiziert hat.
      • Falls die Leistung des Modells mit den ausgewählten Features schlechter ist, könnte das darauf hindeuten, dass wichtige Merkmale entfernt wurden, oder dass weitere Optimierungen notwendig sind.

      Aufgabe 4)

      In der Vorlesung 'Computational Visual Perception' hast Du verschiedene Klassifikationsmethoden wie k-Nearest Neighbors (k-NN), Support Vector Machines (SVM) und neuronale Netze (NN) kennengelernt. Diese Methoden sind wesentlich zur Lösung von Klassifikationsaufgaben in der computergestützten visuellen Wahrnehmung. In der folgenden Aufgabe sollst Du dein Wissen über diese Methoden anwenden und vertiefen.

      a)

      (a) k-Nearest Neighbors: Angenommen Du hast einen Datensatz mit 2D-Merkmalen \((x_1, y_1), (x_2, y_2), ..., (x_n, y_n)\) und dazugehörigen Klassenlabels \(c_1, c_2, ..., c_n\). Beschreibe die Schritte, die nötig sind, um einen neuen Punkt \(x_{new}, y_{new}\) mit k-NN zu klassifizieren. Gehe dabei insbesondere auf die Wahl von k und die möglichen Probleme, die bei einer sehr kleinen bzw. sehr großen Wahl von k auftreten, ein.

      Lösung:

      (a) k-Nearest Neighbors: Um einen neuen Punkt \(x_{new}, y_{new}\) mit k-Nearest Neighbors (k-NN) zu klassifizieren, gehe wie folgt vor:

      • Schritt 1: Berechnung der Distanzen: Berechne die Distanz zwischen dem neuen Punkt und allen Punkten im Datensatz. Eine gängige Distanzmetrik für 2D-Daten ist die euklidische Distanz. Die euklidische Distanz zwischen zwei Punkten \( (x_i, y_i) \) und \( (x_j, y_j) \) ist definiert als:
      • \[ d((x_i, y_i), (x_j, y_j)) = \sqrt{(x_i - x_j)^2 + (y_i - y_j)^2} \]

      • Schritt 2: Auswahl der k nächsten Nachbarn: Sortiere alle berechneten Distanzen und wähle die k nächsten Punkte, die dem neuen Punkt am nächsten liegen.
      • Schritt 3: Mehrheitsvotierung: Bestimme die Klassenlabels der k nächsten Nachbarn. Die Klasse, die am häufigsten unter den k Nachbarn vorkommt, wird dem neuen Punkt \(x_{new}, y_{new}\) als Label zugewiesen.

      Wahl von k:

      • Sehr kleines k (z.B. k=1): Bei einem sehr kleinen k kann das Modell sehr empfindlich auf Ausreißer reagieren. Da nur der nächste Nachbar betrachtet wird, kann es häufiger zu Fehlklassifikationen kommen, besonders wenn dieser Nachbar ein Ausreißer ist.
      • Sehr großes k: Wenn k sehr groß gewählt wird, können Punkte, die weiter entfernt liegen und möglicherweise nicht relevant sind, das Ergebnis beeinflussen. Das Modell könnte dann zu stark geglättet werden und wichtige lokale Strukturen im Datensatz übersehen.
      • Eine gute Wahl von k hängt oft von der Datenmenge und der spezifischen Verteilung der Klassen ab. Häufig wird k durch Kreuzvalidierung ermittelt, um die beste Balance zwischen Bias und Varianz zu finden.

      b)

      (b) Support Vector Machines: Erläutere den 'Kernel-Trick' in Support Vector Machines. Gehe darauf ein, warum dieser Trick nützlich ist und wie er die Klassifikation erleichtert. Zeige anhand eines Beispiels, wie der Kernel-Trick angewendet wird und wie sich dadurch die Berechnung der Trennlinie verändert. Verwende dafür den Polynomkernel \(K(x_i, x_j) = (x_i^T x_j + 1)^d\).

      Lösung:

      (b) Support Vector Machines: Der 'Kernel-Trick' in Support Vector Machines (SVM) ist ein mathematisches Verfahren, um die Berechnung von inneren Produkten in einem höherdimensionalen Raum zu ermöglichen, ohne die Punkte tatsächlich in diesen Raum zu transformieren. Dies ist besonders nützlich, weil es die Rechenkomplexität reduziert und dennoch ermöglicht, nichtlineare Trennlinien zu finden.

      Nützlichkeit des Kernel-Tricks:

      • Viele Datenmengen sind nicht linear trennbar in ihrem ursprünglichen Raum. Durch die Verwendung von Kernels funktioniert der SVM, indem die Daten in einen höherdimensionalen Raum projiziert werden, wo sie linear trennbar sind.
      • Der Trick ermöglicht es, komplexe Muster in den Daten zu erfassen, ohne explizit eine möglicherweise sehr komplexe und rechenintensive Transformation durchzuführen.

      Beispiel des Kernel-Tricks mit Polynomkernel:

      Betrachten wir einen Polynomkernel der Form:

      \[K(x_i, x_j) = (x_i^T x_j + 1)^d\]

      Hier steht \(x_i^T x_j\) für das innere Produkt der Vektoren \(x_i\) und \(x_j\), und \(d\) ist der Grad des Polynoms.

      Anwendung des Polynomkernels:

      Stell Dir vor, wir haben zwei Datenpunkte \(x_1 = [1, 2]\) und \(x_2 = [3, 4]\). Das innere Produkt \(x_1^T x_2\) ist:

      \[x_1^T x_2 = 1 \times 3 + 2 \times 4 = 3 + 8 = 11\]

      Wenn wir nun den Polynomkernel mit \(d = 2\) anwenden, erhalten wir:

      \[K(x_1, x_2) = (11 + 1)^2 = 12^2 = 144\]

      Veränderung der Berechnung der Trennlinie:

      Durch den Kernel-Trick müssen wir die Punkte nicht explizit in einen höherdimensionalen Raum transformieren. Stattdessen arbeiten wir direkt mit den Kernelwerten, die effektiv die inneren Produkte im höherdimensionalen Raum darstellen.

      In praktischen SVM-Berechnungen würde die Trennlinie in der Form \(w^T \tilde{x} + b = 0\) gefunden werden, wobei \(\tilde{x}\) die höherdimensional transformierten Datenpunkte repräsentiert. Die Koeffizienten \(w\) und \(b\) werden durch Optimierung über die Kernelmatrix berechnet, ohne die Transformation explizit durchzuführen.

      c)

      (c) Neuronale Netze: Ein einfaches neuronales Netz besteht aus einer Input-Schicht, einer versteckten Schicht mit nichtlinearer Aktivierungsfunktion und einer Output-Schicht. Gegeben sei ein neuronales Netz mit einer Input-Schicht aus 3 Neuronen, einer versteckten Schicht mit 4 Neuronen und einer Output-Schicht mit 2 Neuronen. Zeichne dieses Netz und erkläre die Vorwärtspropagation in diesem Netz. Formuliere die mathematischen Gleichungen, die die Berechnungen in jeder Schicht beschreiben. Verwende dabei die Sigmoid-Aktivierungsfunktion \( \text{sigmoid}(z) = \frac{1}{1+e^{-z}} \).

      Lösung:

      (c) Neuronale Netze: Ein einfaches neuronales Netz besteht aus einer Input-Schicht, einer versteckten Schicht mit nichtlinearer Aktivierungsfunktion und einer Output-Schicht. Gegeben sei ein neuronales Netz mit einer Input-Schicht aus 3 Neuronen, einer versteckten Schicht mit 4 Neuronen und einer Output-Schicht mit 2 Neuronen.

      Zeichnung des Netzwerks:

      Neural Network Diagram

      Vorwärtspropagation: In der Vorwärtspropagation werden die Eingabedaten durch das Netzwerk von der Input-Schicht zur Output-Schicht propagiert. Hier sind die Berechnungen in jeder Schicht beschrieben.

      1. Input-Schicht zu versteckter Schicht:

      Seien die Eingaben \(x_1, x_2, x_3\). Die Gewichte zwischen Input- und versteckter Schicht werden als Matrix \(W_{1} \) und die Biases als Vektor \(b_{1} \) dargestellt. Die Berechnungen der Aktivierungen \(a_{1}^1, a_{1}^2, a_{1}^3, a_{1}^4\) in der versteckten Schicht sind wie folgt:

      Linearer Schritt:

      \[ z_{1} = W_{1} \begin{pmatrix} x_1 \ x_2 \ x_3 \ \end{pmatrix} + b_{1}\]

      \[ z_{1} = \begin{pmatrix} z_{1}^1 \ z_{1}^2 \ z_{1}^3 \ z_{1}^4 \ \end{pmatrix} = \begin{pmatrix} w_{11}^1 & w_{12}^1 & w_{13}^1 \ w_{21}^1 & w_{22}^1 & w_{23}^1 \ w_{31}^1 & w_{32}^1 & w_{33}^1 \ w_{41}^1 & w_{42}^1 & w_{43}^1 \ \end{pmatrix} \begin{pmatrix} x_1 \ x_2 \ x_3 \ \end{pmatrix} + \begin{pmatrix} b_{1}^1 \ b_{1}^2 \ b_{1}^3 \ b_{1}^4 \ \end{pmatrix}\]

      Nichtlinearer Schritt (Sigmoid-Aktivierungsfunktion):

      \[ a_{1} = \text{sigmoid}(z_{1}) = \begin{pmatrix} a_{1}^1 \ a_{1}^2 \ a_{1}^3 \ a_{1}^4 \ \end{pmatrix} = \begin{pmatrix} \frac{1}{1+e^{-z_1^1}} \ \frac{1}{1+e^{-z_1^2}} \ \frac{1}{1+e^{-z_1^3}} \ \frac{1}{1+e^{-z_1^4}} \ \end{pmatrix}\]

      2. Versteckte Schicht zu Output-Schicht:

      Die Gewichte zwischen der versteckten und der Output-Schicht werden als Matrix \(W_{2}\) und die Biases als Vektor \(b_{2}\) dargestellt. Die Berechnungen der Ausgaben \(a_{2}^1, a_{2}^2\) in der Output-Schicht sind wie folgt:

      Linearer Schritt:

      \[ z_{2} = W_{2} a_{1} + b_{2}\]

      \[ z_{2} = \begin{pmatrix} z_{2}^1 \ z_{2}^2 \ \end{pmatrix} = \begin{pmatrix} w_{11}^2 & w_{12}^2 & w_{13}^2 & w_{14}^2 \ w_{21}^2 & w_{22}^2 & w_{23}^2 & w_{24}^2 \ \end{pmatrix} \begin{pmatrix} a_{1}^1 \ a_{1}^2 \ a_{1}^3 \ a_{1}^4 \ \end{pmatrix} + \begin{pmatrix} b_{2}^1 \ b_{2}^2 \ \end{pmatrix}\]

      Nichtlinearer Schritt (Sigmoid-Aktivierungsfunktion):

      \[ a_{2} = \text{sigmoid}(z_{2}) = \begin{pmatrix} a_{2}^1 \ a_{2}^2 \ \end{pmatrix} = \begin{pmatrix} \frac{1}{1+e^{-z_2^1}} \ \frac{1}{1+e^{-z_2^2}} \ \end{pmatrix}\]

      Die Ausgabe des Netzwerks sind die Aktivierungen \(a_{2}^1\) und \(a_{2}^2\) in der Output-Schicht.

      Sign Up

      Melde dich kostenlos an, um Zugriff auf das vollständige Dokument zu erhalten

      Mit unserer kostenlosen Lernplattform erhältst du Zugang zu Millionen von Dokumenten, Karteikarten und Unterlagen.

      Kostenloses Konto erstellen

      Du hast bereits ein Konto? Anmelden