[PYTHON] Faire durer le premier canal de données au canal

introduction

Lors de la réécriture du programme écrit sur les prémisses de Pytorch vers Keras, il était nécessaire de changer les axes du tableau de données d'image, donc je vais partager la méthode.

Image Channel Order

Channels First : (N, C, H, W) ← PyTorch Channels Last : (N, H, W, C) ← Keras

** N **: Nombre d'images ** C **: Nombre de canaux (couleur, etc.) ** H **: Hauteur de l'image ** W **: Largeur de l'image

Les chaînes d'abord

Lors de l'entraînement d'un modèle avec un tableau de données d'image tel que PyTorch, le format ** Channels First ** est courant. L'ordre des dimensions de l'image est ** (canal, hauteur, largeur) **. Vous pouvez dire d'après le nom que la dimension Channel (Color) se trouve au début du tableau.

Chaînes en dernier

Lorsqu'il s'agit de tableaux de données d'image dans Keras, PIL, OpenCV, etc., le format ** Channels Last ** est courant. L'ordre des dimensions de l'image est ** (Hauteur, Largeur, Canal) **. Vous pouvez dire à partir du nom que la dimension Channel est à la fin du tableau.

Channels First → Channels Last

Créez un tableau d'images temporaires ** Channels First **

Données de matrice d'images temporaires


img = np.arange(100*64*64*3).reshape(-1,3,64,64)
img.shape 
(100, 3, 64, 64)

Méthode 1: np.transpose ()

np.transpose()


%%timeit
img.transpose(0,2,3,1).shape
(100, 64, 64, 3)
791 ns ± 92.8 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

Méthode 2: np.swapaxes ()

np.swapaxes()


%%timeit
np.swapaxes(img, 1, 3).shape
(100, 64, 64, 3)
1.54 µs ± 410 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

Méthode 3: np.moveaxes ()

np.moveaxes()


%%timeit
np.moveaxes(img, 1, 3).shape
(100, 64, 64, 3)
9.29 µs ± 956 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

Méthode 4: np.rollaxes ()

np.rollaxes()


%%timeit
np.rollaxes(img, 1, 4).shape
(100, 64, 64, 3)
2.89 µs ± 358 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

Méthode 5: np.einsum ()

np.einsum()


%%timeit
np.einsum('ijkl->ilkj', img).shape
(100, 64, 64, 3)
1.77 µs ± 210 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

finalement

np.transpose () était le plus rapide. Veuillez utiliser celui que vous aimez.

[quelle-est-la-bonne-façon-de-changer-l'ordre-de-canal-d'image-entre-canaux-d'abord](https://stackoverflow.com/questions/43829711/what-is-the-correct-way- Je me suis référé à-changer-image-channel-ordering-between-channels-first).

Recommended Posts

Faire durer le premier canal de données au canal
Première analyse de données satellitaires par Tellus