openspyrit / spyrit

A Python toolbox for deep image reconstruction, with emphasis on single-pixel imaging.
https://spyrit.readthedocs.io/en/master
GNU Lesser General Public License v3.0
41 stars 15 forks source link

sampling masks #207

Closed nducros closed 4 months ago

nducros commented 4 months ago

J'ai fusionné les différentes branches et tout me semble OK. Dans le tuto 5, j'ai essayé de créer les "naive" et "variance" sampling masques de la même façon

idx = np.argsort(Ord_nai.ravel(), axis=None)[::-1]
mask_nai = np.zeros_like(Ord_nai)
mask_nai.flat[idx[0:M]] = 1

mais j'obtiens un masque bizarre, ce que tu solutionnes avec

mask_nai = np.zeros((h, h))
mask_nai[0 : int(M / h), :] = 1

Je ne suis pas arrivé à voir si le sampling masque correspond bien à la sampling matrix plus bas, mais je soupçonne un petit bug quelque part. Je ne demande si la recette "np.argsort + np.zeros_like + flat" est identique à ce qui est fait dans le meas.

romainphan commented 4 months ago

Le problème vient du np.argsort(), qui utilise par défaut un quicksort, qui ne conserve pas l'ordre quand il y a plusieurs valeurs égales. Il faut donc écrire :

idx = np.argsort(-Ord_nai.ravel(), axis=None, kind='stable') mask_nai = np.zeros_like(Ord_nai) mask_nai.flat[idx[0:M]] = 1

en précisant kind=stable on perd un peu en vitesse mais on garde l'ordre dans les mesures.

à noter la différence qu'on doit écrire -Ord_nai.ravel() contrairement à Ord_nai.ravel() ... [::-1]. Pour le "variance subsampling" ça devient donc : idx = np.argsort(-Ord_var.ravel(), axis=None, kind='stable')

nducros commented 4 months ago

D'accord, j'ai fusionné ! Le mieux serait d'ajouter une fonction sampling_mask, ou quelque chose du genre, pour masquer ça à l'utilisateur.

romainphan commented 4 months ago

Hehe c'est déjà fait, c'est ma fonction sort_by_significance J'ai modifié tout ça dans ma dernière version sur ma branche

romainphan commented 4 months ago

Tout fonctionne, à fusionner sur le master