Détection d’image presque en double [fermé]

93

Quel est un moyen rapide de trier un ensemble d'images donné en fonction de leur similitude.

Pour le moment, j'ai un système qui analyse l'histogramme entre deux images, mais c'est une opération très coûteuse et semble trop exagérée.

Idéalement, je recherche un algorithme qui donnerait à chaque image un score (par exemple un score entier, tel que la moyenne RVB) et je peux simplement trier par ce score. Des scores identiques ou côte à côte sont des doublons possibles.

0299393
0599483
0499994 <- possible dupe
0499999 <- possible dupe
1002039
4995994
6004994 

La moyenne RVB par image est nul, y a-t-il quelque chose de similaire?

L'inconnu
la source
5
Une question clé, en réfléchissant à ce que vous avez écrit et à certaines des réponses à la question connexe que Naaff a soulevée, vous voudrez peut-être définir plus clairement ce que signifie «similitude». Une image identique, mais décalée de cinq pixels, serait-elle «similaire»? Visuellement oui ... mais à un algorithme ... probablement pas, à moins que vous n'y ayez pensé et que vous ne l'ayez expliqué. Pouvez-vous fournir plus de détails? Les doublons seraient-ils exacts ou simplement «fermés»? Regardez-vous des scans où ils pourraient différer d'un léger angle? Et l'intensité? Il y a beaucoup de variables ici ...
Beska
En quoi les «doublons» diffèrent-ils? Par exemple, seraient-ils des images du même endroit avec une pose / un décalage différent? Vous semblez vouloir quelque chose qui est O (nlog (n)) avec le nombre d'images. Est-ce que quelqu'un sait si c'est possible? Il semble que ce soit peut-être ..
Justin Scheiner
@ The Unknown: Si vous n'êtes pas satisfait de l'une des réponses actuelles, pouvez-vous nous donner plus de conseils? Nous avons fait de notre mieux pour répondre à votre question, mais sans aucun commentaire, il est peu probable que nous trouvions quelque chose de mieux.
Naaff
C'est actuellement l'un des grands problèmes non résolus en informatique. Bonne chance copain.
john ktejik

Réponses:

70

Il y a eu de nombreuses recherches sur la recherche d'images et les mesures de similitude. Ce n'est pas un problème facile. En général, un seul intne suffira pas pour déterminer si les images sont très similaires. Vous aurez un taux de faux positifs élevé.

Cependant, comme de nombreuses recherches ont été effectuées, vous pourriez en examiner quelques-unes. Par exemple, cet article (PDF) donne un algorithme d'empreinte digitale d'image compacte qui convient pour trouver des images en double rapidement et sans stocker beaucoup de données. Il semble que ce soit la bonne approche si vous voulez quelque chose de robuste.

Si vous recherchez quelque chose de plus simple, mais certainement plus ad hoc, cette question SO a quelques idées décentes.

Naaff
la source
2
ce document date de 2004, vous ne savez pas si c'est toujours la meilleure réponse?
Andrew
50

Je recommanderais d'envisager de ne plus utiliser simplement un histogramme RVB.

Un meilleur résumé de votre image peut être obtenu si vous prenez une ondelette 2d Haar de l'image (c'est beaucoup plus facile qu'il n'y paraît, c'est juste beaucoup de moyennes et quelques racines carrées utilisées pour pondérer vos coefficients) et de conserver simplement le k plus grand coefficients pondérés dans l'ondelette en tant que vecteur fragmenté, normaliser et enregistrer cela pour réduire sa taille. Vous devez au moins redimensionner RG et B en utilisant des poids perceptifs au moins ou je vous recommande de passer à YIQ (ou YCoCg, pour éviter le bruit de quantification) afin de pouvoir échantillonner les informations de chrominance avec une importance réduite.

Vous pouvez maintenant utiliser le produit scalaire de deux de ces vecteurs normalisés clairsemés comme mesure de similitude. Les paires d'images avec les produits scalaires les plus importants auront une structure très similaire. Cela a l'avantage d'être légèrement résistant au redimensionnement, au changement de teinte et au tatouage, et d'être vraiment facile à mettre en œuvre et compact.

Vous pouvez concilier stockage et précision en augmentant ou en diminuant k.

Le tri par un seul score numérique sera insoluble pour ce type de problème de classification. Si vous y réfléchissez, il faudrait que les images ne puissent «changer» que le long d'un axe, mais ce n'est pas le cas. C'est pourquoi vous avez besoin d'un vecteur de fonctionnalités. Dans le cas de l'ondelette de Haar, c'est à peu près l'endroit où se produisent les discontinuités les plus nettes de l'image. Vous pouvez calculer une distance entre des images par paires, mais comme tout ce que vous avez est une métrique de distance, un ordre linéaire n'a aucun moyen d'exprimer un «triangle» de 3 images qui sont toutes également distantes. (c'est-à-dire pensez à une image entièrement verte, une image entièrement rouge et une image toute bleue.)

Cela signifie que toute solution réelle à votre problème nécessitera des opérations O (n ^ 2) dans le nombre d'images que vous avez. Alors que s'il avait été possible de linéariser la mesure, vous pourriez avoir besoin de seulement O (n log n) ou O (n) si la mesure convenait, par exemple, à un tri par base. Cela dit, vous n'avez pas besoin de dépenser O (n ^ 2) car dans la pratique, vous n'avez pas besoin de passer au crible l'ensemble, vous avez juste besoin de trouver les éléments qui sont plus proches d'un certain seuil. Ainsi, en appliquant l'une des nombreuses techniques pour partitionner votre espace vectoriel clairsemé, vous pouvez obtenir des asymptotiques beaucoup plus rapides pour le problème `` me trouver des images qui sont plus similaires qu'un seuil donné '' que de comparer naïvement chaque image à chaque image, vous donnant ce que vous avez probablement besoin de ...

En tout cas, je l'ai utilisé il y a quelques années à bon escient personnellement en essayant de minimiser le nombre de textures différentes que je stockais, mais il y a aussi eu beaucoup de bruit de recherche dans cet espace montrant son efficacité (et dans ce cas en comparant une forme plus sophistiquée de classification d'histogramme)

http://www.cs.princeton.edu/cass/papers/spam_ceas07.pdf

Si vous avez besoin d'une meilleure précision de détection, les algorithmes minHash et tf-idf peuvent être utilisés avec l'ondelette de Haar (ou l'histogramme) pour traiter les modifications de manière plus robuste:

http://cmp.felk.cvut.cz/~chum/papers/chum_bmvc08.pdf

Enfin, Stanford propose une recherche d'images basée sur une variante plus exotique de ce type d'approche, basée sur l'extraction de davantage de fonctionnalités à partir des ondelettes pour trouver des sections d'images pivotées ou mises à l'échelle, etc., mais cela va probablement bien au-delà de la quantité de travail que vous 'voudrais faire.

http://wang14.ist.psu.edu/cgi-bin/zwang/regionsearch_show.cgi

Edward KMETT
la source
Il semble que vous décrivez indirectement les kd-arbres et autres pour rechercher l'espace pour des candidats potentiels. Cela vaut peut-être la peine de le noter.
Boojum le
1
Eh bien, la raison pour laquelle je n'ai pas spécifié de techniques au-delà d'une sorte d'allusion vague est que les arbres kd fonctionnent bien lorsque vous avez un nombre relativement petit de dimensions dans votre espace. Ici, vous avez probablement ~ 128 dimensions ou plus qui sont peu peuplées. Comme elles sont clairsemées, la majorité des valeurs seront nulles, il est donc presque inutile de faire un tour de rôle à travers les dimensions pour partitionner dans le style kd. De la même manière, les arbres R s'effondrent, laissant probablement votre meilleur pari: les arbres X. Malheureusement, ils sont également proches de la limite de leurs performances face à autant de dimensions.
Edward KMETT le
"et conserver simplement les k plus grands coefficients pondérés dans l'ondelette sous forme de vecteur clairsemé," - conserver par ligne ou pour l'ondelette entière?
ivan.ukr
"Vous devez au moins redimensionner RG et B en utilisant des poids perceptifs au moins ou je vous recommande de passer à YIQ (ou YCoCg, pour éviter le bruit de quantification) afin de pouvoir échantillonner les informations de chrominance avec une importance réduite." - et quoi encore? Faire une ondelette pour Y uniquement ou le faire pour tous les canaux? Si c'est le cas pour tous les canaux - comment mesurer la similitude des images avec plusieurs canaux? ajouter des produits scalaires de chaque canal et en tenir compte comme mesure de similarité ou devrait-il y avoir un ajout pondéré?
ivan.ukr
15

J'ai implémenté un algorithme très fiable pour cela appelé Interrogation d'image multi-résolution rapide . Mon code (ancien, non maintenu) pour cela est ici .

L'interrogation d'image multi-résolution rapide consiste à diviser l'image en 3 parties en fonction de l'espace colorimétrique YIQ (mieux pour faire correspondre les différences que RVB). Ensuite, l'image est essentiellement compressée à l'aide d'un algorithme d'ondelettes jusqu'à ce que seules les caractéristiques les plus importantes de chaque espace colorimétrique soient disponibles. Ces points sont stockés dans une structure de données. Les images de requête passent par le même processus et les principales fonctionnalités de l'image de requête sont comparées à celles de la base de données stockée. Plus il y a de correspondances, plus les images sont susceptibles d'être similaires.

L'algorithme est souvent utilisé pour la fonctionnalité "requête par croquis". Mon logiciel permettait uniquement de saisir des images de requête via une URL, il n'y avait donc pas d'interface utilisateur. Cependant, j'ai trouvé que cela fonctionnait exceptionnellement bien pour faire correspondre les vignettes à la grande version de cette image.

Retrievr est beaucoup plus impressionnant que mon logiciel, qui vous permet d'essayer l'algorithme FMIQ en utilisant des images Flickr comme source. Très cool! Essayez-le via un croquis ou en utilisant une image source, et vous pourrez voir à quel point cela fonctionne.

Luc Francl
la source
Peut-il encore reconnaître les images pivotées?
endolith
Je doute que cela fonctionne très bien pour cela. Vous voudrez probablement encoder les images pour chaque rotation pour maximiser les correspondances pertinentes.
Luke Francl
Le lien vers retrievr semble être en panne - est-ce archivé quelque part?
mmigdol
10

Une image a de nombreuses fonctionnalités, donc à moins que vous ne vous limitiez à une seule, comme la luminosité moyenne, vous avez affaire à un espace de problème à n dimensions.

Si je vous demandais d'attribuer un seul entier aux villes du monde, afin que je puisse dire lesquelles sont proches, les résultats ne seraient pas géniaux. Vous pouvez, par exemple, choisir le fuseau horaire comme entier unique et obtenir de bons résultats avec certaines villes. Cependant, une ville près du pôle nord et une autre ville près du pôle sud peuvent également être dans le même fuseau horaire, même si elles sont aux extrémités opposées de la planète. Si je vous laisse utiliser deux entiers, vous pourriez obtenir de très bons résultats avec la latitude et la longitude. Le problème est le même pour la similitude des images.

Cela dit, il existe des algorithmes qui tentent de regrouper des images similaires, ce que vous demandez. C'est ce qui se passe lorsque vous effectuez la détection des visages avec Picasa. Avant même d'identifier des visages, il regroupe les visages similaires afin qu'il soit facile de parcourir un ensemble de visages similaires et de donner à la plupart d'entre eux le même nom.

Il existe également une technique appelée Analyse des composants principaux, qui vous permet de réduire les données à n dimensions à un nombre inférieur de dimensions. Ainsi, une image avec n caractéristiques pourrait être réduite à une caractéristique. Cependant, ce n'est toujours pas la meilleure approche pour comparer des images.

Neil
la source
1
C'est un point discutable, mais vous POUVEZ utiliser un seul entier pour représenter la combinaison de n'importe quel nombre de caractéristiques, si, par exemple, caractéristique x = 2 et caractéristique y = 3 et caractéristique z = 5 et caractéristique aa = 7, et cetera, alors la puissance à laquelle cette base principale a été élevée sous la forme factorisée d'un seul entier serait la valeur de la caractéristique pour cette image spécifique. Encore une fois, un point discutable car la taille du nombre serait absurde. Bien que cette taille puisse être encore réduite ... nous ne parlons que de données structurées.
argyle
Vrai. Mais le vrai point est d'organiser les nombres de sorte que les images similaires soient rapprochées numériquement. Malgré ce que j'ai dit ci-dessus, c'est possible. En bref, vous pouvez résoudre le problème du voyageur de commerce pour trouver un chemin minimum (ou presque minimum) à travers les images dans un espace à n dimensions (où n est le nombre de fonctionnalités que vous souhaitez utiliser pour comparer les images). Mais cela coûte cher.
Neil
8

Il existe une bibliothèque C ("libphash" - http://phash.org/ ) qui calculera un "hachage perceptif" d'une image et vous permettra de détecter des images similaires en comparant les hachages (vous n'avez donc pas à comparer chaque image directement contre toutes les autres images) mais malheureusement, cela ne semblait pas très précis lorsque je l'ai essayé.

personne
la source
5

Vous devez décider de ce qui est «similaire». Contraste? Teinte?

Une image est-elle "similaire" à la même image à l'envers?

Je parie que vous pouvez trouver beaucoup "d'appels proches" en divisant les images en morceaux 4x4 et en obtenant une couleur moyenne pour chaque cellule de la grille. Vous auriez seize partitions par image. Pour juger de la similitude, vous feriez juste une somme de carrés de différences entre les images.

Je ne pense pas qu'un seul hachage ait du sens, à moins que ce ne soit contre un seul concept comme la teinte, la luminosité ou le contraste.

Voici votre idée:

0299393
0599483
0499994 <- possible dupe
0499999 <- possible dupe
1002039
4995994
6004994

Tout d'abord, je vais supposer que ce sont des nombres décimaux qui sont R * (2 ^ 16) + G * (2 ^ 8) + B, ou quelque chose comme ça. De toute évidence, ce n'est pas bon car le rouge est excessivement pondéré.

Se déplacer dans l'espace HSV serait mieux. Vous pouvez répartir les bits de HSV dans le hachage, ou simplement régler H ou S ou V individuellement, ou vous pouvez avoir trois hachages par image.


Encore une chose. Si vous pesez R, V et B. Poids vert le plus élevé, puis rouge, puis bleu pour correspondre à la sensibilité visuelle humaine.

Nosredna
la source
5

À l'ère des services Web, vous pouvez essayer http://tineye.com

zproxy
la source
3
Le code derrière tineye semble être exactement ce que recherche le questionneur, mais je ne pense pas qu'en tant que service Web, il soit très utile, car il n'y a pas de moyen (évident) de lui donner deux images et de demander "est-ce que c'est la même chose? " - la deuxième image devrait être sur une page Web et indexée par tineye
dbr
1
Peut-être fournissent-ils une API aux utilisateurs professionnels? Ils devraient être contactés à ce sujet.
zproxy
Il existe une API commerciale qui fournit exactement ces services.tineye.com/MatchEngine .
Gajus
1

J'ai supposé qu'un autre logiciel de recherche d'images en double effectuait une FFT sur les images et stockait les valeurs des différentes fréquences sous forme de vecteurs:

Image1 = (u1, u2, u3, ..., un)
Image2 = (v1, v2, v3, ..., vn)

puis vous pouvez comparer deux images pour l' égalité en calculant la distance entre les vecteurs de poids de deux images:

distance = Sqrt(
     (u1-v1)^2 +
     (u2-v2)^2 +
     (u2-v3)^2 +
     ...
     (un-vn)^2);
Ian Boyd
la source
2
La plupart des images naturelles ont un contenu de fréquence très similaire, donc je doute que ce soit une très bonne métrique.
Hannes Ovrén
1

Une solution consiste à effectuer une comparaison RMS / RSS sur chaque paire d'images nécessaires pour effectuer un tri à bulles. Deuxièmement, vous pouvez effectuer une FFT sur chaque image et effectuer un calcul de la moyenne des axes pour récupérer un seul entier pour chaque image que vous utiliseriez comme index pour trier. Vous pouvez envisager de faire n'importe quelle comparaison sur une version redimensionnée (25%, 10%) de l'original en fonction de la petite différence que vous choisissez d'ignorer et de l'accélération dont vous avez besoin. Faites-moi savoir si ces solutions sont intéressantes, et nous pouvons discuter ou je peux fournir un exemple de code.

Paul
la source
FFT ne vous fournit que des informations de couleur et aucune information sur la position. Le redimensionnement ignore toutes les fonctionnalités inférieures à une taille donnée, quel que soit leur impact sur l'image résultante. Une image grise et un damier peuvent être identiques sous cette mesure. Une approche par ondelettes (Daubechies, Haar, etc.) présente les avantages de fournir à la fois des informations de position et de couleur en échangeant la proportion d'informations de position et de couleur dans chaque point de données.
Edward KMETT
2
Non, la FFT d'une image contient toutes les informations spatiales de l'original. Vous pouvez reconstruire l'original à partir de la FFT. homepages.inf.ed.ac.uk/rbf/HIPR2/fourier.htm Cependant, un histogramme, ce à quoi vous pensiez peut-être, ne l'est pas.
Paul
1

La plupart des approches modernes pour détecter la détection d'image quasi dupliquée utilisent la détection de points intéressants et des descripteurs décrivant la zone autour de ces points. Le SIFT est souvent utilisé. Ensuite, vous pouvez quatiser les descripteurs et utiliser des clusters comme vocabulaire de mots visuels.

Donc, si nous voyons le rapport entre les mots visuels communs de deux images et tous les mots visuels de ces images, vous estimez la similitude entre les images. Il y a beaucoup d'articles intéressants. L'un d'eux est la détection d'image presque en double: pondération minHash et tf-idf

ton4eg
la source