nicolasdonati/DUO-FM

vts data issue

Closed this issue · 3 comments

Hi,

First of all, thanks for sharing your great work. I have been working on shape correspondence for quite some time and I have never seen the remeshed .vts files to have the same size of the original meshes. As if we have a mesh with 5200 vertices, the .vts file must be 5200, not 6890. This is the case for other research almost common in all. In this way, I cannot calculate the correspondence using the knn search in descriptor space since I get a dimensionality error. Can you please clarify why the dimension does not match?

For your reference: https://github.com/nmwsharp/discretization-robust-correspondence-benchmark/tree/main/data

Hi,

Thanks a lot for the interest :)
So, vts files actually hold maps between shapes and a template.
For instance, shape_i.vts holds the map template --> shape_i
Therefore, if we chose 5k points on template, vts files will be with 5k points. That is the case for FAUST_r, SCAPE_r
On FAUST_a, SCAPE_a, the template is original meshes with all their points (6890 as you pointed out). So shape_i can have n_i points, with n_i not constant with i, but vts_i will always be 6890 points.

Now, to recover mappings and errors:
Given shape_i, shape_j, a simple way to recover the functional map is:
C = pseudo_inv (shape_i.eig[vts_i]) @ shape_j.eig[vts_j]
then you can recover the pointwise map from C (for that use at least 100-200 eigenvectors if you want precise maps)

For error evaluation, if you have a distance matrix D_i for shape i, and a map j --> i simply get
error = D_i[vts_i, map[vts_j]]

I hope that answers your questions :)
Don't hesitate to ask if this is unclear,

Many thanks

Thanks a lot for your reply. I'm afraid I cannot still understand. So I am not solving a functional map per se. I use some graph NN algorithm, let's say something like SplineCNN, then I produce some descriptor n*256. n here is the number of vertices. The. to get the correspondence, I compute T12 using knn search. Then based on ground truth vts files (lmk1 lmk2), I use this "get_err12 = @(T12) min([fMAP.eval_pMap(S1, S2, T12, [lmk1,lmk2])" to come up with geodesic errors. But, the problem is vts files are not consistent with size of meshes (faust_a has different dimensions while vts files are all 6890)

Hi,
I think the NN search will still work even in your setting and these vts files (You got T12 using knn search).
Then to get the error, you have to compare between T12 and some kind of ground truth. here the lmk1, lmk2 will be used as a ground truth to compare corresponding points via the original template.
I don't really remember how matlab code evaluates using fMAP.eval_pMap, maybe you can tweak the code to return
the geodesic distance like I described: error = geo_dist2[lmk2, T12[lmk1]]
Notice that this should not return an error since you will search for 6890 pairs of value in the geodistance matrix of the shape.
(In the eval.py file of this code the implementation works like this).

I hope that helps !