[PYTHON] Alignement d'image: du SIFT au deep learning

Aperçu

Puisqu'il y a peu d'articles japonais sur l'alignement des images (au 22 janvier 2020), j'ai pensé que c'était très facile à comprendre Enregistrement d'image: du SIFT au Deep Learning -07-16-image-registration-deep-learning) a été traduit ou résumé. Certaines parties ont été omises ou ajoutées, donc si vous souhaitez vous référer au texte original, veuillez lire l'article original.

Code source

Qu'est-ce que l'enregistrement d'image?

image.png

L'alignement de l'image est le processus de correction du désalignement de deux images. L'alignement d'image est utilisé lors de la comparaison de plusieurs images dans la même scène. Par exemple, il apparaît souvent dans les domaines de l'analyse d'images satellitaires, du flux optique et des images médicales. Regardons un exemple concret. L'image ci-dessus est un alignement de l'image du bonbon de Muscat que j'ai mangé à Shin-Okubo. C'était très délicieux, mais je ne le recommanderais à personne qui n'aime pas les sucreries. Dans cet exemple, vous pouvez voir que la position du deuxième bonbon Muscat à partir de la gauche est alignée avec la position du bonbon Muscat le plus à gauche tout en conservant la luminosité, etc. Dans ce qui suit, l'image référencée sans conversion, telle que l'extrémité gauche, est appelée image de référence et l'image qui est convertie, telle que la seconde à partir de la gauche, est appelée image flottante. Cet article décrit certaines techniques d'alignement entre les images flottantes et de référence. Notez que la méthode basée sur l'itération / la force du signal n'est pas très courante et ne sera pas mentionnée dans cet article.

Approche basée sur les fonctionnalités

Depuis le début des années 2000, des approches basées sur les caractéristiques sont utilisées pour l'alignement des images. Cette approche comprend trois étapes: la détection des points clés et la description des fonctionnalités, la correspondance des fonctionnalités et la transformation d'image. En termes simples, sélectionnez les points d'intérêt dans les deux images, associez chaque point d'intérêt de l'image de référence au point correspondant dans l'image flottante et transformez l'image flottante pour que les deux images soient alignées.

Détection des points clés et description des fonctionnalités

Les points clés définissent les éléments importants et caractéristiques de l'image (tels que les coins et les bords). Chaque point clé est représenté par un descripteur. Un descripteur est un vecteur de caractéristiques qui contient les caractéristiques essentielles d'un point clé. Le descripteur doit être robuste aux transformations d'image (localisation, échelle, luminosité, etc.). Il existe de nombreux algorithmes pour détecter les points clés et décrire les fonctionnalités.

Ces algorithmes sont faciles à utiliser avec OpenCV. Dans l'exemple ci-dessous, nous avons utilisé l'implémentation OpenCV d'AKAZE. Vous pouvez utiliser d'autres algorithmes simplement en renommant l'algorithme.

import cv2 as cv

#Importez des images en niveaux de gris pour rendre les points clés plus faciles à voir
img = cv.imread('img/float.jpg')
gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)

#Détection des points clés et description des fonctionnalités
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

Pour plus d'informations sur la détection et les descripteurs de fonctionnalités, consultez le didacticiel OpenCV (https://docs.opencv.org/3.4/d7/d66/tutorial_feature_detection.html).

Correspondance des fonctionnalités

Après avoir trouvé les points clés dans les deux images, les points clés correspondants doivent être associés ou «mis en correspondance». Une des méthodes pour cela est BFMatcher.knnMatch (). Il mesure la distance entre chaque paire de descripteurs de point-clé et fait correspondre k points-clés du plus proche de chaque point-clé. Ensuite, appliquez un filtre de ratio pour ne conserver que les correspondances correctes. Pour une correspondance fiable, les points clés correspondants doivent être significativement plus proches que la fausse correspondance la plus proche.

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)

#Correspondance des fonctionnalités
bf = cv.BFMatcher()
matches = bf.knnMatch(float_des, ref_des, k=2)

#Ne garder que la correspondance correcte
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

Consultez la documentation (https://docs.opencv.org/trunk/dc/dc3/tutorial_py_matcher.html) pour d'autres méthodes de correspondance de fonctionnalités implémentées dans OpenCV.

Conversion d'image

Après avoir mis en correspondance au moins 4 ensembles de points clés, convertissez une image par rapport à l'autre. Cela s'appelle déformation d'image. Deux images sur le même plan dans l'espace sont associées par Homographie (https://docs.opencv.org/3.4.1/d9/dab/tutorial_homography.html). L'homographie est une transformation géométrique qui a huit paramètres libres et est représentée par une matrice 3x3. Ils représentent la distorsion appliquée à l'image entière (par opposition aux transformations locales). Par conséquent, pour obtenir l'image flottante transformée, calculez la matrice d'homographie et appliquez-la à l'image flottante. Pour assurer une conversion optimale, l'algorithme RANSAC est utilisé pour détecter les valeurs aberrantes et les supprimer afin de déterminer l'homographie finale. Je vais. Il est directement intégré à la méthode OpenCV findHomography (https://docs.opencv.org/2.4/modules/calib3d/doc/camera_calibration_and_3d_reconstruction.html?highlight=findhomography#findhomography). Comme alternative à RANSAC LMEDS: Il existe également une méthode d'estimation robuste telle que la méthode de la médiane minimale.

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])

#Choisissez le bon point clé
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)

#Calculer l'homographie
H, status = cv.findHomography(
    ref_matched_kpts, sensed_matched_kpts, cv.RANSAC, 5.0)

#Convertir l'image
warped_image = cv.warpPerspective(
    float_img, H, (float_img.shape[1], float_img.shape[0]))

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

image.png

Si vous êtes intéressé par les détails de ces trois étapes, OpenCV a rassemblé une série de tutoriels utiles (https://docs.opencv.org/3.1.0/db/d27/tutorial_py_table_of_contents_feature2d.html).

Approche d'apprentissage en profondeur

Les études d'alignement d'images les plus récentes ont porté sur l'utilisation de l'apprentissage en profondeur. Au cours des dernières années, l'apprentissage en profondeur a permis des performances de pointe dans les tâches de vision par ordinateur telles que la classification, la détection et la segmentation. L'alignement des images ne fait pas exception.

Extraction de caractéristiques

L'apprentissage en profondeur a d'abord été utilisé pour l'alignement d'images pour l'extraction de caractéristiques. Une couche continue de réseaux de neurones convolutifs (CNN) capture des fonctionnalités d'image de plus en plus complexes et apprend des fonctionnalités spécifiques aux tâches. Depuis 2014, les chercheurs ont appliqué ces réseaux à des étapes d'extraction de caractéristiques plutôt qu'à des algorithmes SIFT ou similaires.

--En 2014, Dosovitskiy et al.ont proposé de former CNN en utilisant uniquement des données non supervisées. La polyvalence de ces fonctionnalités les rend robustes aux conversions. Ces caractéristiques ou descripteurs étaient supérieurs aux descripteurs SIFT. --En 2018, Yang et al. Ont développé une méthode d'alignement non rigide basée sur la même idée. Ils ont utilisé une couche de réseaux VGG pré-entraînés pour générer des descripteurs de caractéristiques qui contiennent à la fois des informations de convolution et des caractéristiques de localisation. Ces descripteurs semblent être supérieurs aux détecteurs comme SIFT, surtout si SIFT contient de nombreuses valeurs aberrantes ou ne peut pas correspondre à un nombre suffisant de points caractéristiques. Le code de ce dernier article peut être trouvé ici. Vous pouvez essayer cette méthode d'alignement sur votre image dans les 15 minutes, mais elle est environ 70 fois plus lente que la méthode de type SIFT implémentée dans la première moitié.

Apprentissage de l'homographie

Les chercheurs ont cherché à atteindre l'alignement en apprenant directement les transformations géométriques à l'aide de réseaux de neurones, plutôt que de limiter l'utilisation de l'apprentissage en profondeur à l'extraction de caractéristiques.

Apprendre avec un enseignant

En 2016, DeTone et al. Ont expliqué un réseau d'homographie de régression, un modèle de style VGG qui apprend l'homographie associée à deux images [Deep Image Homography Estimate](https://arxiv.org/pdf/1606.03798. pdf) a été publié. Cet algorithme a l'avantage d'apprendre l'homographie et les paramètres du modèle CNN de bout en bout en même temps. Aucun processus d'extraction de caractéristiques et de correspondance n'est requis.

image.png

Le réseau produit huit nombres réels en sortie. L'apprentissage supervisé se fait par la perte entre la sortie et l'homographie de la vérité terrain.

image.png

Comme les autres approches d'apprentissage supervisé, cette méthode d'estimation par homographie nécessite une paire de données supervisées. Cependant, il n'est pas facile d'obtenir une grande homographie de vérité avec des données réelles.

Apprendre sans professeur

Nguyen et al.ont présenté une approche d'apprentissage non supervisé pour l'estimation de l'homographie d'image profonde. Ils ont utilisé le même CNN, mais ont dû utiliser une fonction de perte adaptée à l'approche non supervisée. Nous avons donc choisi la perte photométrique, qui ne nécessite pas une grande étiquette de vérité. Calcule la similitude entre l'image de référence et l'image flottante convertie.

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

Leur approche introduit deux nouvelles structures de réseau, la transformation linéaire directe de Tensor et la couche de transformation spatiale.

image.png

Les auteurs soutiennent que cette méthode non supervisée a des vitesses d'inférence plus rapides, une précision comparable ou meilleure et une robustesse aux fluctuations d'éclairage par rapport aux méthodes traditionnelles basées sur les caractéristiques. De plus, elle est plus adaptable et performante que la méthode supervisée.

Autres approches

Renforcer l'apprentissage

L'apprentissage par renforcement profond attire l'attention en tant que méthode d'alignement des applications médicales. Contrairement aux algorithmes d'optimisation prédéfinis, cette approche utilise des agents formés pour effectuer l'alignement.

image.png

Conversion complexe

La recherche actuelle dans une proportion significative d'alignement d'image est pertinente dans le domaine de l'imagerie médicale. Dans de nombreux cas, la transformation entre deux images médicales ne peut être simplement décrite par une matrice d'homographie en raison des transformations locales du sujet (comme la respiration et les changements anatomiques). Nous avons besoin de modèles de transformation plus complexes, tels que des mappages différentiels en phase qui peuvent être représentés par des champs de vecteurs de déplacement.

image.png

Les chercheurs ont tenté d'estimer ces grands modèles de transformation avec de nombreux paramètres à l'aide de réseaux de neurones.

image.png

--Quicksilver Alignment (https://www.researchgate.net/publication/315748621_Quicksilver_Fast_Predictive_Image_Registration_-_a_Deep_Learning_Approach) résout un problème similaire. Quicksilver utilise un réseau de codage / décodage approfondi pour prédire directement les conversions patch par patch dans l'apparence des images.

Résumé

J'ai introduit quelques techniques d'alignement d'image. Il a été constaté que la méthode utilisant les points caractéristiques évolue vers la méthode de conversion directe des images par apprentissage en profondeur.

Recommended Posts

Alignement d'image: du SIFT au deep learning
Apprentissage amélioré pour apprendre de zéro à profond
Apprentissage profond à partir de zéro
Deep Learning from scratch ① Chapitre 6 "Techniques liées à l'apprentissage"
Reconnaissance d'image par apprentissage profond 1 théorie
J'ai essayé d'extraire le dessin au trait de l'image avec Deep Learning
Introduction au Deep Learning ~ Règles d'apprentissage ~
Apprentissage par renforcement profond 1 Introduction au renforcement de l'apprentissage
[Deep Learning from scratch] J'ai essayé d'expliquer le décrochage
Introduction au Deep Learning ~ Rétropropagation ~
[Partie 4] Utilisez le Deep Learning pour prévoir la météo à partir d'images météorologiques
[Partie 1] Utilisez le Deep Learning pour prévoir la météo à partir d'images météorologiques
[Partie 3] Utilisez le Deep Learning pour prévoir la météo à partir d'images météorologiques
[Partie 2] Utilisez le Deep Learning pour prévoir la météo à partir d'images météorologiques
J'ai essayé d'implémenter Perceptron Part 1 [Deep Learning from scratch]
Deep learning / Deep learning from scratch 2 Chapitre 4 Mémo
Deep Learning / Deep Learning à partir de Zero 2 Chapitre 5 Mémo
Introduction à l'apprentissage en profondeur ~ Approximation des fonctions ~
Apprentissage profond à partir de zéro (calcul des coûts)
Apprentissage profond pour démarrer sans GPU
Introduction à l'apprentissage profond ~ Préparation au codage ~
Deep Learning / Deep Learning à partir de Zero 2 Chapitre 7 Mémo
Deep Learning / Deep Learning à partir de Zero 2 Chapitre 8 Mémo
Deep learning / Deep learning made from scratch Chapitre 5 Mémo
Deep learning / Deep learning made from scratch Chapitre 4 Mémo
Implémentation du modèle de reconnaissance d'images d'apprentissage en profondeur 2
Deep learning / Deep learning from scratch 2 Chapitre 3 Mémo
Mémo d'apprentissage profond créé à partir de zéro
Introduction au Deep Learning ~ Dropout Edition ~
Introduction au Deep Learning ~ Propagation vers l'avant ~
Introduction à l'apprentissage profond ~ Expérience CNN ~
Deep Learning / Deep Learning à partir de Zero 2 Chapitre 6 Mémo
[AI] Apprentissage en profondeur pour le débruitage d'image
Tutoriel d'apprentissage en profondeur de la construction d'environnement
L'apprentissage en profondeur
Deep learning 2 appris par l'implémentation (classification d'images)
[Mémo d'apprentissage] Le Deep Learning fait de zéro [Chapitre 7]
Apprentissage profond / Apprentissage profond à partir de zéro 2-Essayez de déplacer GRU
Modèle de reconnaissance d'image utilisant l'apprentissage profond en 2016
[Mémo d'apprentissage] Deep Learning fait de zéro [Chapitre 5]
Comment étudier le test Deep Learning G
[Mémo d'apprentissage] Le Deep Learning fait de zéro [Chapitre 6]
"Deep Learning from scratch" avec Haskell (inachevé)
Deep learning / Deep learning made from scratch Chapitre 7 Mémo
Reconnaissance d'image en apprentissage profond 3 après la création du modèle
[Windows 10] Construction de l'environnement "Deep Learning from scratch"
Enregistrement d'apprentissage de la lecture "Deep Learning from scratch"
[Deep Learning from scratch] À propos de l'optimisation des hyper paramètres
Mémo d'auto-apprentissage "Deep Learning from scratch" (partie 12) Deep learning
Apprentissage profond à partir des bases mathématiques (pendant la fréquentation)
[Mémo d'apprentissage] Deep Learning fait de zéro [~ Chapitre 4]
[Deep Learning from scratch] J'ai essayé d'implémenter la couche sigmoïde et la couche Relu
[Deep Learning from scratch] Implémentation de couche de la fonction softmax à l'erreur d'entropie croisée
"Deep Learning from scratch" Mémo d'auto-apprentissage (n ° 9) Classe MultiLayerNet
De rien sur Ubuntu 18.04 à la configuration d'un environnement Deep Learning sur Tensor
GitHub du bon livre "Deep Learning from scratch"
Deep Learning from scratch Chapter 2 Perceptron (lecture du mémo)
Mémorandum d'apprentissage profond
[Mémo d'apprentissage] Apprentissage profond à partir de zéro ~ Mise en œuvre de l'abandon ~
Commencer l'apprentissage en profondeur
Notes sur l'apprentissage automatique (mises à jour de temps en temps)