File size: 2,175 Bytes
2fee968
f7dfb0f
5b75e0d
 
 
2fee968
5b75e0d
 
 
 
2fee968
5b75e0d
 
 
2fee968
5b75e0d
 
 
 
 
2fee968
5b75e0d
 
2fee968
5b75e0d
2fee968
5b75e0d
2fee968
5b75e0d
2fee968
5b75e0d
 
 
 
2fee968
5b75e0d
 
 
 
 
 
 
 
 
b0fdc69
5b75e0d
2fee968
 
5b75e0d
 
2fee968
5b75e0d
2fee968
 
 
 
 
 
 
 
 
9c14d78
 
5b75e0d
2fee968
 
350a7a1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
# Import libraries
import gradio as gr
import tensorflow as tf
import numpy as np

# Initialize the number of classes, also the image's height and width
num_classes = 200
IMG_HEIGHT = 300
IMG_WIDTH = 300

# Open the classlabel.txt to read the class labels
with open("classlabel.txt", 'r') as file:
    CLASS_LABEL = [x.strip() for x in file.readlines()]

# Function to normalize the image
def normalize_image(img):
    img = tf.cast(img, tf.float32) / 255.0
    img = tf.image.resize(img, (IMG_HEIGHT, IMG_WIDTH), method='bilinear')
    return img

# Function to select and load the model
def load_model(model_name):
    # Load the model based on the model_name input
    if model_name == "Xception":
        return tf.keras.models.load_model("model/Xception.h5")
    elif model_name == "InceptionV3":
        return tf.keras.models.load_model("model/InceptionV3.h5")
    elif model_name == "InceptionResNetV2":
        return tf.keras.models.load_model("model/InceptionResNetV2.h5")
    elif model_name == "DenseNet201":
        return tf.keras.models.load_model("model/DenseNet201.h5")
    else:
        raise ValueError("Invalid model_name")

# Main function, let the model make the prediction on the image uploaded
def predict_top_classes(img, model_name):
    img = img.convert('RGB')
    img_data = normalize_image(img)
    x = np.array(img_data)
    x = np.expand_dims(x, axis=0)
    model = load_model(model_name)
    temp = model.predict(x)

    idx = np.argsort(np.squeeze(temp))[::-1]
    top5_value = np.asarray([temp[0][i] for i in idx[0:5]])
    top5_idx = idx[0:5]
    
    # Return the top 5 highest probability class labels
    return {CLASS_LABEL[i]: str(v) for i, v in zip(top5_idx, top5_value)}

# Define the interface
interface = gr.Interface(
    predict_top_classes,
    [
        gr.inputs.Image(type='pil'),
        gr.inputs.Dropdown(
            choices=["Xception","InceptionV3","InceptionResNetV2","DenseNet201"],
            type="value",
            label="Select a model",
            info="Base model that done feature extraction and fine-tuning process"
        )
    ],
    outputs='label',
)
    
# Launch the interface
interface.launch()