I was trying to train the keras resnet50 model on a fruits dataset and have been able to do that. The model get generated but when I use it to perform prediction on a single image I am getting this error.

module 'keras.preprocessing.image' has no attribute 'ndim'

Here is the training code:

from keras.applications.resnet50 import ResNet50, preprocess_input
from keras.preprocessing.image import ImageDataGenerator
from keras.callbacks import ModelCheckpoint
import OpenSSL
import os

HEIGHT = 100
WIDTH = 100
TRAIN_DIR = "dataset"
BATCH_SIZE = 8


base_model = ResNet50(weights='imagenet', 
                      include_top=False, 
input_shape=(HEIGHT, WIDTH, 3))



train_datagen =  ImageDataGenerator(
      preprocessing_function=preprocess_input,
      rotation_range=90,
      horizontal_flip=True,
      vertical_flip=True
    )

train_generator = train_datagen.flow_from_directory(TRAIN_DIR, 
                                                    target_size=(HEIGHT, WIDTH), 
batch_size=BATCH_SIZE)

from keras.layers import Dense, Activation, Flatten, Dropout
from keras.models import Sequential, Model
def build_finetune_model(base_model, dropout, fc_layers, num_classes):
    for layer in base_model.layers:
        layer.trainable = False

    x = base_model.output
    x = Flatten()(x)
    for fc in fc_layers:
        # New FC layer, random init
        x = Dense(fc, activation='relu')(x) 
        x = Dropout(dropout)(x)

    # New softmax layer
    predictions = Dense(num_classes, activation='softmax')(x) 

    finetune_model = Model(inputs=base_model.input, outputs=predictions)

    return finetune_model


class_list = os.listdir(os.path.join(os.getcwd(),"dataset"))
FC_LAYERS = [1024, 1024]
dropout = 0.5
finetune_model = build_finetune_model(base_model, 
                                  dropout=dropout, 
                                  fc_layers=FC_LAYERS, 
num_classes=len(class_list))

from keras.optimizers import SGD, Adam

NUM_EPOCHS = 6
BATCH_SIZE = 8
num_train_images = 1000

adam = Adam(lr=0.00001)
finetune_model.compile(adam, loss='categorical_crossentropy', metrics=['accuracy'])

filepath="./checkpoints/" + "ResNet50" + "_model_weights.h5"
checkpoint = ModelCheckpoint(filepath, monitor=["acc"], verbose=1, mode='max')
callbacks_list = [checkpoint]

history = finetune_model.fit_generator(train_generator, epochs=NUM_EPOCHS, workers=8, 
                                   steps_per_epoch=num_train_images // BATCH_SIZE, 
                                   shuffle=True, callbacks=callbacks_list)


finetune_model.save("mymodel.hdf5")

As said, the model is getting created. I ve used the following to test single image prediction

import numpy as np
import os

from keras.models import load_model
import os
import cv2
from keras.preprocessing import image
from keras.applications.resnet50 import preprocess_input

model = load_model("mymodel.hdf5")
fruits = os.listdir(os.path.join(os.getcwd(),'dataset'))



def predictFromImagePath(img_path):
    img = image.load_img(img_path, target_size=(100,100))
    x = image.img_to_array(img)
    x = np.expand_dims(x, axis=0)
    x = preprocess_input(x)
    print(x.shape)

    return predictFromImage(image)



def predictFromImage(image):

    index = model.predict(image)

    print(index)

    return fruits[index]


if __name__ == "__main__":
    img_path = 'apple1.jpg'   
    predictFromImagePath(img_path)

1 Answers

0
Mitiku On Best Solutions

In predictFromImagePath function, when returning you are passing image module to the predictFromImage function.

return predictFromImage(image)

Based on the code above the line I assume you want to call predictFromImage function on variable x. So change the above function call to the following.

return predictFromImage(x)