|
Publicité ' | ||||||||||||||||||||||||
|
|
#1 |
Inscription : juillet 2012 Messages : 14 ![]() |
Bonjour,
Je pense que j'ai mal placé mon message donc je le déplace au bon endroit voici mon problème : Je souhaiterai trouver, pour un point donné de la table courante, son plus proche voisin dans la table de référence. CREATE TABLE table_courante(id_point serial PRIMARY KEY,id_image INTEGER,x_image FLOAT,y_image FLOAT) CREATE TABLE table_ref(id_point serial PRIMARY KEY,id_image INTEGER,x_image FLOAT,y_image FLOAT). Pour cela je recherche le plus proche voisin en terme de distance euclidienne (x-y)² * (x-y)². Dans cet exemple, le vecteur est à 2 dimensions (x et y) mais dans ma vraie table il s'agit d'un vecteur à 64 dimensions (c'est un point d'intérêt avec 64 descripteurs ex :table_ref.desc_0 - table_courante.desc_0) * (table_ref.desc_0 - table_courante.desc_0) + (table_ref.desc_1 - table_courante.desc_1) + etc... ) j'aimerais que ma requête retourne l'id du point de l'image courant et l'id du point de l'image de référence pour laquelle la distance est la plus petite, et ceux pour l'ensemble de mes points courants. Actuellement je suis capable de faire ça : select table_courante.id_point,table_ref.id_point ,((table_ref.x-table_courante.x)*(table_ref.x-table_courante.x) + (table_ref.y-table_courante.y)*(table_ref.y-table_courante.y)) AS distance FROM table_ref, table_courante WHERE table_courante.id_point=XXX ORDER BY distance LIMIT 1 et je fais une boucle ou XXX prend toutes les valeurs de mon id du point courant (0, 1, 2 ...N) Mais cette requête prend 3 secondes pour comparer 2 images.. or j'ai 25 images à la sec.. et je dois être capable de faire du temps réel.. Je souhaiterais donc trouver un moyen de ne pas faire de boucle, et /ou trouver une requête complètement différente ou là requête prendrai quelques centaines de ms maximum. A terme la table de ref contiendra des milliers de points.. ATTENTION : ce n'est pas parce que l'id du point de l'image courante = l'id du point de ref qu'il s'agit du même point. Cela n'a rien à voir, ils sont chacun sur 2 images différentes J'espère que j'ai été clair Merci d'avance pour votre aide PS : je travaille sous postgre 9.1. avec un XP et un processeur de 2.5 Ghz PPS : je débute, Be nice |
|
|
00
|
|
|
#2 | ||||||
|
Membre Expert
![]() Inscription : mars 2005 Messages : 1 682 ![]() |
Bonjour,
Effectivement il faut faire une requête "ensembliste" qui retournera chaque POINT et son POI le plus proche. L'idée est donc de calculer la distance entre POINTet POI pour chaque couple POINT-POI. La requête qui donne tous les couples POINT-POI avec distance associée : Code :
Code :
Code :
|
||||||
|
|
00
|
|
|
#3 |
Inscription : juillet 2012 Messages : 14 ![]() |
Merci pour l'aide que vous souhaitez m'apporter.
je viens d'implémenter votre algo. Certes il fonctionne mais comme je vous l'ai dit chaque point n'a pas 2 coordonnées x et y mais 64 descripteurs.. Par conséquent, le temps de calcul avec votre algo ( comparaison de 300 points courant à 300 points de ref prend 9000 ms ... or mon algo avec une boucle prend 2850 ms Et à l'avenir table_point-ref que vous appelez POI aura plus de 10 000 points.. Merci pour votre aide ! |
|
|
00
|
|
|
#4 |
|
Membre Expert
![]() Inscription : mars 2005 Messages : 1 682 ![]() |
Il y a peut être des pistes d'amélioration pour ces requêtes qui donnent le même résultat. Cependant, les algorithmes utilisés restent gloutons et les optimisations offertes par Postgre (indexes spatiaux) pour le calcul de distances euclidiennes se limitent à la 2D si je ne dis pas de bêtises.
Il doit y avoir des pistes algorithmiques plus adaptées dans votre cas. Je ne suis pas du tout connaisseur, aussi je vous conseille de demander sur le forum algorithmie pour tenter une meilleure approche. |
|
|
00
|
|
|
#5 |
Inscription : juillet 2012 Messages : 14 ![]() |
OK merci quand même pour ton aide..
J'ai du mal à croire que personne d'autre ne s'est intéressé à la recherche du plus proche voisin dans un espace à N dimensions.. C'est pourtant courant maintenant les KD-tree et compagnie... Impossible de trouver une implémentation en tout cas .. PS : ou est ce que je peux trouver ton forum algorithmie ? |
|
|
00
|
|
|
#6 |
|
Membre Expert
![]() Inscription : mars 2005 Messages : 1 682 ![]() |
Des personnes s'y sont penchées mais il n'y a pas une implémentation native dans Postgre. Vous pouvez vous baser sur les solutions algorithmiques et faire une implémentation sous Postgre si besoin.
|
|
|
00
|
|
|
#7 |
![]() ![]() ![]() Frédéric BROUARDExpert SGBDR & SQL Inscription : mai 2002 Messages : 12 080 ![]() |
Utilisez PostGIS et mettez un index sur votre colonne géometry cela ira beaucoup plus vite. utilisez ST_Distance et faite le MIN.
A +
__________________
Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL Site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/ Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp. Blog SQL, SQL Server, modélisation données : http://blog.developpez.com/sqlpro http://www.sqlspot.com : modélisation, conseils, audit, optimisation, formation * * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * * |
|
00
|
|
|
#8 |
|
Membre Expert
![]() Inscription : mars 2005 Messages : 1 682 ![]() |
Le problème étant que ça n'est pas implémenté pour des géométries à plus de 2 dimensions comme je le disais.
|
|
|
00
|
|
|
#9 | |
Inscription : juillet 2012 Messages : 14 ![]() |
Citation:
ce n'est pas la recherche d'un point en terme de distance (dans un plan 2D) mais bien la recherche d'un point d'intérêt avec son plus proche voisin en terme de descripteurs. Est ce que vous avez (ou quelqu'un a) déjà implémenté un tel algo ? ça me parait bizarre que non ... |
|
|
|
00
|
|
|
#10 | |
![]() ![]() ![]() Frédéric BROUARDExpert SGBDR & SQL Inscription : mai 2002 Messages : 12 080 ![]() |
Citation:
A +
__________________
Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL Site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/ Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp. Blog SQL, SQL Server, modélisation données : http://blog.developpez.com/sqlpro http://www.sqlspot.com : modélisation, conseils, audit, optimisation, formation * * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * * |
|
|
00
|
|
|
#11 | |
Inscription : juillet 2012 Messages : 14 ![]() |
je vais lire votre article mais vous parlez de st_distance or
Citation:
De plus les données traitées par gist sont des points avec des coordonnées x et y. A la limite Z .. Or moi au lieu d'un vecteur (x,y) j'ai un vecteur(d1,d2,..,dN) |
|
|
|
00
|
|
|
#12 | |
![]() ![]() Inscription : octobre 2008 Messages : 1 702 ![]() |
Citation:
Il y a plein d'articles au sujet de la recherche de voisins dans un espace à N dimensions, mais ce sont des articles de niveau recherche et pas des tutoriels sur comment faire avec un SGBD. De plus ces articles sont incompréhensibles pour qui n'a pas déjà des connaissances avancées dans ce domaine. Or tu te dis débutant, il y a à mon sens une contradiction avec le niveau de difficulté du problème auquel tu t'es attaqué. |
|
|
|
11
|
|
|
#13 | |
Inscription : juillet 2012 Messages : 14 ![]() |
1 : Votre article ne m'a pas aidé pour moi il s'agit que d'espace limités à 3D
2 : Citation:
Je pense qu'on s'éloigne pttr du problème et qu'optmiser ma 1ère requête est pttr plus simple.. |
|
|
|
01
|
|
|
#14 | |
![]() ![]() Inscription : octobre 2008 Messages : 1 702 ![]() |
Citation:
Ceux qui essaient de t'aider avec 2 dimensions, tu leur rétorques que ça ne t'intéresse pas parce que tu veux 64 dimensions. Et tu en conclus qu'il faut optimiser ta requête à 2 dimensions. Bon courage pour continuer à tourner en rond. |
|
|
|
11
|
|
|
#15 | |
Inscription : juillet 2012 Messages : 14 ![]() |
Citation:
mais dans ma vraie table il s'agit d'un vecteur à 64 dimensions (c'est un point d'intérêt avec 64 descripteurs ex :table_ref.desc_0 - table_courante.desc_0) * (table_ref.desc_0 - table_courante.desc_0) + (table_ref.desc_1 - table_courante.desc_1) + etc... ) l'EXEMPLE de la requête à 2D c'est juste pour comprendre le principe de l'algo que j'essaye d'implémenter |
|
|
|
02
|
|
|
#16 |
|
Membre Expert
![]() Inscription : mars 2005 Messages : 1 682 ![]() |
J'ai proposé une autre formulation de requête pour voir si elle pouvait s'avérer plus rapide en l'état (qu'on soit en 2 ou x dimensions). On vous a dit que postgre n'implémentait pas de solution native pour votre problème (à travers des opérateurs et des index spécifiques).
Estofilo a fait remarquer que la littérature sur le sujet indique qu'avec beaucoup de dimensions, il n'y a pas de recherche de solution exacte qui soit rapide. C'est aussi ce que j'ai cru lire (vu mes faibles connaissances) car ils évoquaient systématiquement des approximations pour optimiser ça. Qu'avez vous cherché/trouvé concernant votre problème si ce n'est penser que postgre disposait en son sein d'une solution toute prête ? |
|
|
10
|
|
|
#17 |
Inscription : juillet 2012 Messages : 14 ![]() |
je travaille sous openCV en C++, donc actuellement je réalise l'appariement à l'aide d'une fonction propre à cette bibliothèque appelé cvFindFeatures qui me permet de trouver mes paires (id_courant et id_ref).
En passant par la BDD (après chargement des images) je pensais que j'irais plus vite pour trouver mes paires. c'était une piste comme une autre.. |
|
|
00
|
|
|
#18 |
|
Membre Expert
![]() Inscription : mars 2005 Messages : 1 682 ![]() |
Si vous avez les données en mémoire et que vous utilisez Postgre comme tampon pour y faire des requêtes de traitement d'image avec un algorithme glouton, il ne faut pas s'étonner que vous n'arriviez pas à faire du temps réel surtout vu vos contraintes.
Je ne pense pas que vous utilisez la base de données à bon escient ici. |
|
|
00
|
|
|
#19 |
|
Membre Expert
![]() Inscription : mars 2005 Messages : 1 682 ![]() |
Avez vous fait des recherches sur votre problème d'un point de vue purement algorithmique pour améliorer les performances ?
|
|
|
00
|
|
|
#20 |
![]() ![]() ![]() Frédéric BROUARDExpert SGBDR & SQL Inscription : mai 2002 Messages : 12 080 ![]() |
Il n'est pas possible de vous aider sans :
1) le DDL de votre table 2) un jeu d'essais 3) un résultat Et pas des exemples bidons dont vous avez pollué le forum. A +
__________________
Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL Site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/ Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp. Blog SQL, SQL Server, modélisation données : http://blog.developpez.com/sqlpro http://www.sqlspot.com : modélisation, conseils, audit, optimisation, formation * * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * * |
|
00
|
Copyright © 2000-2013 - www.developpez.com