Réseaux de neurones convolutifs avec images d'entrée de différentes dimensions - Segmentation d'images

12

Je suis confronté au problème d'avoir des images de différentes dimensions comme entrées dans une tâche de segmentation. Notez que les images n'ont même pas le même rapport hauteur / largeur.

Une approche courante que j'ai trouvée en général dans l'apprentissage profond est de recadrer les images, comme cela est également suggéré ici . Cependant, dans mon cas, je ne peux pas recadrer l'image et garder son centre ou quelque chose de similaire car dans la segmentation, je veux que la sortie ait les mêmes dimensions que l'entrée.

Cet article suggère que dans une tâche de segmentation, on peut alimenter la même image plusieurs fois sur le réseau mais avec une échelle différente et ensuite agréger les résultats. Si je comprends bien cette approche, cela ne fonctionnerait que si toutes les images d'entrée ont le même rapport d'aspect. S'il vous plait corrigez moi si je me trompe.

Une autre alternative serait de simplement redimensionner chaque image à des dimensions fixes. Je pense que cela a également été proposé par la réponse à cette question. Cependant, il n'est pas spécifié de quelle manière les images sont redimensionnées.

J'ai envisagé de prendre la largeur et la hauteur maximales dans l'ensemble de données et de redimensionner toutes les images à cette taille fixe afin d'éviter la perte d'informations. Cependant, je pense que notre réseau peut avoir des difficultés avec les images déformées car les bords d'une image peuvent ne pas être clairs. Quelle est peut-être la meilleure façon de redimensionner vos images avant de les alimenter sur le réseau?

Y a-t-il une autre option que je ne connais pas pour résoudre le problème d'avoir des images de différentes dimensions?

De plus, laquelle de ces approches est la meilleure compte tenu de la complexité de calcul mais également de la perte possible de performances par le réseau?

J'apprécierais que les réponses à mes questions incluent un lien vers une source s'il y en a une. Je vous remercie.

MattSt
la source

Réponses:

4

Je donnerai une réponse plus approfondie.

Vous pouvez rencontrer 2 problèmes.

1) Votre réseau neuronal (dans ce cas, le réseau neuronal convolutionnel) ne peut pas accepter physiquement des images de résolutions différentes. C'est généralement le cas si l'on a des couches entièrement connectées, mais si le réseau est entièrement convolutif, il devrait pouvoir accepter des images de n'importe quelle dimension. Entièrement convolutif implique qu'il ne contient pas de couches entièrement connectées, mais uniquement des couches convolutives, de regroupement maximal et de normalisation par lots qui sont toutes invariantes à la taille de l'image. Exactement cette approche a été proposée dans cet article révolutionnaire Réseaux entièrement convolutionnels pour la segmentation sémantique . Gardez à l'esprit que leur architecture et leurs méthodes de formation pourraient être légèrement dépassées à l'heure actuelle. Une approche similaire a été utilisée dansU-Net: Réseaux convolutifs pour la segmentation d'images biomédicales et de nombreuses autres architectures pour la détection d'objets, l'estimation de pose et la segmentation.

2) Les réseaux de neurones convolutifs ne sont pas invariables à l'échelle. Par exemple, si l'on s'entraîne sur des chats de même taille en pixels sur des images de résolution fixe, le net échouerait sur des images de chats de tailles plus ou moins grandes. Afin de surmonter ce problème, je connais deux méthodes (peut-être plus dans la littérature): 1) la formation multi-échelle d'images de différentes tailles dans des réseaux entièrement convolutifs afin de rendre le modèle plus robuste aux changements d'échelle; et 2) ayant une architecture multi-échelles. Un point de départ est d'examiner ces deux articles notables: Réseaux de pyramides d'entités pour la détection d'objets et Représentations haute résolution pour l'étiquetage des pixels et des régions .

Anuar Y
la source
2

En supposant que vous ayez un grand ensemble de données et qu'il soit étiqueté au niveau des pixels, un moyen hacky de résoudre le problème est de prétraiter les images pour avoir les mêmes dimensions en insérant des marges horizontales et verticales selon vos dimensions souhaitées, comme pour les étiquettes, vous ajoutez une sortie supplémentaire factice pour les pixels de marge donc lors du calcul de la perte, vous pouvez masquer les marges.

Fadi Bakoura
la source
Comment gérer alors la normalisation dans ces cas? Normalisez-vous uniquement les pixels d'une image qui ne sont pas inclus dans sa marge, je suppose?
MattSt
Oui, car votre processus de génération de données a des tailles différentes, donc si vous incluez les marges, vous changerez la distribution des données. des marges sont insérées pour regrouper les échantillons d'apprentissage en lots car votre problème doit générer un vecteur de sortie fixe.
Fadi Bakoura
0

Je pense que ce document vous apportera des informations utiles.

Felix Goldberg
la source
Vous n'êtes pas censé donner des réponses de lien uniquement.
JohnnyApplesauce
0

Comme vous souhaitez effectuer la segmentation, vous pouvez utiliser U-Net. Il n'a pas d'unités entièrement connectées. Par conséquent, la taille de l'entrée n'aura pas d'importance.

ganLover
la source
3
Je pense que vous devriez approfondir un peu vos points.
DuttaA
0

je pense que vous pouvez redimensionner pixel votre image et convertir RVB en binaire ou entier pour la prochaine étape

Danny Lukmana
la source
1
Bonjour et bienvenue sur AI Stack Exchange. Pourriez-vous développer votre réponse? Pensez à ajouter plus de contexte pour sauvegarder votre réponse et peut-être à ajouter des références.
Jaden Travnik
0

Essayez de redimensionner l'image aux dimensions d'entrée de votre architecture de réseau neuronal (en la maintenant fixée à quelque chose comme 128 * 128 dans une architecture U-net 2D standard) en utilisant la technique d' interpolation du plus proche voisin . En effet, si vous redimensionnez votre image à l'aide d'une autre interpolation, cela peut entraîner une falsification des étiquettes de vérité au sol. C'est particulièrement un problème de segmentation. Vous ne rencontrerez pas un tel problème en matière de classement.

Essayez ce qui suit:

import cv2 
resized_image = cv2.resize(original_image, (new_width, new_height), 
                           interpolation=cv2.INTER_NEAREST)
Shalabh Gupta
la source