webentwicklung-frage-antwort-db.com.de

preprocess_input () -Methode in Keras

Ich probiere den keras-Beispielcode von der unten stehenden keras-Dokumentationsseite aus https://keras.io/applications/

Welche preprocess_input(x)-Funktion des keras-Moduls hat der folgende Code? Warum müssen wir expand_dims(x, axis=0) tun, bevor das an die preprocess_input()-Methode übergeben wird?

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)

Gibt es eine Dokumentation mit einer guten Erklärung dieser Funktionen?

Vielen Dank!

17

Keras arbeitet mit Bildstapeln. Die erste Dimension wird also für die Anzahl der Proben (oder Bilder) verwendet. 

Wenn Sie ein einzelnes Bild laden, erhalten Sie die Form eines Bildes, nämlich (size1,size2,channels).

Um einen Stapel von Bildern erstellen zu können, benötigen Sie eine zusätzliche Dimension: (samples, size1,size2,channels)

Die preprocess_input-Funktion soll Ihr Bild dem Format anpassen, das das Modell benötigt. 

Einige Modelle verwenden Bilder mit Werten zwischen 0 und 1. Andere von -1 bis +1. Andere verwenden den "caffe" -Stil, der nicht normalisiert ist, sondern zentriert ist.

Aus dem Quellcode verwendet Resnet den Caffe-Stil. 

Sie müssen sich nicht um die internen Details von preprocess_input kümmern. Idealerweise sollten Sie jedoch Bilder mit den Keras-Funktionen laden, um sicherzustellen, dass die geladenen Bilder mit preprocess_input kompatibel sind. 

27
Daniel Möller

Dadurch wird ein Bild geladen und seine Größe auf (224, 224) geändert:

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

Die Funktion img_to_array () fügt Kanäle hinzu: x.shape = (224, 224, 3) für RGB und (224, 224, 1) für graues Bild

 x = image.img_to_array(img) 

expand_dims() wird verwendet, um die Anzahl der Bilder hinzuzufügen: x.shape = (1, 224, 224, 3):

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

preprocess_input subtrahiert die mittleren RGB-Kanäle des Imagenet-Datasets. Dies liegt daran, dass das von Ihnen verwendete Modell an einem anderen Datensatz trainiert wurde: x.shape ist noch (1, 224, 224, 3)

x = preprocess_input(x)

Wenn Sie einem Array ximages hinzufügen, müssen Sie am Ende der Schleife images = np.vstack(images) hinzufügen, damit Sie (n, 224, 224, 3) als Dim der Bilder erhalten, wobei n die Anzahl der verarbeiteten Bilder ist

0
Dany Kamuhanda