Tracer une isoline d'une fonction 2D coûteuse

10

J'ai un problème de formulation similaire à ce post, avec quelques différences notables:

Quelles méthodes simples existe-t-il pour échantillonner de manière adaptative une fonction 2D?

Comme dans ce post:

  • J'ai un et l'évaluation de cette fonction coûte un peu cher à calculerf(x,y)

Contrairement à ce poste:

  • Je ne m'intéresse pas à la valeur de la fonction avec précision partout, mais seulement à trouver un seul isocontour de la fonction.

  • Je peux faire des affirmations significatives sur l'autocorrélation de la fonction, et par conséquent sur l'échelle de lissage.

Existe-t-il un moyen intelligent de suivre / échantillonner cette fonction et de trouver ce contour?

Plus d'information

La fonction est le calcul des caractéristiques Haralick sur pixels entourant le point et la classification douce par une sorte de classifieur / régresseur. La sortie de ceci est un nombre à virgule flottante qui indique à quelle texture / matériau le point appartient. L'échelle de ce nombre peut être des probabilités de classe estimées (SoftSVM ou méthodes statistiques, etc.) ou quelque chose de vraiment simple comme la sortie d'une régression linéaire / logistique. La classification / régression est précise et bon marché par rapport au temps nécessaire à l'extraction des caractéristiques de l'image.N

Les statistiques entourant signifient que la fenêtre échantillonne généralement les régions qui se chevauchent et, en tant que tel, il existe une corrélation significative entre les échantillons voisins. (Quelque chose que je peux même aborder numériquement / symboliquement) Par conséquent, cela peut être considéré comme une fonction plus complexe de où un plus grand donnera une estimation plus liée au voisinage (hautement corrélée), et un un plus petit donnera une estimation plus variable, mais plus locale. Nf(x,y,N)NN

Choses que j'ai essayées:

  • Calcul brutal - Fonctionne bien. 95% de segmentation correcte avec constant . Les résultats sont fantastiques lorsqu'ils sont profilés en utilisant n'importe quelle méthode standard après cela. Cela prend une éternité . Je peux simplifier les fonctionnalités calculées par échantillon, mais idéalement, je veux éviter cela pour garder ce code général aux images avec des textures dont les différences apparaissent dans différentes parties de l'espace des fonctionnalités. N

  • Dumb Stepping - Faites un "pas" d'un pixel dans chaque direction et choisissez la direction à déplacer en fonction de la proximité de la valeur de l'iso-ligne. Encore assez lent, et il ignorera la bifurcation d'une isoligne. De plus, dans les zones à gradient plat, il "vagabonde" ou se replie sur lui-même.

Je pense que je veux faire quelque chose comme la subdivision proposée dans le premier lien, mais élagué pour les cases qui délimitent l'isoligne d'intérêt. Je pense que je devrais être capable de tirer parti de également, mais je ne sais pas comment aborder cela. N

meawoppl
la source
J'ai exactement le même problème, sauf que c'est une fonction de vraisemblance que je veux contourner et qu'elle est coûteuse car à chaque point j'ai besoin d'effectuer une minimisation. Avez-vous fait des progrès et / ou pouvez-vous nous expliquer comment vous vous y êtes finalement pris?
adavid
Je viens de vérifier la solution sur laquelle j'ai convergé. (voir ci-dessous)
meawoppl

Réponses:

4

Il existe un document en infographie appelé Provably Good Sampling and Meshing of Surfaces , qui s'appuie sur vous pour fournir un oracle qui détermine toutes les intersections d'une isoline avec un segment de ligne donné. Avec cela, il échantillonne tous les contours en supposant que vous pouvez fournir une échelle de caractéristique locale (quelque chose comme la courbure locale maximale), et un ensemble initial de segments de ligne qui intersecte tous les contours. Ce n'est pas la chose la plus simple à implémenter, car elle repose sur le calcul des triangulations de Delaunay, mais elle est implémentée en 3D dans CGAL . C'est beaucoup plus simple en 2D, car il existe un bon logiciel de triangulation comme Triangle . Dans un certain sens, c'est assez proche du meilleur que vous puissiez faire.

Victor Liu
la source
J'aime vraiment cette formulation car elle s'étend également logiquement en 3D plutôt proprement. Je dois formuler cela en Python, j'ai donc déjà accès à l'emballage Delauny de qhull, donc ce n'est pas un gros problème. Laissez-moi voir si j'ai bien compris ce résumé: - Faites un peu d'échantillonnage pour semer. - Trianguler les échantillons. - Pour toutes les arêtes qui s'étendent sur l'isoligne au-dessus d'une certaine longueur: calculer les intersections de l'isoligne avec l'arête - toutes les valeurs calculées pour les échantillons, et répéter à partir de l'étape de triangulation?
meawoppl
@meawoppl: Je n'ai pas personnellement implémenté ou utilisé cet algorithme (pour l'instant!) mais cela semble à peu près juste.
Victor Liu
Je vais l'essuyer aujourd'hui et publier des résultats!
meawoppl
Désolé pour le retard. Cette méthode fonctionne très bien pour mon ensemble de données. Fondamentalement, je le sème un maillage régulier à échantillonner pour commencer, puis triangule, subdivise les bords qui traversent l'iso-contour, la répétition. Il est un peu difficile d'exprimer l'exigence de la «caractéristique la plus fine», et il y a du mérite à un échantillonnage initial aléatoire vs, régulier car une isoligne diagonale prend un peu plus de temps que celle qui suit les tenances de l'échantillonnage. J'ai fini par le laisser prendre au maximum 5 passes, et cela a fonctionné comme un critère d'arrêt très simple. Wooo> 1K
meawoppl
1

Vous pouvez essayer d'appliquer les fonctionnalités de base de la méthode EGRA (Efficient Global Reliability Analysis). Cette méthode a été dérivée pour le calcul efficace d'une probabilité de défaillance, mais ses tripes se concentrent sur ce que vous décrivez - créer un modèle qui n'est précis que près d'un contour d'intérêt spécifique.

Cela pourrait être un point de départ intéressant, mais je ne suis pas sûr que cela résoudra votre problème. Cela dépend beaucoup de la forme de votre fonction. Si c'est quelque chose qui peut être bien approché avec un modèle de krigeage , alors il devrait bien fonctionner. Ces modèles sont assez flexibles, mais nécessitent généralement une fonction sous-jacente fluide. J'ai essayé d'appliquer EGRA à une application de segmentation d'image dans le passé, mais j'ai eu peu de succès car cela n'a tout simplement pas de sens d'adapter un modèle de substitution à quelque chose qui n'est pas vraiment défini par une relation fonctionnelle. Pourtant, je le mentionne comme quelque chose que vous voudrez peut-être examiner si votre application est différente de ce que j'envisage.

Si je ne vous en ai pas parlé, vous pouvez en savoir plus sur EGRA ici (lien PDF) et ici , et il existe une implémentation existante dans le projet DAKOTA de Sandia - à ma connaissance, la seule implémentation open source d'EGRA disponible.

Barron
la source