Img_to_array is not defined

import anvil.media
from PIL import *
import PIL.Image
@anvil.server.callable
def classify_image(file):
    with anvil.media.TempFile(file) as filename:
        img=image.load_img(filename)
    img=img.resize((150,150),resample= PIL.Image.BICUBIC)
    arr=img_to_array(img)
    arr=np.expand_dims(arr,axis=0)
    arr /=255.0
    score = model.predict(arr)
    training_set.class_indices


    if result[0][0] == 1:
      prediction = 'Daisy'
    elif result[0][1]==1:
      prediction = 'Dandelion'
    elif result[0][2]==1:
      prediction = 'Rose'
    elif result[0][3]==1:
     prediction='Sunflower'
    elif result[0][4]==1:
     prediction='Tulip'
    return(float(score))

I have written this but this showing error that img_to_array is not defined

is img_to_array in the PIL library? I’m not sure it is…

I think you can just take the img_to_array function from the keras github source code (since it’s not in the anvil list of packages) and copy the function (assuming this is the package you meant)

https://github.com/keras-team/keras-preprocessing/blob/b03735ecd243c3ee6282b5e3b5109b9235b38594/keras_preprocessing/image.py#L415


def img_to_array(img, data_format='channels_last', dtype='float32'):
    """Converts a PIL Image instance to a Numpy array.
    # Arguments
        img: PIL Image instance.
        data_format: Image data format,
            either "channels_first" or "channels_last".
        dtype: Dtype to use for the returned array.
    # Returns
        A 3D Numpy array.
    # Raises
        ValueError: if invalid `img` or `data_format` is passed.
    """
    if data_format not in {'channels_first', 'channels_last'}:
        raise ValueError('Unknown data_format: %s' % data_format)
    # Numpy array x has format (height, width, channel)
    # or (channel, height, width)
    # but original PIL image has format (width, height, channel)
    x = np.asarray(img, dtype=dtype)
    if len(x.shape) == 3:
        if data_format == 'channels_first':
            x = x.transpose(2, 0, 1)
    elif len(x.shape) == 2:
        if data_format == 'channels_first':
            x = x.reshape((1, x.shape[0], x.shape[1]))
        else:
            x = x.reshape((x.shape[0], x.shape[1], 1))
    else:
        raise ValueError('Unsupported image shape: %s' % (x.shape,))
    return x

You’ll also need to do

import numpy as np

p.s. you can request to the anvil team to install the keras package into the server (if you’re on the paid plan) and they should get back to you quickly.

then you can import from keras modules on the server.

I think the solution above will just lead to the next error

models is not defined

If you’re not on the paid plan and/or it’s urgent - you can work with the package on your own computer using the anvil uplink feature

That first img variable loses scope outside the with block, doesn’t it?
Not sure it’s related to your issue (I don’t have any real experience with PIL) but that looks like it might not be doing what you think it does, as this line -
img=img.resize(.....
is calling resize on an uninitialised variable, isn’t it?

This code is copied from the Jupyter notebook to Web app tutorial, but the undefined variables suggest that @dwarakavutla has only copied a little bit of the code from that example, which doesn’t work without the rest of the ML model.

@dwarakavutla, can you tell us a bit more about what you’re aiming to do here?

I believe you need to add it to first block of import modules–>

# before
from keras.preprocessing.image import ImageDataGenerator, load_img
# after
from keras.preprocessing.image import ImageDataGenerator, load_img, img_to_array
1 Like

Awsome! it worked for me Thanks