1

Ich versuche, die Hundezucht-Identifikation mit CNN zu kategorisieren. Ich habe die Bilder in Graustufen umgewandelt und sie neu skaliert, um kleiner zu sein. So, jetzt versuche ich, sie in einer Reihe hinzuzufügen und das Training zu machen. Ich werde auch Relu Aktivierungsfunktion verwenden, weil es gut mit Multi Layer und einer kategorischen Kreuzentropie für die verschiedenen Kategorien der Hundezucht funktioniert.Bild in Array für CNN konvertieren

Unten ist der Code für Graustufen- und Re-Skala:

def RescaleGrayscaleImg(): 

    # iterate through the names of contents of the folder 
    for image_path in os.listdir(path): 

     # create the full input path and read the file 
     input_path = os.path.join(path, image_path) 

     # make image grayscale 
     img = io.imread(input_path) 
     img_scaled = rescale(img, 2.0/4.0) 
     GrayImg = color.rgb2gray(img_scaled) 

     # create full output path, 'example.jpg' 
     # becomes 'grayscaled_example.jpg', save the file to disk 
     fullpath = os.path.join(outPath, 'grayscaled_'+image_path) 
     misc.imsave(fullpath, GrayImg) 

Wie ich die Bilder zu Array konvertieren? Jede Spalte wird ein Bild sein? Jede Hilfe wird hilfreich sein.

+0

Also was ist deine Frage? – Drop

+0

Welche Pakete benutzen Sie? – James

+0

Ich benutze keras, scipy und skimage, os –

Antwort

2

Für CNN muss Ihr Eingang ein 4-D Tensor sein [batch_size, width, height, channels], so dass jedes Bild ein 3-D Sub-Tensor ist. Da Ihre Bilder Graustufen sind, channels=1. Auch für das Training müssen alle Bilder gleich groß sein - WIDTH und HEIGHT.

Die skimage.io.imread gibt eine ndarray zurück, und das funktioniert perfekt für keras. So können Sie die Daten wie folgt lesen:

all_images = [] 
for image_path in os.listdir(path): 
    img = io.imread(input_path, as_grey=True) 
    img = img.reshape([WIDTH, HEIGHT, 1]) 
    all_images.append(img) 
x_train = np.array(all_images) 

nicht sicher, wie Sie die Etiketten speichern, aber Sie werden auch eine Reihe von Etiketten vornehmen müssen. Ich nenne es y_train. Sie können es zu einem heißen wie folgt konvertieren:

y_train = keras.utils.to_categorical(y_train, num_classes) 

Das Modell in keras ist ziemlich straighforward, hier ist die einfachste (verwendet relu und x-Entropie):

model = Sequential() 
model.add(Conv2D(32, kernel_size=(3, 3), activation='relu', 
       input_shape=[WIDTH, HEIGHT, 1])) 
model.add(Conv2D(64, (3, 3), activation='relu')) 
model.add(MaxPooling2D(pool_size=(2, 2))) 
model.add(Flatten()) 
model.add(Dense(128, activation='relu')) 
model.add(Dense(num_classes, activation='softmax')) 

model.compile(loss=keras.losses.categorical_crossentropy, 
       optimizer=keras.optimizers.Adadelta(), 
       metrics=['accuracy']) 

model.fit(x_train, y_train, batch_size=100, epochs=10, verbose=1) 

Eine komplette Arbeits MNIST Beispiel kann here gefunden werden.

+0

Vielen Dank, sehr hilfreich –

+0

wo finde ich die Breite und Höhe? ValueError: kann Array der Größe 14000 nicht in Form umformen (250,188,1) –

+0

Das ist die Frage zu Ihren Daten. Sind Ihre Bilder gleich groß? – Maxim