web-dev-qa-db-fra.com

Comment former des images pour la classification, quand elles ont une taille différente?

J'essaie de former mon modèle qui classe les images. Le problème que j'ai est, ils ont des tailles différentes. Est-il possible de former ces images sans les redimensionner?.

75
Asif Mohammed

Vous n'avez pas dit de quelle architecture vous parlez. Puisque vous avez dit que vous vouliez classifier les images, je suppose que c'est un réseau partiellement convolutif, partiellement 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 invariant par rapport à l'image d'entrée Taille. Un tel réseau pourrait traiter les images en entrée et renvoyer à son tour une autre image ("tout au long de la convolution"); vous devez vous assurer que le résultat correspond à ce que vous attendez, car vous devez déterminer la perte d'une manière ou d'une autre, bien sûr.

Toutefois, 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, de sorte que des entrées différentes nécessitent un nombre différent de poids - et ce n'est pas possible.

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

  • Ne vous souciez pas d'écraser les images. Un réseau peut apprendre à comprendre le contenu de toute façon; L'échelle et la perspective signifient-elles quelque chose au contenu?
  • Découpez au centre les images à une taille spécifique. Si vous craignez de perdre des données, effectuez plusieurs cultures et utilisez-les pour augmenter vos données d'entrée, de sorte que l'image d'origine soit divisée en N différentes images de taille correcte.
  • Pad les images avec une couleur unie à une taille carrée, puis redimensionner.
  • 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: le sera probablement) biaisé pour les images contenant une telle bordure de remplissage. Si vous avez besoin d’idées, jetez un coup d’œil à la section Images de la documentation de TensorFlow. Il existe des éléments tels que resize_image_with_crop_or_pad qui enlèvent le travail le plus important.

En ce qui concerne juste ne vous souciez pas d'écraser, 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.

Selon la distance que vous souhaitez ou devez parcourir, il existe en réalité un document ici appelé Mise en pool de pyramides spatiales dans des réseaux de convolution profonde pour la reconnaissance visuelle qui gère les entrées de tailles arbitraires en les traitant de manière très spéciale.

133
sunside

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 reçoivent toujours en entrée des vecteurs dimensionnels constants. Pendant la formation, entraînez les images de l'ensemble de données complet en utilisant une taille d'image particulière pour une époque. Ensuite, pour la période suivante, passez à une taille d'image différente et continuez votre entraînement.

10
Pranay Mukherjee