94 votes

comment formater les données d'image pour la formation/prédiction lorsque les images sont de taille différente ?

J'essaie d'entraîner mon modèle de classification d'images. Le problème que j'ai est qu'elles ont des tailles différentes. Comment dois-je formater mes images ou l'architecture du modèle ?

2 votes

Veuillez indiquer ce que vous avez essayé jusqu'à présent et ce qui semble ne pas fonctionner pour vous.

16 votes

Et bam, voilà le code d'Inception v4. Je ne suis pas d'accord avec ce commentaire sur le prêt-à-porter. Un peu plus d'informations seraient bienvenues - comme le type de réseau dont nous parlons - mais les votes négatifs ne sont pas du tout justifiés. Ce est un vrai problème là-bas.

4 votes

La question est de savoir comment ImageNet formate ses données d'image pour qu'elles soient utiles à la formation.

156voto

Markus Points 933

Vous n'avez pas dit de quelle architecture vous parlez. Puisque tu as dit que tu voulais classifier des images, je suppose qu'il s'agit d'un réseau partiellement convolutif, partiellement entièrement connecté comme AlexNet, GoogLeNet, etc. En général, la réponse à votre question dépend du type de réseau avec lequel vous travaillez.

Si, par exemple, votre réseau ne contient que des unités convolutionnelles - c'est-à-dire qu'il ne contient pas de couches entièrement connectées - il peut être invariant par rapport à la taille de l'image d'entrée. Un tel réseau pourrait traitent les images d'entrée et renvoient à leur tour une autre image ("convolutional all the way") ; vous devrez vous assurer que la sortie correspond à ce que vous attendez, puisque vous devez déterminer la perte d'une manière ou d'une autre, bien sûr.

Mais si vous utilisez des unités entièrement connectées, vous risquez d'avoir des problèmes : Dans ce cas, le réseau doit travailler avec un nombre fixe de poids appris, de sorte que des entrées variables nécessiteraient un nombre variable de poids, ce qui n'est pas possible.

Si tel est votre problème, voici ce que vous pouvez faire :

  • Il n'est pas nécessaire d'écraser les images. Un réseau pourrait apprendre à donner un sens au contenu de toute façon ; l'échelle et la perspective ont-elles un sens pour le contenu ?
  • Recadrez les images à une taille spécifique. Si vous craignez de perdre des données, effectuez plusieurs recadrages et utilisez-les pour augmenter vos données d'entrée, de sorte que l'image originale soit divisée en N différentes images de taille correcte.
  • Tamponnez les images avec une couleur unie pour obtenir une taille carrée, puis redimensionnez-les.
  • Faites une combinaison de tout cela.

L'option de remplissage pourrait introduire une source d'erreur supplémentaire dans la prédiction du réseau, car le réseau pourrait (lire : probablement) être biaisé par les images qui contiennent une telle bordure rembourrée. Si vous avez besoin d'idées, jetez un coup d'œil à l'application Images de la documentation TensorFlow, il y a des éléments comme resize_image_with_crop_or_pad qui enlèvent le plus gros du travail.

Quant au fait de ne pas se soucier de l'écrasement, voici une partie du pipeline de prétraitement du célèbre réseau Inception :

# This resizing operation may distort the images because the aspect
# ratio is not respected. We select a resize method in a round robin
# fashion based on the thread number.
# Note that ResizeMethod contains 4 enumerated resizing methods.

# We select only 1 case for fast_mode bilinear.
num_resize_cases = 1 if fast_mode else 4
distorted_image = apply_with_random_selector(
    distorted_image,
    lambda x, method: tf.image.resize_images(x, [height, width], method=method),
    num_cases=num_resize_cases)

Ils en sont totalement conscients et le font quand même.

Selon la distance que vous voulez ou devez parcourir, il existe en fait un papier aquí appelé Mise en commun des pyramides spatiales dans les réseaux à convolution profonde pour la reconnaissance visuelle qui gère des entrées de tailles arbitraires en les traitant d'une manière très spéciale.

12 votes

Ce sujet semble beaucoup plus compliqué lorsqu'il s'agit de détection d'objets et de segmentation d'instances, car les tailles des boîtes d'ancrage, qui sont également des hyperparamètres, doivent être ajustées si vous disposez d'un ensemble de données présentant une grande variance dans la taille des images.

0 votes

Les rapports d'aspect jouent un rôle assez important pour un réseau qui doit faire la distinction entre les cercles et les ellipses.

0 votes

C'est vrai, mais vous pouvez fournir le rapport d'aspect original lui-même comme entrée au réseau et/ou utiliser des transformations apprises (par exemple, les réseaux de transformateurs spatiaux). Pendant l'apprentissage, le regroupement en lots rembourrés peut fonctionner, mais c'est essentiellement la même chose que le redimensionnement correct de l'aspect dans un cadre plus grand.

11voto

Pranay Mukherjee Points 134

Essayez de faire une couche de mise en commun de la pyramide spatiale. Placez-la ensuite après votre dernière couche de convolution afin que les couches FC reçoivent toujours des vecteurs de dimension constante en entrée. Pendant l'entraînement, entraînez les images de l'ensemble des données en utilisant une taille d'image particulière pour une époque. Puis pour l'époque suivante, passez à une taille d'image différente et continuez l'entraînement.

0 votes

Pourriez-vous préciser ce qu'est la "mise en commun pyramidale spatiale" par rapport à la mise en commun ordinaire ?

0 votes

Veuillez lire le document intitulé "Spatial pyramid pooling in deep convolutional networks for visual recognition" (mise en commun des pyramides spatiales dans les réseaux convolutifs profonds pour la reconnaissance visuelle) en anglais. blog.acolyer.org/2017/03/21/convolution-neural-nets-part-2 @Matthieu

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X