Comment préparer / augmenter les images pour le réseau de neurones?

41

J'aimerais utiliser un réseau de neurones pour la classification des images. Je vais commencer par préparer CaffeNet et le former pour mon application.

Comment dois-je préparer les images d'entrée?

Dans ce cas, toutes les images sont du même objet mais avec des variations (pensez: contrôle de qualité). Ils sont à des échelles / résolutions / distances / conditions d'éclairage quelque peu différentes (et dans de nombreux cas, je ne connais pas l'échelle). De plus, chaque image comporte une zone (connue) autour de l’objet d’intérêt qui doit être ignorée par le réseau.

Je pourrais (par exemple) rogner le centre de chaque image, ce qui garantit de contenir une partie de l'objet d'intérêt et aucune partie de la zone ignorée; mais il semble que cela jetterait des informations, et les résultats ne seraient pas vraiment à la même échelle (peut-être une variation de 1,5x).

Augmentation du jeu de données

J'ai entendu parler de la création de plus de données d'entraînement par recadrage aléatoire / miroir / etc., existe-t-il une méthode standard pour cela? Des résultats sur l’amélioration de la précision du classificateur?

Alex I
la source

Réponses:

35

L’idée des réseaux neuronaux est qu’ils ne nécessitent que peu de pré-traitement, car l’algorithme, qui est chargé de l’apprentissage des fonctionnalités, fait le gros du travail.

Les lauréats du Data Science Bowl 2015 ont une excellente rédaction en ce qui concerne leur approche. La majeure partie du contenu de cette réponse a été empruntée à: Classifier le plancton avec des réseaux neuronaux profonds . Je vous suggère de le lire, en particulier la partie sur le pré-traitement et l’augmentation des données .

- Redimensionner les images

En ce qui concerne différentes tailles, résolutions ou distances, vous pouvez effectuer les opérations suivantes. Vous pouvez simplement redimensionner le plus grand côté de chaque image à une longueur fixe.

Une autre option consiste à utiliser openCV ou scipy. et cela redimensionnera l'image pour avoir 100 colonnes (largeur) et 50 lignes (hauteur):

resized_image = cv2.resize(image, (100, 50)) 

Une autre option consiste à utiliser le module scipy, en utilisant:

small = scipy.misc.imresize(image, 0.5)

- Augmentation de données

L'augmentation des données améliore toujours les performances bien que la quantité dépende du jeu de données. Si vous souhaitez augmenter les données pour augmenter artificiellement la taille du jeu de données, vous pouvez procéder comme suit (le cas suivant ne s'applique pas) mais pas si vous les retournez comme un miroir):

  • rotation: aléatoire avec angle compris entre 0 ° et 360 ° (uniforme)
  • translation: aléatoire avec décalage entre -10 et 10 pixels (uniforme)
  • redimensionnement: aléatoire avec un facteur d'échelle compris entre 1 / 1,6 et 1,6 (log-uniforme)
  • retournement: oui ou non (bernoulli)
  • cisaillement: aléatoire avec angle compris entre -20 ° et 20 ° (uniforme)
  • stretching: aléatoire avec un facteur d'étirement compris entre 1 / 1,3 et 1,3 (log-uniform)

Vous pouvez voir les résultats sur les images du bol Data Science.

Images pré-traitées

Images pré-traitées

versions augmentées des mêmes images

entrez la description de l'image ici

-Autres techniques

Celles-ci traiteront d'autres propriétés d'image telles que l'éclairage et sont déjà liées à l'algorithme principal, plutôt qu'à une simple étape de prétraitement. Consultez la liste complète sur: UFLDL Tutorial

Wacax
la source
1
La couleur vaut également la peine d’être examinée pour l’augmentation des données.
David C. Bishop
Pouvez-vous également partager le code pour la rotation et le cisaillement, etc.? @wacax
Arsenal Fanatic
Vous pouvez utiliser un paquet tel que keras pour l’augmentation des données.
Ricardo Cruz
2
Pour tous ceux qui ont des problèmes d’importation du module scipy.misc. Vous devez import scipy.misc. stackoverflow.com/questions/13581593/…
eleijonmarck le
En ce qui concerne le redimensionnement des images, quelle méthode est habituellement utilisée dans les méthodes de pointe, par exemple celles utilisées sur ImageNet?
HelloGoodbye
2

Bien que la réponse de wacax soit complète et très explicative, je voudrais ajouter quelques éléments au cas où quelqu'un trébucherait sur cette réponse.

Tout d' abord, la plupart des scipy.miscfonctions connexes d'image ( imread, imsave, imresizeerc) sont devenus dépréciée en faveur de l'une ou l' autre ImageIO ou skimage .

Deuxièmement, je recommanderais fortement la bibliothèque python imgaug pour toute tâche d’augmentation. Il est vraiment facile à utiliser et dispose de pratiquement toutes les techniques d'augmentation que vous pourriez souhaiter utiliser.

John Doe
la source