Similitude d'image | Implémenter la similarité d'image en Python

Partager sur Facebook
Partager sur Twitter
Partager sur lié
Partager sur télégramme
Partager sur WhatsApp

Contenu

Ce message a été rendu public dans le cadre de la Blogathon sur la science des données.

introduction

Avez-vous déjà rêvé de créer votre propre application de similarité d'images ?, mais vous avez peur de ne pas en savoir assez sur l'apprentissage en profondeur, réseau de neurones convolutifs et plus? Évitez de vous inquiéter. Le didacticiel suivant vous aidera à démarrer et à coder votre propre application de similarité d'images avec des mathématiques de base.

Avant de passer aux maths et au code, je te poserais une question simple. Étant donné deux images de référence et une image de test, À laquelle pensez-vous que notre image de test appartient à deux ??

Image de référence 1

Image de référence de similarité d'image 1

Image de référence 2

Image de référence de similarité d'image 2

Tester l'image

Image de test de similarité d'image

Si vous pensez que notre image de test est similaire à notre première image de référence, Tu as raison. Si vous croyez le contraire, Découvrons avec la puissance des mathématiques et de la programmation.

“L'avenir de la recherche se concentrera sur les images plutôt que sur les mots-clés”. – Ben Silbermann, PDG de Pinterest.

Image vectorielle

Chaque image est stockée dans notre ordinateur sous forme de nombres et un vecteur de tels nombres qui peut décrire pleinement notre image est connu sous le nom de vecteur d'image..

Distance euclidienne:

La distance euclidienne représente la distance entre deux points quelconques dans un espace à n dimensions. Puisque nous représentons nos images comme des vecteurs d'images, ils ne sont rien de plus qu'un point dans un espace de n dimensions et nous allons utiliser la distance euclidienne pour trouver la distance entre eux.

Formule de distance euclidienne

Histogramme:

Un histogramme est un affichage graphique de valeurs numériques. Nous utiliserons le vecteur image pour les trois images puis nous trouverons la distance euclidienne entre elles. Sur la base des valeurs renvoyées, l'image avec une distance plus petite est plus similaire que l'autre.

Graphique d'histogramme - MATLAB

Pour trouver la similitude entre les deux images, nous utiliserons l'approche suivante:

  1. Lire les fichiers image sous forme de tableau.
  2. Étant donné que les fichiers image sont colorés, il y a 3 canaux pour les valeurs RVB. Nous allons les aplatir pour que chaque image soit une seule matrice 1-D.
  3. Une fois que nous avons nos fichiers image sous forme de tableau, nous allons générer un histogramme pour chaque image où pour chaque index 0-255 comptons l'occurrence de cette valeur de pixel dans l'image.
  4. Une fois que nous avons nos histogrammes, nous utiliserons la règle L2 ou la distance euclidienne pour trouver la différence entre les deux histogrammes.
  5. Basé sur la distance entre l'histogramme de notre image de test et les images de référence, nous pouvons trouver l’image à laquelle notre image de test est la plus similaire..

Codage pour la similitude d’image en Python

Importer les dépendances que nous allons utiliser

from PIL import Image
from collections import Counter
import numpy as np

Nous utiliserons NumPy pour enregistrer l’image en tant que tableau NumPy, Image pour lire l’image en termes de valeurs numériques et Compteur pour compter le nombre de fois que chaque valeur de pixel se produit (0-255) dans les images.

Lire l’image

reference_image_1 = Image.open('Reference_image1.jpg')
reference_image_arr = np.asarray(reference_image_1)
imprimer(np.forme(reference_image_arr))
>>> (250, 320, 3)

Nous pouvons voir que notre image a été correctement lue comme une matrice 3-D. A l'étape suivante, nous devons aplatir cette matrice 3-D en une matrice unidimensionnelle.

flat_array_1 = array1.flatten()
imprimer(np.forme(tableau_plat_1))
>>> (245760, )

Nous allons faire les mêmes étapes pour les deux autres images. Je vais l'ignorer ici pour que vous puissiez le tester davantage.

Génération du vecteur d'histogramme de comptage:

RH1 = Compteur(tableau_plat_1)

La ligne de code suivante renvoie un dictionnaire où la clé correspond à la valeur du pixel et la valeur de la clé est le nombre de fois où ce pixel est présent dans l'image.

Une limitation de la distance euclidienne est qu'elle a besoin que tous les vecteurs soient normalisés, En d'autres termes, les deux vecteurs doivent avoir les mêmes dimensions. Pour s'assurer que notre vecteur d'histogramme est normalisé, nous allons utiliser une boucle pour de 0-255 et nous allons générer notre histogramme avec la valeur clé si la clé est présente dans l'image; cas contraire, nous ajoutons un 0.

H1 = []
pour moi à portée(256):
    si je dans RH1.keys():
        H1.append(D1[je])
    autre:
        H1.append(0)

L'extrait de code ci-dessus génère un vecteur de taille (256,) où chaque indice correspond à la valeur du pixel et la valeur correspond au nombre de pixels dans cette image.

Nous suivons les mêmes étapes pour les deux autres images et obtenons leurs Count-Histogram-Vectors correspondants. En ce point, nous avons nos vecteurs finaux pour les images de référence et l’image de test et tout ce que nous allons faire est de calculer les distances et de prédire.

Fonction de distance euclidienne:

def L2Norm(H1,H2):
    distance =0
    for i in range(longueur(H1)):
        distance += np.carré(H1[je]-H2[je])
    retourner np.sqrt(distance)

La fonction ci-dessus prend deux histogrammes et renvoie la distance euclidienne entre eux.

Évaluation:

Puisque nous avons tout ce dont nous avons besoin pour trouver les similitudes dans l'image, Découvrons la distance entre l'image de test et notre première image de référence.

dist_test_ref_1 = L2Norm(H1, test_H)
imprimer("La distance entre Reference_Image_1 et Test Image est : {}".format(dist_test_ref_1))
>>> La distance entre Reference_Image_1 et Test Image est : 9882.175468994668

Voyons maintenant la distance entre l'image de test et notre deuxième image de référence.

dist_test_ref_2 = L2Norm(H2,test_H)
imprimer("La distance entre Reference_Image_2 et Test Image est : {}".format(dist_test_ref_2))
>>> La distance entre Reference_Image_2 et Test Image est : 137929.0223122023

conclusion

Sur la base des résultats précédents, nous pouvons voir que la distance entre notre image de test et notre première image de référence est beaucoup plus petite que la distance entre notre test et notre deuxième image de référence, ce qui est logique car l'image de test et notre première image de référence sont des images Piegon tandis que notre deuxième image de référence est celle d'un paon.

Dans le prochain tutoriel, nous avons appris à utiliser les mathématiques de base et peu de programmation pour créer notre propre prédicteur de similarité d'image avec des résultats assez décents.

Le code complet peut être trouvé avec les images. ici.

A propos de l'auteur

Je m'appelle Prateek Agrawal et je suis un étudiant de troisième année à l'Indian Institute of Design and Manufacturing of Information Technology Kancheepuram., poursuivant mon double diplôme B.Tech et M.Tech en informatique. J'ai toujours eu un don pour l'apprentissage automatique et la science des données et je le pratique depuis environ un an et j'ai quelques victoires à mon actif..

Je crois personnellement que La passion est tout ce dont vous avez besoin. Je me souviens avoir eu peur d'entendre les gens parler de CNNS, RNN et Deep Learning parce que je ne pouvais pas comprendre une seule partie, mais je n'ai pas abandonné. J'ai eu la passion et j'ai commencé à faire de petits pas vers l'apprentissage et je publie ici mon premier blog. J'espère que vous avez apprécié cette lecture et que vous vous sentez un peu sûr de vous. Faites-moi confiance à ce sujet, si je peux, tu peux.

S'il vous plait, écrivez-moi en cas de questions ou juste pour dire bonjour.

LinkedIn: https://www.linkedin.com/in/prateekagrawal1405/
Github: https://github.com/prateekagrawaliiit

Crédits
  • Wikipédia
  • Vidhya Analytics
  • Moitié
  • Google images

Les médias présentés dans cet article ne sont pas la propriété de DataPeaker et sont utilisés à la discrétion de l'auteur.

Abonnez-vous à notre newsletter

Nous ne vous enverrons pas de courrier SPAM. Nous le détestons autant que vous.