web-dev-qa-db-fra.com

méthode preprocess_input () dans keras

J'essaie un exemple de code keras de la page de documentation keras ci-dessous, https://keras.io/applications/

Quelle fonction preprocess_input(x) du module keras fait dans le code ci-dessous? Pourquoi devons-nous faire expand_dims(x, axis=0) avant que cela soit passé à la méthode preprocess_input()?

from keras.applications.resnet50 import ResNet50
from keras.preprocessing import image
from keras.applications.resnet50 import preprocess_input
import numpy as np

model = ResNet50(weights='imagenet')

img_path = 'elephant.jpg'
img = image.load_img(img_path, target_size=(224, 224))
x = image.img_to_array(img)
x = np.expand_dims(x, axis=0)
x = preprocess_input(x)

Existe-t-il une documentation avec une bonne explication de ces fonctions?

Merci!

17

Keras travaille avec des lots d'images. Ainsi, la première dimension est utilisée pour le nombre d'échantillons (ou d'images) que vous avez. 

Lorsque vous chargez une seule image, vous obtenez la forme d'une image, à savoir (size1,size2,channels).

Afin de créer un lot d'images, vous avez besoin d'une dimension supplémentaire: (samples, size1,size2,channels)

La fonction preprocess_input est conçue pour adapter votre image au format requis par le modèle. 

Certains modèles utilisent des images avec des valeurs allant de 0 à 1. D'autres de -1 à +1. D'autres utilisent le style "caffe", qui n'est pas normalisé, mais centré.

À partir du code source , Resnet utilise le style caffe. 

Vous n'avez pas à vous soucier des détails internes de preprocess_input. Mais idéalement, vous devriez charger les images avec les fonctions keras pour cela (vous garantissez ainsi que les images que vous chargez sont compatibles avec preprocess_input). 

27
Daniel Möller

Cela charge une image et la redimensionne à (224, 224):

 img = image.load_img(img_path, target_size=(224, 224))

La fonction img_to_array () ajoute des canaux: x.shape = (224, 224, 3) pour RGB et (224, 224, 1) pour une image grise

 x = image.img_to_array(img) 

expand_dims() est utilisé pour ajouter le nombre d'images: x.shape = (1, 224, 224, 3):

x = np.expand_dims(x, axis=0)

preprocess_input soustrait les canaux RVB moyens du jeu de données imagenet. En effet, le modèle que vous utilisez a été formé sur un jeu de données différent: x.shape est toujours (1, 224, 224, 3)

x = preprocess_input(x)

Si vous ajoutez x à un tableau images, à la fin de la boucle, vous devez ajouter images = np.vstack(images) pour obtenir (n, 224, 224, 3) comme valeur de dim des images, où n est le nombre d'images traitées

0
Dany Kamuhanda