Arekku21's picture
Update app.py
c37a860 verified
raw
history blame
3.51 kB
import gradio as gr
import torch
import numpy as np
import torch
import torchvision.models as models
from torch import nn
from albumentations import (
HorizontalFlip, VerticalFlip, IAAPerspective, ShiftScaleRotate, CLAHE, RandomRotate90,
Transpose, ShiftScaleRotate, Blur, OpticalDistortion, GridDistortion, HueSaturationValue,
IAAAdditiveGaussianNoise, GaussNoise, MotionBlur, MedianBlur, IAAPiecewiseAffine, RandomResizedCrop,
IAASharpen, IAAEmboss, RandomBrightnessContrast, Flip, OneOf, Compose, Normalize, Cutout, CoarseDropout, ShiftScaleRotate, CenterCrop, Resize, Rotate,
ShiftScaleRotate, CenterCrop, Crop, Resize, Rotate, RandomShadow, RandomSizedBBoxSafeCrop,
ChannelShuffle, MotionBlur,Lambda,SmallestMaxSize
)
from albumentations.pytorch import ToTensorV2
# Your Albumentations transformations
test_transforms = Compose([
Resize(224, 224),
Normalize(mean=(0.485, 0.456, 0.406), std=(0.229, 0.224, 0.225)),
ToTensorV2(),
])
def load_cub200_classes():
"""
This function loads the classes from the classes.txt file and returns a dictionary
"""
with open("classes.txt", encoding="utf-8") as f:
classes = f.read().splitlines()
# convert classes to dictionary separating the lines by the first space
classes = {int(line.split(" ")[0]) : line.split(" ")[1] for line in classes}
# return the classes dictionary
return classes
def load_model():
"""
This function loads the trained model and returns it
"""
model = models.resnet50(pretrained=True)
# Freeze the initial layers up to a certain point (e.g., layer 4)
freeze_layers = 4
for idx, (name, param) in enumerate(model.named_parameters()):
if idx < freeze_layers:
param.requires_grad = False
# Replace the final fully connected layer for the new task
num_ftrs = model.fc.in_features
model.fc = nn.Linear(num_ftrs, 200)
# Add dropout layers
model = nn.Sequential(
model,
nn.Dropout(0.8), # Adjust the dropout rate as needed
nn.Linear(200, 200) # Add additional fully connected layer
)
# Load the state dictionary from the file
state_dict = torch.load("resnet50_7511.pt",map_location=torch.device('cpu'))
# Load the state dictionary into the model object
model.load_state_dict(state_dict)
# # Load actual model
# model = torch.load("resnet18.pth", map_location=torch.device('cpu'))
# set the model to evaluation mode
model.eval()
# return the model
return model
def predict_image(image):
"""
This function takes an image as input and returns the class label
"""
# load the model
model = load_model()
# model.eval()
# load the classes
classes = load_cub200_classes()
# Apply Albumentations transformations
transformed_image = test_transforms(image=image)['image']
# Convert the image to a PyTorch tensor
tensor_image = transformed_image.unsqueeze(0)
# Make prediction
with torch.no_grad():
output = model(tensor_image)
# Assuming the output is a tensor representing class probabilities
probabilities = torch.nn.functional.softmax(output[0], dim=0).numpy()
# Get the class with the highest probability
predicted_class = np.argmax(probabilities)
# Return the class label
return "Predicted Class: " + classes[predicted_class+1]
# create a gradio interface
gr.Interface(fn=predict_image, inputs="image", outputs="text").launch()