Vrk's picture
Update app.py
ddcd2c4
import gradio as gr
import numpy as np
import tensorflow as tf
import torch
import torch.nn as nn
import torch.optim as optim
import torch.nn.functional as F
import timm
from PIL import Image
from torchvision import transforms
from Models import ResNet, EfficientNet, BaseLine
def get_model(model_name, classes, device):
if model_name == 'Inception-V3':
model = tf.lite.Interpreter(model_path='vgg.tflite')
model.allocate_tensors()
elif model_name == 'VGG':
model = tf.lite.Interpreter(model_path='vgg.tflite')
model.allocate_tensors()
elif model_name == 'EfficientNet-B0':
model = EfficientNet(len(classes)).to(device)
model.load_state_dict(torch.load('EfficientNet-Model.pt', map_location=torch.device(device)))
elif model_name == 'ResNet-50':
model = ResNet(len(classes)).to(device)
model.load_state_dict(torch.load('model-resnet50.pt', map_location=torch.device(device)))
elif model_name == 'Base Line Model':
model = BaseLine(len(classes)).to(device)
model.load_state_dict(torch.load('BaseLine-Model.pt', map_location=torch.device(device)))
return model
def get_transform(input_img, device):
normalize = transforms.Normalize(
[0.485, 0.456, 0.406],
[0.229, 0.224, 0.225]
)
test_transform = transforms.Compose([
transforms.ToTensor(),
normalize,
])
input_img = test_transform(input_img).unsqueeze(0).to(device)
return input_img
def make_predictions(input_img, model_name):
classes = ['buildings','forest', 'glacier', 'mountain', 'sea', 'street']
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
model = get_model(model_name, classes, device)
if model_name in ['EfficientNet-B0', 'ResNet-50', 'Base Line Model']:
model.eval()
img = get_transform(input_img, device)
pred = model(img)
if torch.cuda.is_available():
pred = F.softmax(pred).detach().cpu().numpy()
y_prob = pred.argmax(axis=1)[0]
else:
pred = F.softmax(pred).detach().numpy()
y_prob = pred.argmax(axis=1)[0]
if model_name in ['Inception-V3', 'VGG']:
input_img = np.array(input_img)
img = input_img / 255.
input_tensor= np.array(np.expand_dims(img,0), dtype=np.float32)
input_index = model.get_input_details()[0]["index"]
# setting input tensor
model.set_tensor(input_index, input_tensor)
#Run the inference
model.invoke()
output_details = model.get_output_details()
# output data of image
pred = model.get_tensor(output_details[0]['index'])
y_prob = pred.argmax()
label = classes[y_prob]
confidences = {classes[i]: float(pred[0][i]) for i in range(len(classes))}
return label, confidences
demo = gr.Interface(
fn = make_predictions,
inputs = [gr.Image(shape=(150, 150), type="pil"), gr.Dropdown(choices=['EfficientNet-B0', 'ResNet-50', 'Inception-V3', 'VGG', 'Base Line Model'], value='EfficientNet-B0', label='Choose Model')],
outputs = [gr.outputs.Textbox(label="Output Class"), gr.outputs.Label(label='Confidences')],
title = "MultiClass Classifier",
examples=[
["Buildings.jpg", 'EfficientNet-B0'],
["Forest.jpg", 'EfficientNet-B0'],
['Street.jpg', 'EfficientNet-B0'],
['glacier.jpg', 'EfficientNet-B0'],
['mountain.jpg', 'EfficientNet-B0'],
['sea.jpg', 'EfficientNet-B0']
],
)
demo.launch(debug=True, inline=True)