2017-09-27 2 views
1

Dans Numpy, donné une pile de grandes images A de size(N,hl,wl), et les coordonnées x de taille (N) et y de taille (N) Je veux obtenir des images plus petites de taille (N, 16 , 16)NumPy/PyTorch extrait des sous-ensembles d'images

Dans une boucle, il ressemblerait à ceci:

B=numpy.zeros((N,16,16)) 
for i in range(0,N): 
    B[i,:,:]=A[i,y[i]:y[i]+16,x[i]:x[i]+16] 

Mais puis-je faire cela juste avec l'indexation? Question supplémentaire: Est-ce que cette indexation fonctionnera également en pytorch? Si non comment puis-je implémenter cela là?

+0

L'une ou l'autre des solutions proposées a-t-elle fonctionné pour vous? – Divakar

+0

Oui, ils sont tous les deux bons, mais le vôtre suppose des tranches différentes pour chaque échantillon qui était ce que je cherchais. HArder passer à la torche, mais sans boucler sur des échantillons. tensorflow a une fonction extract_glimpses qui fonctionne pour l'instant, mais :) – Aleksk89

Répondre

0

Assez simple vraiment avec view_as_windows from scikit-image, pour obtenir ces vues fenêtrées coulissantes comme un tableau 6D avec le quatrième axe étant singleton. Ensuite, utilisez advanced-indexing pour sélectionner ceux que nous voulons en fonction des index y et x pour indexation dans les deuxième et troisième axes du tableau fenêtré pour obtenir notre B.

Par conséquent, la mise en œuvre serait -

from skimage.util.shape import view_as_windows 

BSZ = 16, 16 # Blocksize 
A6D = view_as_windows(A,(1,BSZ[0],BSZ[1])) 
B_out = A6D[np.arange(N),y,x,0] 

Explication

expliquer à d'autres lecteurs sur ce qui se passe vraiment sur le problème, voici un échantillon analysé sur un ensemble de données plus petit et avec un blocksize de (2,2) -

1) tableau d'entrée (3D):

In [78]: A 
Out[78]: 
array([[[ 5, 5, 3, 5, 3, 8], 
     [ 5, *2, 6, 2, 2, 4], 
     [ 4, 3, 4, 9, 3, 8], 
     [ 6, 3, 3, 10, 4, 5], 
     [10, 2, 5, 7, 6, 7], 
     [ 5, 4, 2, 5, 2, 10]], 

     [[ 4, 9, 8, 4, 9, 8], 
     [ 7, 10, 8, 2, 10, 9], 
     [10, *9, 3, 2, 4, 7], 
     [ 5, 10, 8, 3, 5, 4], 
     [ 6, 8, 2, 4, 10, 4], 
     [ 2, 8, 6, 2, 7, 5]], 

     [[ *4, 8, 7, 2, 9, 9], 
     [ 2, 10, 2, 3, 8, 8], 
     [10, 7, 5, 8, 2, 10], 
     [ 7, 4, 10, 9, 6, 9], 
     [ 3, 4, 9, 9, 10, 3], 
     [ 6, 4, 10, 2, 6, 3]]]) 

2) indices y et x pour indexer dans les deuxième et troisième axes:

In [79]: y 
Out[79]: array([1, 2, 0]) 

In [80]: x 
Out[80]: array([1, 1, 0]) 

3) Enfin, la sortie désirée, ce qui est un bloc chacun de chacune des tranches 2D le long du premier axe et dont Le point de départ (point en haut à gauche) est (y,x) sur cette tranche 2D. Veuillez vous référer aux astérisques A pour ceux -

In [81]: B 
Out[81]: 
array([[[ 2, 6], 
     [ 3, 4]], 

     [[ 9, 3], 
     [10, 8]], 

     [[ 4, 8], 
     [ 2, 10]]]) 
1

En tranchage numpy est très simple et la même logique fonctionne avec un exemple pytorch. Par exemple

imgs = np.random.normal(size=(16,24,24)) 
imgs[:,0:12,0:12].shape 
imgs_tensor = torch.from_numpy(imgs) 
imgs_tensor[:,0:12,0:12].size() 

où la première : dans le découpage en tranches indique pour sélectionner toutes les images dans le lot. Les 2ème et 3ème : indiquent le découpage en hauteur et en largeur.

+0

merci. Mais était à la recherche de ce qui se passe quand vous voulez faire glisser différentes régions pour chaque image – Aleksk89

+0

Regardez-vous torchvision.transforms.RandomCrop –