from io import StringIO

import numpy as np
from h5py import File
from keras.models import load_model as keras_load_model
from PIL import Image, ImageOps


def predict(image, model):
    # Create the array of the right shape to feed into the keras model
    # The 'length' or number of images you can put into the array is
    # determined by the first position in the shape tuple, in this case 1.
    data = np.ndarray(shape=(1, 224, 224, 3), dtype=np.float32)
    # Replace this with the path to your image
    image = Image.open(image)
    # resize the image to a 224x224 with the same strategy as in TM2:
    # resizing the image to be at least 224x224 and then cropping from the center
    size = (224, 224)
    image = ImageOps.fit(image, size, Image.ANTIALIAS)

    # turn the image into a numpy array
    image_array = np.asarray(image)
    # Normalize the image
    normalized_image_array = (image_array.astype(np.float32) / 127.0) - 1
    # Load the image into the array
    data[0] = normalized_image_array

    # run the inference
    prediction = model.predict(data)
    return prediction[0]


def read_labels(labels_file):
    labels = []
    lines = StringIO(labels_file.getvalue().decode()).readlines()
    for line in lines:
        _, *remaining = line.split()
        label = " ".join(remaining).strip()
        labels.append(label)
    return labels


def load_model(model_file):
    return keras_load_model(File(model_file))

[((13, 11, 13, 63), 'numpy.ndarray', 'np.ndarray', (), '', True, 'import numpy as np\n'), ((15, 12, 15, 29), 'PIL.Image.open', 'Image.open', ({(15, 23, 15, 28): 'image'}, {}), '(image)', False, 'from PIL import Image, ImageOps\n'), ((19, 12, 19, 54), 'PIL.ImageOps.fit', 'ImageOps.fit', ({(19, 25, 19, 30): 'image', (19, 32, 19, 36): 'size', (19, 38, 19, 53): 'Image.ANTIALIAS'}, {}), '(image, size, Image.ANTIALIAS)', False, 'from PIL import Image, ImageOps\n'), ((22, 18, 22, 35), 'numpy.asarray', 'np.asarray', ({(22, 29, 22, 34): 'image'}, {}), '(image)', True, 'import numpy as np\n'), ((44, 28, 44, 44), 'h5py.File', 'File', ({(44, 33, 44, 43): 'model_file'}, {}), '(model_file)', False, 'from h5py import File\n')]