[PYTHON] Bildausrichtung: von SIFT bis Deep Learning

Überblick

Es gibt nur wenige japanische Artikel zur Bildausrichtung (Stand: 22. Januar 2020), daher fand ich es sehr einfach zu verstehen Bildregistrierung: Von SIFT zu Deep Learning -07-16-Bildregistrierung-Deep-Learning) wurde übersetzt oder zusammengefasst. Einige Teile wurden weggelassen oder hinzugefügt. Wenn Sie also auf den Originaltext verweisen möchten, lesen Sie bitte den Originalartikel.

Quellcode

Was ist Bildregistrierung?

image.png

Bei der Bildausrichtung wird die Fehlausrichtung zweier Bilder korrigiert. Die Bildausrichtung wird verwendet, wenn mehrere Bilder in derselben Szene verglichen werden. Beispielsweise tritt es häufig in den Bereichen Satellitenbildanalyse, optischer Fluss und medizinische Bilder auf. Schauen wir uns ein konkretes Beispiel an. Das Bild oben ist eine Ausrichtung des Bildes des Muscat Bonbon, den ich in Shin-Okubo gegessen habe. Es war sehr lecker, aber ich würde es keinem empfehlen, der kein süßer Zahn ist. In diesem Beispiel können Sie sehen, dass die Position des zweiten Muscat-Bonbons von links mit der Position des Muscat-Bonbons ganz links ausgerichtet ist, während die Helligkeit usw. beibehalten wird. Im Folgenden wird das Bild, auf das ohne Konvertierung verwiesen wird, wie z. B. das linke Ende, als Referenzbild bezeichnet, und das Bild, das konvertiert wird, z. B. das zweite von links, wird als schwebendes Bild bezeichnet. Dieser Artikel beschreibt einige Techniken zum Ausrichten zwischen schwebenden Bildern und Referenzbildern. Beachten Sie, dass die auf Iteration / Signalstärke basierende Methode nicht sehr verbreitet ist und in diesem Artikel nicht erwähnt wird.

Funktionsbasierter Ansatz

Seit den frühen 2000er Jahren werden merkmalsbasierte Ansätze zur Bildausrichtung verwendet. Dieser Ansatz besteht aus drei Schritten: Schlüsselpunkterkennung und Merkmalsbeschreibung, Merkmalsanpassung und Bildtransformation. Einfach ausgedrückt, wählen Sie die interessierenden Punkte in beiden Bildern aus, ordnen Sie jeden interessierenden Punkt im Referenzbild dem entsprechenden Punkt im schwebenden Bild zu und transformieren Sie das schwebende Bild so, dass beide Bilder ausgerichtet sind.

Schlüsselpunkterkennung und Funktionsbeschreibung

Wichtige Punkte definieren wichtige und charakteristische Dinge im Bild (wie Ecken und Kanten). Jeder Schlüsselpunkt wird durch einen Deskriptor dargestellt. Ein Deskriptor ist ein Merkmalsvektor, der die wesentlichen Merkmale eines Schlüsselpunkts enthält. Der Deskriptor muss gegenüber Bildtransformationen (Lokalisierung, Skalierung, Helligkeit usw.) robust sein. Es gibt viele Algorithmen zum Erkennen von Schlüsselpunkten und zum Beschreiben von Merkmalen.

Diese Algorithmen sind mit OpenCV einfach zu verwenden. Im folgenden Beispiel haben wir die OpenCV-Implementierung von AKAZE verwendet. Sie können andere Algorithmen verwenden, indem Sie den Algorithmus einfach umbenennen.

import cv2 as cv

#Importieren Sie Bilder in Graustufen, damit wichtige Punkte besser sichtbar sind
img = cv.imread('img/float.jpg')
gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)

#Schlüsselpunkterkennung und Funktionsbeschreibung
akaze = cv.AKAZE_create()
kp, descriptor = akaze.detectAndCompute(gray, None)

keypoints_img = cv.drawKeypoints(gray, kp, img)
cv.imwrite('keypoints.jpg', keypoints_img)

image.png

Weitere Informationen zur Funktionserkennung und zu Deskriptoren finden Sie im OpenCV-Lernprogramm (https://docs.opencv.org/3.4/d7/d66/tutorial_feature_detection.html).

Feature Matching

Nachdem Sie die Schlüsselpunkte in beiden Bildern gefunden haben, müssen Sie die entsprechenden Schlüsselpunkte zuordnen oder "abgleichen". Eine der Methoden dafür ist "BFMatcher.knnMatch ()". Es misst den Abstand zwischen jedem Paar von Schlüsselpunktdeskriptoren und stimmt mit k Schlüsselpunkten vom nächstgelegenen zu jedem Schlüsselpunkt überein. Wenden Sie dann einen Verhältnisfilter an, um nur die richtigen Übereinstimmungen beizubehalten. Für eine zuverlässige Übereinstimmung müssen die übereinstimmenden Schlüsselpunkte deutlich näher als die nächste falsche Übereinstimmung liegen.

import cv2 as cv

float_img = cv.imread('img/float.jpg', cv.IMREAD_GRAYSCALE)
ref_img = cv.imread('img/ref.jpg', cv.IMREAD_GRAYSCALE)

akaze = cv.AKAZE_create()
float_kp, float_des = akaze.detectAndCompute(float_img, None)
ref_kp, ref_des = akaze.detectAndCompute(ref_img, None)

#Feature Matching
bf = cv.BFMatcher()
matches = bf.knnMatch(float_des, ref_des, k=2)

#Behalten Sie nur die richtige Übereinstimmung bei
good_matches = []
for m, n in matches:
    if m.distance < 0.75 * n.distance:
        good_matches.append([m])

matches_img = cv.drawMatchesKnn(
    float_img,
    float_kp,
    ref_img,
    ref_kp,
    good_matches,
    None,
    flags=cv.DrawMatchesFlags_NOT_DRAW_SINGLE_POINTS)
cv.imwrite('matches.jpg', matches_img)

image.png

Weitere in OpenCV implementierte Feature-Matching-Methoden finden Sie in der Dokumentation (https://docs.opencv.org/trunk/dc/dc3/tutorial_py_matcher.html).

Bildkonvertierung

Konvertieren Sie ein Bild relativ zum anderen, nachdem Sie mindestens 4 Sätze von Schlüsselpunkten abgeglichen haben. Dies wird als [Image Warping] bezeichnet (https://docs.opencv.org/3.0-beta/modules/cudawarping/doc/warping.html). Homografie (https://docs.opencv.org/3.4.1/d9/dab/tutorial_homography.html) verknüpft zwei Bilder auf derselben Ebene im Raum. Homographie ist eine geometrische Transformation, die acht freie Parameter hat und durch eine 3x3-Matrix dargestellt wird. Sie stellen die Verzerrung dar, die auf das gesamte Bild angewendet wird (im Gegensatz zu lokalen Transformationen). Um das transformierte schwebende Bild zu erhalten, berechnen Sie daher die Homografiematrix und wenden Sie sie auf das schwebende Bild an. Um eine optimale Konvertierung sicherzustellen, wird der Algorithmus RANSAC verwendet, um Ausreißer zu erkennen und zu entfernen, um die endgültige Homographie zu bestimmen. Ich werde. Es ist direkt in die OpenCV-Methode findHomography (https://docs.opencv.org/2.4/modules/calib3d/doc/camera_calibration_and_3d_reconstruction.html?highlight=findhomography#findhomography) integriert. Als Alternative zu RANSAC LMEDS: Es gibt auch eine Methode zur robusten Schätzung wie die Minimal-Median-Methode.

import numpy as np
import cv2 as cv

float_img = cv.imread('img/float.jpg', cv.IMREAD_GRAYSCALE)
ref_img = cv.imread('img/ref.jpg', cv.IMREAD_GRAYSCALE)

akaze = cv.AKAZE_create()
float_kp, float_des = akaze.detectAndCompute(float_img, None)
ref_kp, ref_des = akaze.detectAndCompute(ref_img, None)

bf = cv.BFMatcher()
matches = bf.knnMatch(float_des, ref_des, k=2)

good_matches = []
for m, n in matches:
    if m.distance < 0.75 * n.distance:
        good_matches.append([m])

#Wählen Sie den richtigen Schlüsselpunkt
ref_matched_kpts = np.float32(
    [float_kp[m[0].queryIdx].pt for m in good_matches]).reshape(-1, 1, 2)
sensed_matched_kpts = np.float32(
    [ref_kp[m[0].trainIdx].pt for m in good_matches]).reshape(-1, 1, 2)

#Homographie berechnen
H, status = cv.findHomography(
    ref_matched_kpts, sensed_matched_kpts, cv.RANSAC, 5.0)

#Bild konvertieren
warped_image = cv.warpPerspective(
    float_img, H, (float_img.shape[1], float_img.shape[0]))

cv.imwrite('warped.jpg', warped_image)

image.png

Wenn Sie an den Details dieser drei Schritte interessiert sind, hat OpenCV eine Reihe nützlicher Tutorials zusammengestellt (https://docs.opencv.org/3.1.0/db/d27/tutorial_py_table_of_contents_feature2d.html).

Deep-Learning-Ansatz

In den jüngsten Studien zur Bildausrichtung ging es um die Verwendung von Deep Learning. In den letzten Jahren hat Deep Learning eine Spitzenleistung bei Computer-Vision-Aufgaben wie Klassifizierung, Erkennung und Segmentierung ermöglicht. Die Bildausrichtung ist keine Ausnahme.

Merkmalsextraktion

Deep Learning wurde zuerst für die Bildausrichtung zur Merkmalsextraktion verwendet. Eine kontinuierliche Schicht von Faltungs-Neuronalen Netzen (CNNs) erfasst immer komplexere Bildmerkmale und lernt aufgabenspezifische Merkmale. Seit 2014 wenden Forscher diese Netzwerke eher auf Extraktionsschritte als auf SIFT oder ähnliche Algorithmen an.

Homographielernen

Forscher haben versucht, eine Ausrichtung zu erreichen, indem sie geometrische Transformationen mithilfe neuronaler Netze direkt lernen, anstatt die Verwendung von Deep Learning auf die Merkmalsextraktion zu beschränken.

Mit einem Lehrer lernen

Im Jahr 2016 erklärten DeTone et al. Ein Regressionshomografienetz, ein Modell im VGG-Stil, das die Homografie von zwei Bildern lernt Deep Image Homography Estimation. pdf) wurde veröffentlicht. Dieser Algorithmus hat den Vorteil, dass Homographie- und CNN-Modellparameter gleichzeitig durchgehend gelernt werden. Es ist kein Feature-Extraktions- und Matching-Prozess erforderlich.

image.png

Das Netzwerk erzeugt acht reelle Zahlen als Ausgabe. Überwachtes Lernen erfolgt durch den Verlust zwischen der Ausgabe und der Grundwahrheitshomographie.

image.png

Wie andere überwachte Lernansätze erfordert diese Homographieschätzmethode ein Paar überwachter Daten. Es ist jedoch nicht einfach, eine großartige Wahrheitshomographie mit tatsächlichen Daten zu erhalten.

Lernen ohne Lehrer

Nguyen et al. Präsentierten einen unbeaufsichtigten Lernansatz zur Schätzung der Tiefenbildhomographie. Sie verwendeten das gleiche CNN, mussten jedoch eine Verlustfunktion verwenden, die für den unbeaufsichtigten Ansatz geeignet war. Deshalb haben wir uns für den photometrischen Verlust entschieden, für den kein großes Wahrheitsetikett erforderlich ist. Berechnet die Ähnlichkeit zwischen dem Referenzbild und dem konvertierten schwebenden Bild.

\mathbf{L}_{PW} = \frac{1}{|\mathbf{x} _i|} \sum _{\mathbf{x} _i}|I^A(\mathscr{H}(\mathbf{x} _i))-I^B(\mathbf{x} _i)|

Ihr Ansatz führt zwei neue Netzwerkstrukturen ein, die Tensor Direct Linear Transform und die Spatial Transformation Layer.

image.png

Die Autoren argumentieren, dass diese unbeaufsichtigte Methode im Vergleich zu herkömmlichen merkmalsbasierten Methoden eine schnellere Inferenzgeschwindigkeit, eine vergleichbare oder bessere Genauigkeit und Robustheit gegenüber Lichtschwankungen aufweist. Darüber hinaus ist es anpassungsfähiger und leistungsfähiger als die überwachte Methode.

Andere Ansätze

Lernen stärken

Tiefes Lernen zur Verstärkung zieht die Aufmerksamkeit auf sich, um medizinische Anwendungen aufeinander abzustimmen. Im Gegensatz zu den vordefinierten Optimierungsalgorithmen werden bei diesem Ansatz geschulte Agenten verwendet, um die Ausrichtung durchzuführen.

image.png

Komplexe Umwandlung

Aktuelle Forschungen zu einem signifikanten Anteil der Bildausrichtung sind auf dem Gebiet der medizinischen Bildgebung relevant. In vielen Fällen kann die Transformation zwischen zwei medizinischen Bildern aufgrund der lokalen Transformationen des Subjekts (wie Atmung und anatomische Veränderungen) nicht einfach durch eine Homographiematrix beschrieben werden. Wir brauchen komplexere Transformationsmodelle, wie z. B. differentielle In-Phase-Mappings, die durch Verschiebungsvektorfelder dargestellt werden können.

image.png

Forscher haben versucht, diese großen Transformationsmodelle mit vielen Parametern unter Verwendung neuronaler Netze abzuschätzen.

image.png

--Quicksilver Alignment (https://www.researchgate.net/publication/315748621_Quicksilver_Fast_Predictive_Image_Registration_-_a_Deep_Learning_Approach) behebt ein ähnliches Problem. Quicksilver verwendet ein tiefgreifendes Codierungs- / Decodierungsnetzwerk, um Patch-für-Patch-Konvertierungen im Erscheinungsbild von Bildern direkt vorherzusagen.

Zusammenfassung

Ich habe einige Techniken zur Bildausrichtung eingeführt. Es wurde festgestellt, dass sich die Methode zur Verwendung von Merkmalspunkten zur Methode der direkten Konvertierung von Bildern durch tiefes Lernen ändert.

Recommended Posts

Bildausrichtung: von SIFT bis Deep Learning
Verbessertes Lernen, um von null bis tief zu lernen
Deep Learning von Grund auf neu
Deep Learning von Grund auf neu ① Kapitel 6 "Lerntechniken"
Deep Learning Bilderkennung 1 Theorie
Ich habe versucht, die Strichzeichnung mit Deep Learning aus dem Bild zu extrahieren
Einführung in Deep Learning ~ Lernregeln ~
Tiefe Stärkung des Lernens 1 Einführung in die Stärkung des Lernens
Ich habe versucht, Dropout zu erklären
Einführung in Deep Learning ~ Backpropagation ~
[Teil 4] Verwenden Sie Deep Learning, um das Wetter anhand von Wetterbildern vorherzusagen
[Teil 1] Verwenden Sie Deep Learning, um das Wetter anhand von Wetterbildern vorherzusagen
[Teil 3] Verwenden Sie Deep Learning, um das Wetter anhand von Wetterbildern vorherzusagen
[Teil 2] Verwenden Sie Deep Learning, um das Wetter anhand von Wetterbildern vorherzusagen
Ich habe versucht, Perceptron Teil 1 [Deep Learning von Grund auf neu] zu implementieren.
Deep Learning / Deep Learning von Grund auf neu 2 Kapitel 4 Memo
Deep Learning / Deep Learning von Null 2 Kapitel 5 Memo
Einführung in das tiefe Lernen ~ Funktionsnäherung ~
Tiefes Lernen von Grund auf neu (Kostenberechnung)
Tiefes Lernen, um ohne GPU zu beginnen
Einführung in Deep Learning ~ Codierungsvorbereitung ~
Deep Learning / Deep Learning von Null 2 Kapitel 7 Memo
Deep Learning / Deep Learning von Null 2 Kapitel 8 Memo
Deep Learning / Deep Learning von Grund auf neu Kapitel 5 Memo
Deep Learning / Deep Learning von Grund auf neu Kapitel 4 Memo
Deep Learning Bilderkennung 2 Modellimplementierung
Deep Learning / Deep Learning von Grund auf neu 2 Kapitel 3 Memo
Deep Learning Memo von Grund auf neu gemacht
Einführung in Deep Learning ~ Dropout Edition ~
Einführung in Deep Learning ~ Forward Propagation ~
Einführung in Deep Learning ~ CNN Experiment ~
Deep Learning / Deep Learning von Null 2 Kapitel 6 Memo
[AI] Deep Learning für das Entrauschen von Bildern
Deep Learning Tutorial aus dem Umgebungsbau
Tiefes Lernen
Deep Learning 2 durch Implementierung gelernt (Bildklassifizierung)
[Lernnotiz] Deep Learning von Grund auf neu gemacht [Kapitel 7]
Tiefes Lernen / Tiefes Lernen von Grund auf 2-Versuchen Sie, GRU zu bewegen
Bilderkennungsmodell mit Deep Learning im Jahr 2016
[Lernnotiz] Deep Learning von Grund auf neu gemacht [Kapitel 5]
So studieren Sie den Deep Learning G-Test
[Lernnotiz] Deep Learning von Grund auf neu gemacht [Kapitel 6]
"Deep Learning von Grund auf neu" mit Haskell (unvollendet)
Deep Learning / Deep Learning von Grund auf neu Kapitel 7 Memo
Deep Learning Bilderkennung 3 nach der Modellerstellung
[Windows 10] Aufbau einer "Deep Learning from Scratch" -Umgebung
Lernbericht über das Lesen von "Deep Learning von Grund auf neu"
[Deep Learning von Grund auf neu] Über die Optimierung von Hyperparametern
"Deep Learning from Grund" Memo zum Selbststudium (Teil 12) Deep Learning
Deep Learning aus den mathematischen Grundlagen (während der Teilnahme)
[Lernnotiz] Deep Learning von Grund auf neu gemacht [~ Kapitel 4]
[Deep Learning von Grund auf neu] Ich habe versucht, Sigmoid Layer und Relu Layer zu implementieren
[Deep Learning von Grund auf neu] Layer-Implementierung von der Softmax-Funktion zum Überkreuzen von Entropiefehlern
"Deep Learning from Grund" Memo zum Selbststudium (Nr. 9) MultiLayerNet-Klasse
Von nichts unter Ubuntu 18.04 bis zum Einrichten einer Deep Learning-Umgebung auf Tensor
GitHub des guten Buches "Deep Learning von Grund auf neu"
Deep Learning von Grund auf neu Kapitel 2 Perceptron (Memo lesen)
Deep Learning Memorandum
[Lernnotiz] Deep Learning von Grund auf ~ Implementierung von Dropout ~
Starten Sie Deep Learning
Hinweise zum maschinellen Lernen (von Zeit zu Zeit aktualisiert)