ForHosting KIT · Images

Détecter les images en double par hachage perceptuel

Si vous calculez déjà des hachages perceptuels pour vos images, ce point de terminaison transforme cette liste à plat en groupes de doublons.

● BetaGratuit · dans votre navigateur
Utilisez-le depuis WebAPIE-mailTelegramApp bientôt

Vous envoyez une entrée par image — un nom et son hachage, sous forme de chaîne hexadécimale ou de chaîne de bits 0/1 — ainsi qu'une distance de Hamming maximale en bits. Chaque paire de hachages située dans cette distance est reliée, puis les paires reliées sont fusionnées en groupes connexes : une chaîne de quasi-doublons se replie ainsi en un seul cluster au lieu de paires qui se chevauchent. Le résultat détaille chaque groupe avec ses membres, les distances internes entre paires et la plus grande distance au sein du groupe, accompagnés de totaux : combien d'images sont des doublons et combien restent uniques. Rien n'est téléversé : les hachages que vous possédez déjà constituent toute l'entrée nécessaire.

D'une liste de hachages à des groupes de doublons

Un hachage perceptuel tel qu'un pHash de 64 bits encode l'apparence d'une image, si bien que deux photos qui ne diffèrent que par la compression, la taille ou un filigrane produisent des hachages ne différant que de quelques bits. Comparer ces hachages deux à deux est facile ; la partie délicate, c'est ce qui vient ensuite. L'image A correspond à B, et B correspond à C, mais A ne correspond pas tout à fait à C — s'agit-il d'un seul ensemble de doublons ou de deux ? Cette fonctionnalité tranche la question de la manière standard : elle traite chaque image comme un nœud, trace une arête entre deux hachages dont la distance de Hamming est au plus égale au seuil choisi, et renvoie les composantes connexes comme groupes de doublons. Vous obtenez une entrée par groupe avec les noms des membres, chaque paire sous le seuil avec sa distance exacte, ainsi que la plus grande distance interne, ce qui permet de vérifier pourquoi deux images ont été réunies. Le regroupement se faisant par transitivité, une chaîne de réenregistrements qui dérive bit par bit aboutit quand même dans un cluster unique — exactement le comportement attendu d'une détection de quasi-doublons sur de vraies photothèques.

Choisir le seuil et le format de hachage

Le seuil est une distance de Hamming maximale en bits, fixée par défaut à 5, un point de départ courant pour les hachages de 64 bits : les images identiques obtiennent 0, et les réencodages visuellement indiscernables restent généralement sous 5. Descendez vers 0 si vous ne voulez que des correspondances exactes ou quasi exactes, augmentez-le avec prudence si votre pipeline redimensionne fortement ou rogne les bords, car chaque bit de tolérance supplémentaire multiplie le risque de faux positifs sur les grandes collections. Les hachages sont acceptés en deux formats : chaînes hexadécimales, décodées à raison de quatre bits par caractère, ou chaînes littérales de bits 0/1. La seule règle absolue est la cohérence — tous les hachages d'une requête doivent utiliser le même format et se décoder à la même longueur en bits, sinon une distance entre eux n'aurait aucun sens et la requête est rejetée avec une erreur explicite. Un seuil négatif est également rejeté comme entrée invalide. Vous pouvez calculer les hachages eux-mêmes avec la fonctionnalité sœur image.phash, qui produit exactement les chaînes hexadécimales de 16 caractères attendues par ce point de terminaison.

Une sortie déterministe, comparable et archivable

La réponse est conçue pour être conservée à côté de votre catalogue et comparée dans le temps. Les groupes sont triés selon la position de leur premier membre dans votre liste d'entrée, les membres gardent l'ordre d'entrée, et les paires internes sont listées avec les deux noms et la distance exacte : deux exécutions sur la même liste produisent donc une sortie identique à l'octet près, et les régressions apparaissent comme des diffs propres. À côté des groupes, vous obtenez les compteurs dont les tableaux de bord ont besoin : nombre total d'images traitées, longueur en bits des hachages, nombre de groupes de doublons, nombre d'images appartenant à un groupe et nombre d'images restant uniques. Il n'y a ni hasard, ni horloge, ni réseau : la même entrée donne toujours la même réponse, dans l'API comme dans l'exécuteur gratuit de cette page, qui fait tourner exactement le même code. Cela rend l'outil sûr pour les pipelines CI qui font échouer un build quand de nouveaux doublons s'introduisent dans un dépôt d'assets, et pour les tâches planifiées qui envoient un rapport de déduplication par e-mail.

Dédupliquer un catalogue de produits

Fournissez les pHashes de chaque photo produit et fusionnez les fiches qui réutilisent la même image sous des noms de fichiers ou des tailles différents.

Auditer une banque de photos

Repérez les clichés quasi identiques d'une même session pour que les relecteurs gardent un seul représentant au lieu de douze réexportations.

Protéger un pipeline de téléversement

Rejetez ou signalez un nouveau fichier lorsque son hachage tombe sous le seuil d'une image que vous stockez déjà.

Combien cela coûte-t-il ?

$0.002 par requête. L'exécution est également gratuite dans votre navigateur sur cette page, avec le même code.

Dois-je téléverser les images elles-mêmes ?

Non. Vous n'envoyez que les hachages perceptuels déjà calculés, plus un nom par image. Les fichiers binaires ne quittent jamais votre côté.

Quels formats de hachage sont acceptés ?

Les chaînes hexadécimales (quatre bits par caractère, insensibles à la casse) et les chaînes littérales de bits 0/1. Tous les hachages d'une requête doivent partager le même format et la même longueur en bits.

Quel seuil devrais-je utiliser ?

La valeur par défaut est 5 bits, un point de départ raisonnable pour des pHashes de 64 bits. Utilisez 0 pour ne retenir que les correspondances exactes, et augmentez-le avec prudence : des valeurs plus hautes capturent davantage de réenregistrements, mais aussi davantage de faux positifs.

Comment les groupes se forment-ils quand les correspondances se chevauchent ?

Par composantes connexes : si A correspond à B et B à C dans la limite du seuil, les trois atterrissent dans un seul groupe, même si A et C sont plus éloignés que le seuil. Les distances exactes de chaque paire sont listées pour que vous puissiez auditer chaque lien.

Que se passe-t-il avec un seuil négatif ?

La requête est rejetée comme entrée invalide, puisqu'une distance de Hamming ne peut pas être négative, et vous n'êtes pas facturé.

Tout sur cette page est disponible par programmation. Cette section s'adresse aux équipes qui veulent l'intégrer à leurs systèmes ; les autres peuvent simplement utiliser l'outil ci-dessus.

POSThttps://api.kit.forhosting.com/image/duplicate-detect-hash

Authentification par jeton Bearer : un seul POST met la tâche en file d’attente, et le résultat vous parvient par webhook ou lien signé.

curl -X POST https://api.kit.forhosting.com/image/duplicate-detect-hash \
  -H "Authorization: Bearer $KIT_KEY" \
  -H "Content-Type: application/json" \
  -d '{"images":[{"name":"hero-a.jpg","hash":"ff8f8383c3c3c3ff"},{"name":"hero-b.jpg","hash":"ff8f8383c3c3c3f7"},{"name":"hero-c.jpg","hash":"ff8f8383c3c3c3f3"},{"name":"logo.png","hash":"007c7c7c7c7c7c00"}]}'
{
  "images": [
    {
      "name": "hero-a.jpg",
      "hash": "ff8f8383c3c3c3ff"
    },
    {
      "name": "hero-b.jpg",
      "hash": "ff8f8383c3c3c3f7"
    },
    {
      "name": "hero-c.jpg",
      "hash": "ff8f8383c3c3c3f3"
    },
    {
      "name": "logo.png",
      "hash": "007c7c7c7c7c7c00"
    }
  ]
}
{
  "task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
  "type": "image.duplicate_detect_hash",
  "status": "queued",
  "_links": {
    "result": "/tasks/tsk_…/result"
  }
}

L’API est asynchrone : chaque appel renvoie un task_id immédiatement, puis vous interrogez l’état à raison d’une requête par seconde.

par requête$0.002

Le prix est publié, sans tokens ni crédits. Une tâche qui échoue n’est pas facturée.

max_items5000
HTTPCodeSignification
401unauthorizedClé API absente ou invalide : vérifiez l’en-tête Authorization.
402insufficient_balanceSolde insuffisant : rechargez votre compte pour lancer cette tâche.
404unknown_typeType de tâche inconnu : vérifiez le champ type de votre requête.
429rate_limitedTrop de requêtes : ralentissez la cadence, puis réessayez.

Consulter la documentation complète du KIT →