Computer vision - Exam
Aufgabe 1)
Rauschunterdrückung und BildglättungRauschunterdrückung: Reduzierung von Bildrauschen. Bildglättung: Verringerung von Unregelmäßigkeiten in Bildern.
- Rauschunterdrückung: Anwendung von Filtertechniken zur Verringerung von zufälligem Bildrauschen
- Gängige Filter: Medianfilter, Gauß-Filter
- Bildglättung: Verwendung von Methoden zur Reduktion von hoher Frequenzkomponenten
- Wichtige Methoden: Low-pass Filter
- Mathematische Grundlagen: Faltungstheorie, Fourier-Transformation
- Gauß-Filter: \(\text{G}(x,y) = \frac{1}{2\text{πσ}^2} e^{-\frac{x^2 + y^2}{2\text{σ}^2}}\)
- Medianfilter: Ersatz eines jeden Pixels durch den Median der Nachbarschaft
a)
a) Gauß-Filter BerechnungImplementiere einen Gauß-Filter in Python für ein beliebiges Bild. Zeige den mathematischen Hintergrund des Filters und erkläre, wie die Faltung im Kontext der Bildverarbeitung funktioniert.
import numpy as npimport cv2def gaussian_filter(img, sigma): kernel_size = int(6*sigma + 1) gaussian_kernel = cv2.getGaussianKernel(kernel_size, sigma) gaussian_kernel = gaussian_kernel * gaussian_kernel.T filtered_image = cv2.filter2D(img, -1, gaussian_kernel) return filtered_imageimage = cv2.imread('input_image.jpg', 0)sigma = 1.0filtered_image = gaussian_filter(image, sigma)cv2.imwrite('output_image.jpg', filtered_image)
Lösung:
Rauschunterdrückung und BildglättungRauschunterdrückung: Reduzierung von Bildrauschen. Bildglättung: Verringerung von Unregelmäßigkeiten in Bildern.
- Rauschunterdrückung: Anwendung von Filtertechniken zur Verringerung von zufälligem Bildrauschen
- Gängige Filter: Medianfilter, Gauß-Filter
- Bildglättung: Verwendung von Methoden zur Reduktion von hoher Frequenzkomponenten
- Wichtige Methoden: Low-pass Filter
- Mathematische Grundlagen: Faltungstheorie, Fourier-Transformation
- Gauß-Filter: \(\text{G}(x,y) = \frac{1}{2\text{\pi\sigma}^2} e^{-\frac{x^2 + y^2}{2\text{\sigma}^2}}\)
- Medianfilter: Ersatz eines jeden Pixels durch den Median der Nachbarschaft
a) Gauß-Filter BerechnungImplementiere einen Gauß-Filter in Python für ein beliebiges Bild. Zeige den mathematischen Hintergrund des Filters und erkläre, wie die Faltung im Kontext der Bildverarbeitung funktioniert.
import numpy as npimport cv2def gaussian_filter(img, sigma): kernel_size = int(6*sigma + 1) gaussian_kernel = cv2.getGaussianKernel(kernel_size, sigma) gaussian_kernel = gaussian_kernel * gaussian_kernel.T filtered_image = cv2.filter2D(img, -1, gaussian_kernel) return filtered_imageimage = cv2.imread('input_image.jpg', 0)sigma = 1.0filtered_image = gaussian_filter(image, sigma)cv2.imwrite('output_image.jpg', filtered_image)
Der Gauß-Filter reduziert das Bildrauschen und glättet das Bild, indem es eine gewichtete Durchschnittsfunktion verwendet, bei der die Gewichte durch die Gaußsche Funktion bestimmt werden. Die mathematische Darstellung des Gauß-Filters ist:\[\text{G}(x,y) = \frac{1}{2\pi\sigma^2} e^{-\frac{x^2 + y^2}{2\sigma^2}}\]Die Faltung in der Bildverarbeitung ist ein mathematischer Prozess, bei dem der Filterkernel über das Bild verschoben wird, wobei für jede Position des Kerns der gewichtete Durchschnitt der darunter liegenden Bildpixel berechnet wird. Dies führt zu einem geglätteten Bild mit reduziertem Rauschen.
b)
b) Medianfilter und seine AnwendungErkläre den Unterschied zwischen einem Gauß-Filter und einem Medianfilter. Implementiere den Medianfilter in Python und vergleiche seine Effektivität zur Rauschunterdrückung im Vergleich zum Gauß-Filter.
import numpy as npimport cv2def median_filter(img, ksize): return cv2.medianBlur(img, ksize)image = cv2.imread('input_image.jpg', 0)ksize = 5median_filtered_image = median_filter(image, ksize)cv2.imwrite('median_filtered_image.jpg', median_filtered_image)
Lösung:
Rauschunterdrückung und BildglättungRauschunterdrückung: Reduzierung von Bildrauschen. Bildglättung: Verringerung von Unregelmäßigkeiten in Bildern.
- Rauschunterdrückung: Anwendung von Filtertechniken zur Verringerung von zufälligem Bildrauschen
- Gängige Filter: Medianfilter, Gauß-Filter
- Bildglättung: Verwendung von Methoden zur Reduktion von hoher Frequenzkomponenten
- Wichtige Methoden: Low-pass Filter
- Mathematische Grundlagen: Faltungstheorie, Fourier-Transformation
- Gauß-Filter: \(\text{G}(x,y) = \frac{1}{2\text{\pi\sigma}^2} e^{-\frac{x^2 + y^2}{2\text{\sigma}^2}}\)
- Medianfilter: Ersatz eines jeden Pixels durch den Median der Nachbarschaft
b) Medianfilter und seine AnwendungDer Unterschied zwischen einem Gauß-Filter und einem Medianfilter liegt in ihrer Funktionsweise und den Situationen, in denen sie am effektivsten sind:
- Der Gauß-Filter verwendet eine gewichtete Durchschnittsfunktion, um das Bild zu glätten. Die Gewichte werden durch die Gaußsche Funktion bestimmt. Dieser Filter eignet sich gut zur Reduzierung von normalverteiltem Rauschen.
- Der Medianfilter ersetzt jeden Pixel im Bild durch den Median der benachbarten Pixelwerte. Dies ist besonders effektiv zur Entfernung von Salz-und-Pfeffer-Rauschen, das aus extremen Helligkeitspunkten im Bild besteht.
import numpy as npimport cv2def median_filter(img, ksize): return cv2.medianBlur(img, ksize)image = cv2.imread('input_image.jpg', 0)ksize = 5median_filtered_image = median_filter(image, ksize)cv2.imwrite('median_filtered_image.jpg', median_filtered_image)
Um die Effektivität der Rauschunterdrückung zu vergleichen, können wir die beiden Filter auf dasselbe Bild anwenden und die Ergebnisse betrachten. Der Gauß-Filter wird das Rauschen homogener verteilen, während der Medianfilter Spitzen und Ausreißer genauer entfernen kann.
c)
c) Theoretische Grundlagen der BildglättungBeschreibe die Rolle der Fourier-Transformation in der Bildglättung. Berechne die Fourier-Transformation eines gegebenen 1D-Signals und erkläre, wie ein Low-pass Filter zur Reduktion der hohen Frequenzkomponenten angewendet wird.Gegebenes Signal:
x = [1, 2, 3, 4, 3, 2, 1]
Berechnung der Fourier-Transformation:import numpy as npimport matplotlib.pyplot as pltx = [1, 2, 3, 4, 3, 2, 1]X = np.fft.fft(x)plt.figure()plt.plot(np.abs(X))plt.title('Magnitude Spectrum')plt.show()
Lösung:
Rauschunterdrückung und BildglättungRauschunterdrückung: Reduzierung von Bildrauschen. Bildglättung: Verringerung von Unregelmäßigkeiten in Bildern.
- Rauschunterdrückung: Anwendung von Filtertechniken zur Verringerung von zufälligem Bildrauschen
- Gängige Filter: Medianfilter, Gauß-Filter
- Bildglättung: Verwendung von Methoden zur Reduktion von hoher Frequenzkomponenten
- Wichtige Methoden: Low-pass Filter
- Mathematische Grundlagen: Faltungstheorie, Fourier-Transformation
- Gauß-Filter: \(\text{G}(x,y) = \frac{1}{2\text{\pi\sigma}^2} e^{-\frac{x^2 + y^2}{2\sigma^2}}\)
- Medianfilter: Ersatz eines jeden Pixels durch den Median der Nachbarschaft
c) Theoretische Grundlagen der BildglättungDie Fourier-Transformation spielt eine zentrale Rolle in der Bildglättung, da sie es ermöglicht, ein Signal oder Bild in seine Frequenzkomponenten zu zerlegen. Durch die Identifizierung und Manipulation dieser Frequenzen können wir gezielt Rauschkomponenten (hohe Frequenzen) entfernen und so eine Glättung des Bildes erreichen.Die Fourier-Transformation eines Signals \( x(t) \) wird durch die Formel\[ X(f) = \int_{-\infty}^{\infty} x(t) e^{-j2\pi ft} dt \]dargestellt, wobei \( X(f) \) die Frequenzdarstellung des Signals ist.Ein Low-pass Filter reduziert gezielt die hohen Frequenzkomponenten eines Signals oder Bildes, indem er Frequenzen oberhalb einer bestimmten Schwelle abschwächt oder entfernt. Dadurch werden schnelle Änderungen und Rauschen im Signal vermindert.
Gegebenes Signal:x = [1, 2, 3, 4, 3, 2, 1]
Berechnung der Fourier-Transformation:import numpy as npimport matplotlib.pyplot as pltx = [1, 2, 3, 4, 3, 2, 1]X = np.fft.fft(x)plt.figure()plt.plot(np.abs(X))plt.title('Magnitude Spectrum')plt.show()
In diesem Beispiel wird das 1D-Signal \( x = [1, 2, 3, 4, 3, 2, 1] \) durch die Fourier-Transformation in sein Frequenzspektrum zerlegt. Das Spektrum gibt Aufschluss über die Amplituden der einzelnen Frequenzkomponenten. Ein Low-pass Filter könnte nun angewandt werden, um die hohen Frequenzen zu reduzieren und das Signal zu glätten.
Aufgabe 2)
In dieser Aufgabe sollst Du die Kantendetektionsmethoden Sobel und Canny in der Bildverarbeitung näher betrachten und anwenden. Dabei werden spezielle Operatoren zur Berechnung der Gradienten in horizontaler und vertikaler Richtung verwendet, und ein mehrstufiger Algorithmus kommt zur Erkennung und Hervorhebung von Kanten zum Einsatz.
b)
Der Canny-Algorithmus besteht aus mehreren Schritten. Beschreibe diese Schritte detailliert und erkläre, warum jeder Schritt wichtig ist, um eine fehlerfreie Kantendetektion zu gewährleisten.
- Schritt 1: Rauschentfernung
- Schritt 2: Gradientenberechnung
- Schritt 3: Non-Maximum-Suppression
- Schritt 4: Doppel-Schwellenwert
Lösung:
Um eine fehlerfreie Kantendetektion mit dem Canny-Algorithmus zu gewährleisten, werden mehrere Schritte durchgeführt. Hier sind die einzelnen Schritte detailliert beschrieben:
- Schritt 1: RauschentfernungIm ersten Schritt wird das Bild gefiltert, um Rauschen zu entfernen. Hierfür wird in der Regel ein Gaussian-Filter verwendet, der das Bild glättet, indem er die Pixelintensitäten im Bild mittelt. Dies ist wichtig, weil Kantendetektionsalgorithmen sehr anfällig für Rauschen sind, das zu falschen Kanten führen kann. Durch die Glättung des Bildes werden kleine, nicht essentielle Details entfernt, was die Genauigkeit der folgenden Schritte erhöht.
- Schritt 2: GradientenberechnungNachdem das Bild geglättet wurde, wird der Gradient des Bildes berechnet, um die Kanten zu erkennen. Dies geschieht durch die Anwendung von Sobel-Operatoren in horizontaler (G_x) und vertikaler (G_y) Richtung. Der Gradient gibt die Richtung und Stärke der stärksten Helligkeitsänderungen im Bild an. Diese Gradienteninformationen werden verwendet, um die Kante und die Richtung der Kante zu bestimmen.
- Schritt 3: Non-Maximum-SuppressionIm dritten Schritt wird die Non-Maximum-Suppression durchgeführt. Dabei werden für jeden Pixel des Bildes der Gradientwinkel verwendet, um zu überprüfen, ob der aktuelle Pixelwert der größte in seiner Umgebung entlang der Gradientenrichtung ist. Wenn dies nicht der Fall ist, wird der Pixelwert auf Null gesetzt. Dieser Schritt ist wichtig, um Kanten zu verfeinern und zu verhindern, dass mehrere Pixel breit als Kante betrachtet werden. Das Ergebnis ist ein dünneres und klareres Kantenbild.
- Schritt 4: Doppel-SchwellenwertDer letzte Schritt im Canny-Algorithmus besteht in der Anwendung eines Doppel-Schwellenwertes. Zuerst werden zwei Schwellenwerte festgelegt: ein hoher und ein niedriger Schwellenwert. Kanten, deren Gradientstärke über dem hohen Schwellenwert liegt, werden als starke Kanten betrachtet und als definitiv Teil der Kante markiert. Kanten, deren Gradientstärke zwischen dem niedrigen und dem hohen Schwellenwert liegt, werden als schwache Kanten betrachtet und nur dann als Teil der Kante markiert, wenn sie in Verbindung mit starken Kanten stehen. Kanten, deren Gradientstärke unter dem niedrigen Schwellenwert liegt, werden verworfen. Dieser Schritt hilft dabei, echte Kanten korrekt zu verbinden und falsche Kanten effektiv zu eliminieren.
Durch die Kombination all dieser Schritte wird sichergestellt, dass der Canny-Algorithmus robuste und fehlerfreie Kantendetektionsergebnisse liefert.
c)
Implementiere mit Hilfe einer Programmiersprache deiner Wahl (z.B. Python) den Canny-Algorithmus für ein gegebenes Bild. Überlege und diskutiere, welche Parameter (wie z.B. die Schwellenwerte) im Algorithmus besonders wichtig sind und wie sie angepasst werden können, um die Kantendetektion zu verbessern.
Du kannst folgende Bibliothek verwenden:
import cv2import numpy as np
- Gib den Code an, und beschreibe die Funktionsweise deines Programms.
- Erläutere, wie der Gaussian-Filter zur Rauschentfernung im Canny-Algorithmus verwendet wird.
- Wie beeinflusst die Wahl der Schwellenwerte das Endergebnis?
Lösung:
Um den Canny-Algorithmus in Python zu implementieren, können wir die OpenCV-Bibliothek verwenden. Hier ist der Schritt-für-Schritt-Code und die Beschreibung der jeweiligen Schritte:
Code:
import cv2import numpy as np# Funktion zur Anzeige von Bilderndef display_image(image, title='Image'): cv2.imshow(title, image) cv2.waitKey(0) cv2.destroyAllWindows()# Bild einlesenimage = cv2.imread('path_to_image.jpg', cv2.IMREAD_GRAYSCALE)# Rauschentfernung mit Gaussian-Filterblurred_image = cv2.GaussianBlur(image, (5, 5), 1.4)# Canny-Algorithmus anwendenlow_threshold = 50high_threshold = 150edges = cv2.Canny(blurred_image, low_threshold, high_threshold)# Ergebnisse anzeigendisplay_image(image, 'Original Image')display_image(blurred_image, 'Blurred Image')display_image(edges, 'Edges')
Funktionsweise des Programms:
- Wir lesen das Bild in Graustufen ein, da der Canny-Algorithmus auf Graustufenbilder angewendet wird.
- Der Gaussian-Filter wird verwendet, um das Bild zu glätten und Rauschen zu entfernen. Das ist ein wichtiger Schritt, da Rauschen im Bild zu falschen Kanten führen kann.
- Wir wenden den Canny-Algorithmus auf das geglättete Bild an. Dafür müssen wir niedrige und hohe Schwellenwerte festlegen. Der Parameter "low_threshold" gibt den niedrigeren Schwellenwert an, unter dem Kanten ignoriert werden, und "high_threshold" gibt den höheren Schwellenwert an, über dem Pixel als starke Kantenpixel betrachtet werden.
- Zum Schluss zeigen wir das Originalbild, das geglättete Bild und das resultierende Kantenbild an.
Rolle des Gaussian-Filters zur Rauschentfernung im Canny-Algorithmus:
Der Gaussian-Filter wird eingesetzt, um das Bild zu glätten, bevor der eigentliche Canny-Algorithmus angewendet wird. Das Ziel ist es, kleines Rauschen und feine Details zu entfernen, da diese zu falschen Kanten führen könnten. Der Filter arbeitet, indem er die Pixelintensitäten im Bild mittelt, was zu einem "weicheren" Bild führt.
Einfluss der Schwellenwerte auf das Endergebnis:
- Die Wahl der Schwellenwerte ist entscheidend für die Qualität der Kantendetektion.
- Ein zu niedriger Schwellenwert führt zu vielen falschen Kanten (Rauschen wird als Kante erkannt), während ein zu hoher Schwellenwert möglicherweise echte Kanten übersieht.
- Der niedrige und der hohe Schwellenwert sollten gut aufeinander abgestimmt sein. Typischerweise wird der höhere Schwellenwert etwa 2-3 Mal höher als der niedrigere Schwellenwert gewählt.
- Es kann sinnvoll sein, die Schwellenwerte für jedes Bild individuell anzupassen, abhängig von den Bildinhalten und dem gewünschten Ergebnis.
Mit diesen Anpassungen können wir eine zuverlässige und genaue Kantendetektion erreichen.
Aufgabe 3)
SIFT und SURF Merkmale für MerkmalsextraktionSIFT und SURF sind Algorithmen zur Merkmalsextraktion in der Bildverarbeitung.
- SIFT: Skaleninvariante Merkmals-Transformation
- Detektion von Schlüsselpunkten (keypoints)
- Berechnung von Deskriptoren: Histograms of Gradient Orientations
- Invariant gegen Skalierung und Rotation
- SURF: Speeded-Up Robust Features
- Schneller als SIFT
- Verwendet Hessian-Matrix zur Schlüsselpunktdetektion
- Berechnung des Deskriptors mittels Haar-Wavelets
- Invarianz gegen Skalierung und Rotation
a)
Erkläre den Unterschied in der Schlüsselpunktdetektion zwischen SIFT und SURF. Gehe dabei auf die verwendeten mathematischen Methoden ein und beschreibe, wie diese Methoden zur Invarianz gegen Skalierung und Rotation beitragen.
Lösung:
Unterschied in der Schlüsselpunktdetektion zwischen SIFT und SURFSowohl SIFT (Scale-Invariant Feature Transform) als auch SURF (Speeded-Up Robust Features) sind Algorithmen zur Merkmalsextraktion in der Bildverarbeitung, mit bestimmten Unterschieden in ihrer Methode zur Schlüsselpunktdetektion. Im Folgenden wird dies detaillierter erläutert:
- SIFT (Scale-Invariant Feature Transform)
- Mathematische Methode: SIFT verwendet die Differenz von Gauß-Filtern (Difference of Gaussians, DoG), um Schlüsselpunkte zu detektieren. Ein Bild wird über eine Reihe von Skalenräumen skaliert und geglättet, wobei die Differenzbilder berechnet werden. Die lokalen Extrema (Maxima und Minima) in diesen Differenzbildern identifizieren die Schlüsselpunkte.
- Invarianz gegen Skalierung: Die Verwendung von Skalenräumen ermöglicht es SIFT, Schlüsselpunkte zu finden, die unabhängig von der Bildskalierung sind. Die Schlüsselpunkte werden in mehreren Skalen detektiert, was die Skalierungsinvarianz sicherstellt.
- Invarianz gegen Rotation: Um die Invarianz gegen Rotation zu erreichen, berechnet SIFT für jeden Schlüsselpunkt eine Orientierung (Hauptachse) basierend auf den lokalen Gradientenrichtungen. Diese Orientierung wird dann verwendet, um den Deskriptor zu berechnen, der ebenfalls rotationsinvariant ist.
- SURF (Speeded-Up Robust Features)
- Mathematische Methode: SURF verwendet die Hessian-Matrix, um Schlüsselpunkte zu detektieren. Die Hessian-Matrix basiert auf zweiten Ableitungen des Bildes und hilft bei der Erkennung von Punkten mit hoher Variabilität, was auf Schlüsselpunkte hinweist. Anstatt konventioneller Filter verwendet SURF integrierte Bilder und approximierende Filter, die die Berechnungen erheblich beschleunigen.
- Invarianz gegen Skalierung: Die Detektion der Schlüsselpunkte erfolgt über mehrere Skalen, ähnlich wie bei SIFT, jedoch mit der Hessian-Matrix, um Skalierungsinvarianz sicherzustellen. Durch die Nutzung der Hessian-Matrix in verschiedenen Skalen kann SURF Schlüsselpunkte unabhängig von der Skalierung des Bildes finden.
- Invarianz gegen Rotation: SURF setzt ebenfalls auf lokale Gradienteninformationen. Der Deskriptor wird basierend auf Haar-Wavelet-Transformationen berechnet, was eine schnelle Berechnung der lokalen Orientierung ermöglicht. Diese lokale Orientierung wird verwendet, um den Deskriptor zu erstellen, wodurch die Rotationsinvarianz gewährleistet wird.
Zusammenfassung der Differenzen:- SIFT verwendet die Differenz von Gauß-Filtern zur Schlüsselpunktdetektion, während SURF auf der Hessian-Matrix basiert.
- SURF ist in der Regel schneller als SIFT, weil es approximierende Filter und integrierte Bilder verwendet.
- Beide Methoden erzielen Invarianz gegen Skalierung und Rotation, jedoch auf unterschiedliche Weise durch ihre mathematischen Ansätze und die spezifische Berechnung der Deskriptoren.
b)
Implementiere den folgenden Codeausschnitt in Python, der die Schlüsselpunktdetektion und -beschreibung mithilfe der SIFT Methode durchführt. Kommentiere den Code ausführlich:
import cv2image = cv2.imread('input.jpg', cv2.IMREAD_GRAYSCALE)sift = cv2.SIFT_create()keypoints, descriptors = sift.detectAndCompute(image, None)
Lösung:
Implementierung der Schlüsselpunktdetektion und -beschreibung mit SIFT in PythonDer folgende Python-Code verwendet OpenCV, um die SIFT-Methode für die Detektion und Beschreibung von Schlüsselpunkten in einem Bild anzuwenden. Alle Schritte sind ausführlich kommentiert, um die Funktionsweise des Codes zu erklären.
import cv2 # Importiere die OpenCV Bibliothek# Laden des Bildes im Graustufenmodus# 'input.jpg' ist der Pfad zum Eingabebild# cv2.IMREAD_GRAYSCALE sorgt dafür, dass das Bild als Graustufenbild geladen wirdimage = cv2.imread('input.jpg', cv2.IMREAD_GRAYSCALE)# Erzeuge ein SIFT-Objekt# cv2.SIFT_create() initialisiert den SIFT-Algorithmussift = cv2.SIFT_create()# Detektion von Schlüsselpunkten und Berechnung der Deskriptoren# detectAndCompute nimmt das Eingabebild und eine optionale Maske (hier None) als Parameter# Es gibt zwei Ergebnisse zurück: keypoints und descriptors# 'keypoints' enthält die Liste der detektierten Schlüsselpunktobjekte# 'descriptors' enthält die berechneten Deskriptormatrizen für diese Schlüsselpunktekeypoints, descriptors = sift.detectAndCompute(image, None)# Optionale Visualisierung der Schlüsselpunkte# cv2.drawKeypoints zeichnet die detektierten Schlüsselpunkte auf das Bild# flags=cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS sorgt für eine ausführliche Darstellung der Schlüsselpunktinformationenoutput_image = cv2.drawKeypoints(image, keypoints, None, flags=cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)# Speichern des Ausgabe-Bildes mit den gezeichneten Schlüsselpunktencv2.imwrite('output.jpg', output_image)
Erklärung der Hauptschritte:- Importieren der Bibliothek: Die OpenCV-Bibliothek wird importiert, die für die Bildverarbeitung und die Anwendung des SIFT-Algorithmus erforderlich ist.
- Bild laden: Mit cv2.imread wird das Eingabebild 'input.jpg' im Graustufenmodus geladen.
- SIFT-Objekt erstellen: cv2.SIFT_create() initialisiert ein SIFT-Objekt, das für die Detektion und Beschreibung von Schlüsselpunkten verwendet wird.
- Detektion und Beschreibung der Schlüsselpunkte: Die Methode sift.detectAndCompute() erkennt Schlüsselpunkte im Bild und berechnet deren Deskriptoren. Die Ergebnisse werden in den Variablen 'keypoints' und 'descriptors' gespeichert.
- Visualisierung der Schlüsselpunkte (optional): Die Schlüsselpunkte werden auf das Bild gezeichnet, und das Ergebnis wird in der Datei 'output.jpg' gespeichert.
Aufgabe 4)
Convolutional Neural Networks (CNNs) zur ObjekterkennungConvolutional Neural Networks (CNNs) sind eine spezielle Klasse von künstlichen neuronalen Netzen, die besonders gut für die Verarbeitung von Bilddaten geeignet sind. Sie werden häufig zur Objekterkennung verwendet.
- Kernkomponenten: Faltungs- und Pooling-Schichten
- Faltungsschicht (Conv Layer): Anwenden von Filtern/Kernels, um Merkmale zu extrahieren
- Pooling-Schicht (meist Max-Pooling): Reduzierung der dimensionalen Daten, Erhöhung der Rechenleistungseffizienz
- Aktivierungsfunktion: ReLU (Rectified Linear Unit), um Nicht-Linearitäten einzuführen
- Architektur: Typische Architekturen wie LeNet, AlexNet, VGG, ResNet
- Backpropagation: Gewichtsaktualisierung durch Fehlerausbreitung
- Verlustfunktion: Meist Cross-Entropy-Loss bei Klassifizierungsproblemen
- Mathematische Notationen: \textit{Faltung} als diskrete Kreuzkorrelation: \[(I*K)(x, y) = \sum_{u} \sum_{v} I(u, v) K(x-u, y-v)\] \textit{Pooling-Funktion}: \[P_{max}(i, j) = \max_{m, n \in R(i, j)} I(m, n)\]
a)
a) Erläutere die Funktionsweise der Faltungsschicht (Conv Layer) in CNNs. Wie trägt sie zur Merkmalsextraktion bei? Berechne das Ergebnis der Faltung eines 3x3-Bildausschnitts \[I = \begin{bmatrix} 1 & 2 & 0 \ 0 & 1 & 3 \ 2 & 1 & 1 \end{bmatrix} \] mit einem 2x2-Filter \[K = \begin{bmatrix} 1 & 0 \ -1 & 1 \end{bmatrix} \]. Nutze dazu die Formel der diskreten Kreuzkorrelation.
Lösung:
a) Funktionsweise der Faltungsschicht (Conv Layer) in CNNs:Die Faltungsschicht (Conv Layer) ist ein Kernbestandteil von Convolutional Neural Networks (CNNs). Sie funktioniert wie folgt:
- Ein kleiner Filter oder Kernel wird über das Eingabebild geschoben.
- Für jede Position des Filters wird eine gewichtete Summierung der überlappenden Bildausschnitte mit dem Filter vorgenommen.
- Das Ergebnis dieser Berechnungen wird in einer neuen Ausgabe, der sogenannten Feature-Map, gespeichert.
- Verschiedene Filter erkennen verschiedene Merkmale (z. B. Kanten, Ecken) im Bild, was zur Merkmalsextraktion beiträgt.
Berechnung der Faltung eines 3x3-Bildausschnitts mit einem 2x2-Filter:Die diskrete Kreuzkorrelation ist mathematisch definiert als:\[ (I * K)(x, y) = \sum_{u} \sum_{v} I(u, v) K(x - u, y - v) \]Lass uns den 3x3-Bildausschnitt \[I = \begin{bmatrix} 1 & 2 & 0 \ 0 & 1 & 3 \ 2 & 1 & 1 \end{bmatrix} \]mit einem 2x2-Filter \[K = \begin{bmatrix} 1 & 0 \ -1 & 1 \end{bmatrix} \] falten.Wir wollen die Ergebnisse an allen möglichen Positionen berechnen. Da der Filter 2x2 ist, können wir ihn 4-mal innerhalb des 3x3-Bildausschnitts anlegen.
- Position (0,0):\[(I * K)(0, 0) = (1 * 1) + (2 * 0) + (0 * -1) + (1 * 1) = 1 + 0 + 0 + 1 = 2 \]
- Position (0,1):\[(I * K)(0, 1) = (2 * 1) + (0 * 0) + (1 * -1) + (3 * 1) = 2 + 0 - 1 + 3 = 4 \]
- Position (1,0):\[(I * K)(1, 0) = (0 * 1) + (1 * 0) + (2 * -1) + (1 * 1) = 0 + 0 - 2 + 1 = -1 \]
- Position (1,1):\[(I * K)(1, 1) = (1 * 1) + (3 * 0) + (1 * -1) + (1 * 1) = 1 + 0 - 1 + 1 = 1 \]
Daraus ergibt sich die gefaltete Matrix:\[\begin{bmatrix} 2 & 4 \-1 & 1 \end{bmatrix} \]
b)
b) Was ist die Rolle der Pooling-Schicht, insbesondere des Max-Poolings, in einem CNN? Berechne das Ergebnis des Max-Poolings für eine 2x2-Region innerhalb der folgenden Matrix: \[\begin{bmatrix} 1 & 3 & 2 & 4 \ 5 & 6 & 1 & 2 \ 9 & 8 & 4 & 6 \ 0 & 7 & 3 & 1 \end{bmatrix}\].
Lösung:
b) Rolle der Pooling-Schicht, insbesondere des Max-Poolings, in einem CNN:Die Pooling-Schicht in einem CNN dient hauptsächlich der Diminution der dimensionalen Daten und der Erhöhung der Rechenleistungseffizienz. Insbesondere hilft Max-Pooling bei:
- Reduzierung der Dimension: Durch das Zusammenfassen von Informationen über eine Region wird die Anzahl der Parameter und somit die Komplexität des Modells reduziert.
- Vermeidung von Overfitting: Durch die Reduktion der Dimensionen und Parameter des Modells wird das Risiko des Overfittings verringert.
- Extraktion dominanter Merkmale: Max-Pooling wählt das größte Element aus jeder relevanten Region aus, wodurch starke Aktivierungen in den Feature-Maps beibehalten werden.
Berechnung des Max-Poolings für eine 2x2-Region innerhalb der folgenden Matrix:Gegeben sei die Matrix:\[ \begin{bmatrix} 1 & 3 & 2 & 4 \ 5 & 6 & 1 & 2 \ 9 & 8 & 4 & 6 \ 0 & 7 & 3 & 1 \end{bmatrix} \]Wir wenden das Max-Pooling mit einer 2x2-Region auf diese Matrix an. Wir betrachten also jede 2x2-Region und wählen das maximale Element dieser Region aus.
Ergebnisse der Max-Pooling-Berechnungen:Regionen werden nacheinander betrachtet:
- Region (0,0) bis (1,1): \[ \begin{bmatrix} 1 & 3 \ 5 & 6 \end{bmatrix} \] -> Max-Wert = 6
- Region (0,2) bis (1,3): \[ \begin{bmatrix} 2 & 4 \ 1 & 2 \end{bmatrix} \] -> Max-Wert = 4
- Region (2,0) bis (3,1): \[ \begin{bmatrix} 9 & 8 \ 0 & 7 \end{bmatrix} \] -> Max-Wert = 9
- Region (2,2) bis (3,3): \[ \begin{bmatrix} 4 & 6 \ 3 & 1 \end{bmatrix} \] -> Max-Wert = 6
Das Ergebnis des Max-Poolings auf die gegebene Matrix ist daher:\[\begin{bmatrix} 6 & 4 \ 9 & 6 \end{bmatrix} \]
c)
c) Beschreibe den Backpropagation-Algorithmus in einem CNN und erläutere, wie die Gewichte in einer Faltungsschicht aktualisiert werden. Nutze die Cross-Entropy-Loss Funktion und erkläre den Zusammenhang zu den Gradienten.
Lösung:
c) Beschreibung des Backpropagation-Algorithmus in einem CNN und Gewichtsaktualisierung in einer Faltungsschicht:Der Backpropagation-Algorithmus ist ein Verfahren zur Anpassung der Gewichte in einem neuronalen Netzwerk durch Rückführung des Fehlers vom Ausgabeknoten zu den Eingangsknoten. In einem CNN läuft der Prozess wie folgt ab:
- Vorwärtspropagation: Die Eingabedaten (z. B. ein Bild) werden durch die Schichten des Netzwerks geleitet, und die Ausgabe (Vorhersagen) wird berechnet.
- Berechnung der Verlustfunktion: Der Fehler bzw. Verlust wird mit einer Verlustfunktion berechnet. Bei Klassifikationsproblemen wird häufig die Cross-Entropy-Loss verwendet. Die Cross-Entropy-Loss-Funktion ist definiert als:\[ L(y, \hat{y}) = - \sum_{i} y_i \log(\hat{y}_i) \]Hierbei ist \(y\) das wahre Label und \(\hat{y}\) die vorhergesagte Wahrscheinlichkeit.
- Rückwärtspropagation (Backpropagation): Der berechnete Fehler wird rückwärts durch das Netzwerk propagiert, um die Gradienten der Verlustfunktion bezüglich der Gewichte zu berechnen. Dies wird durch Anwendung der Kettenregel der Differentiation erreicht. Die allgemeine Formel für die Ableitung ist:\[ \frac{\partial L}{\partial w} = \frac{\partial L}{\partial a} \cdot \frac{\partial a}{\partial z} \cdot \frac{\partial z}{\partial w} \]Hierbei ist \(L\) der Verlust, \(a\) die Aktivierung, \(z\) der gewichtete Eingabewert und \(w\) das Gewicht.
- Gewichtsaktualisierung: Nachdem die Gradienten berechnet wurden, werden die Gewichte des Netzwerks aktualisiert. Dies erfolgt nach dem Gradientenabstiegsverfahren:\[ w = w - \eta \frac{\partial L}{\partial w} \]Hierbei ist \(\eta\) die Lernrate und \(\frac{\partial L}{\partial w}\) der Gradient der Verlustfunktion bezüglich des Gewichts \(w\).
- Gewichtsaktualisierung in der Faltungsschicht: In einer Faltungsschicht erfolgt die Aktualisierung der Filtergewichte durch:
- Berechnung des Fehlers an der Ausgangsfeature-Map.
- Rückführung des Fehlers durch die Aktivierungsfunktion (z. B. ReLU, welche Nicht-Linearitäten einführt).
- Berechnung der Gradienten der Verlustfunktion bezüglich der Filtergewichte. Dies erfolgt durch Nutzung der diskreten Kreuzkorrelation:
\[ \frac{\partial L}{\partial K}(x, y) = \sum_{u} \sum_{v} I(u, v) \frac{\partial L}{\partial (I * K)(x - u, y - v)} \]- Aktualisierung der Filtergewichte mit dem Gradientenabstieg:
\[ K' = K - \eta \frac{\partial L}{\partial K} \]Hierbei repräsentiert \(K'\) die aktualisierten Filtergewichte.
Zusammengefasst ermöglicht der Backpropagation-Algorithmus das Lernen der Gewichte in einem CNN, indem die Fehlerinformationen von der Ausgabeschicht bis zur Eingabeschicht rückgeführt werden, was die Anpassung und Verbesserung der Modellvorhersage führt.