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

87

J'essaye de former mon modèle qui classe les images. Le problème que j'ai, c'est qu'ils ont des tailles différentes. comment formater mes images / ou mon architecture de modèle?

Asif Mohammed
la source
2
Veuillez montrer ce que vous avez essayé jusqu'à présent et ce qui semble ne pas fonctionner pour vous.
Keith John Hutchison
16
Et bam il y a le code d'Inception v4. Je ne suis pas d'accord avec ce commentaire standard. Un peu plus d'entrée serait bien - comme le type de réseau dont nous parlons - mais les votes négatifs ne sont pas du tout justifiés. C'est un vrai problème.
dimanche
4
La question est de savoir comment ImageNet formate leurs données d'image pour être utiles pour la formation?
mskw

Réponses:

147

Vous n'avez pas dit de quelle architecture vous parlez. Puisque vous avez dit que vous vouliez classer les images, je suppose que c'est un réseau en partie convolutif, en partie 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 convolutives - c'est-à-dire ne contient pas de couches entièrement connectées - il peut être indifférent à la taille de l'image d'entrée. Un tel réseau pourrait traiter les images d'entrée et à son tour renvoyer une autre image ("convolutionnel all the way"); vous devrez vous assurer que la sortie correspond à ce que vous attendez, car vous devez bien sûr déterminer la perte d'une manière ou d'une autre.

Cependant, si vous utilisez des unités entièrement connectées, vous avez des problèmes: vous avez ici un nombre fixe de poids appris avec lesquels votre réseau doit travailler, donc des entrées variables nécessiteraient un nombre variable de poids - et ce n'est pas possible.

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

  • Ne vous souciez pas d'écraser les images. Un réseau peut de toute façon apprendre à donner un sens au contenu; est-ce que l'échelle et la perspective signifient quoi que ce soit pour le contenu?
  • Centrez 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 d'origine soit divisée en Ndifférentes images de taille correcte.
  • Remplissez les images avec une couleur unie à une taille carrée, puis redimensionnez.
  • Faites une combinaison de cela.

L'option de remplissage peut introduire une source d'erreur supplémentaire dans la prédiction du réseau, car le réseau pourrait (lire: sera probablement) biaisé vers des images qui contiennent une telle bordure remplie. Si vous avez besoin d'idées, jetez un œil à la section Images de la documentation TensorFlow, il y a des éléments comme resize_image_with_crop_or_padcelui-là qui enlèvent le plus gros travail.

Pour ce qui est de ne pas vous soucier de l'écrasement, voici un morceau 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.

En fonction de la distance que vous voulez ou besoin d'aller, il est en fait un document ici appelé Pooling pyramide spatiale dans les réseaux profonds pour la reconnaissance visuelle Convolution que les entrées poignées de tailles arbitraires en les traitant d'une manière très spéciale.

côté soleil
la source
11
Ce sujet semble beaucoup plus compliqué lorsque vous avez affaire à la détection d'objets et à la segmentation d'instances, car les tailles de boîte d'ancrage qui sont également des hyperparamètres doivent être ajustées si vous avez un ensemble de données avec une grande variance de tailles d'image.
CMCDragonkai
Les rapports d'aspect jouent un rôle assez important pour un réseau qui permet de distinguer les cercles et les ellipses.
HelloGoodbye
1
Une autre observation générale est que les lots ne doivent pas nécessairement avoir les mêmes dimensions; le premier lot pourrait traiter des images 4: 3, le second 16: 9, etc., à condition que les couches denses soient prises en charge.
soleil du
1
@Tobitor, rendez toujours les entrées du réseau aussi proches que possible des données réelles (test ou inférence). Si toutes vos images sont beaucoup plus larges que hautes, vous devez également modéliser votre réseau pour traiter vos images de cette manière. Cela dit, si vous ne pouvez pas dire à quoi ressembleront vos données "d'utilisation", vous devez faire des sacrifices pendant l'entraînement. Et dans ce cas, redimensionner une image de 1000x200 à 256x256 est généralement acceptable (imaginez que vous regardez cette plaque d'immatriculation à un angle de 60 degrés - elle est très à peu près carrée maintenant).
soleil le
2
@Tobitor Il n'y a aucune exigence pour que les images soient carrées, c'est juste le compromis le moins mauvais si vous ne connaissez pas la taille réelle des images lors de l'inférence. : ^) En ce qui concerne la taille, le plus petit sera le mieux, mais les images doivent être suffisamment grandes pour capturer les détails les plus fins - d'une manière générale, gardez simplement à l'esprit que si vous, en tant qu'expert humain, ne pouvez pas déterminer ce qu'il y a dans le image, le réseau ne pourra pas non plus.
soleil
11

Essayez de créer une couche de regroupement de pyramides spatiales. Ensuite, placez-le après votre dernière couche de convolution afin que les couches FC obtiennent toujours des vecteurs dimensionnels constants en entrée. Pendant la formation, entraînez les images de l'ensemble de données en utilisant une taille d'image particulière pour une époque. Ensuite, pour la prochaine époque, passez à une taille d'image différente et continuez la formation.

Pranay Mukherjee
la source
Pourriez-vous expliquer un peu ce qu'est la «mise en commun de la pyramide spatiale» par rapport à la mise en commun classique?
Matthieu
veuillez lire la mise en commun de la pyramide spatiale dans les réseaux convolutifs profonds pour la reconnaissance visuelle dans blog.acolyer.org/2017/03/21/convolution-neural-nets-part-2 @Matthieu
Asif Mohammed