ditobprasetio
add application files
fa2a7b2
import torch
import torch.nn.functional as F
import torchvision.transforms as transforms
import numpy as np
import gradio as gr
from torch import nn
from gradio import components
from PIL import Image
class BrainTumorClassifier(nn.Module):
def __init__(self, num_classes):
super(BrainTumorClassifier, self).__init__()
self.features = nn.Sequential(
nn.Conv2d(3, 20, kernel_size=3, padding=1),
nn.ReLU(),
nn.MaxPool2d(2, 2),
nn.Conv2d(20, 32, kernel_size=3, padding=1),
nn.ReLU(),
nn.MaxPool2d(2, 2)
)
self.classifier = nn.Sequential(
nn.Linear(32 * 56 * 56, 128), # Adjust input size based on image size
nn.ReLU(),
nn.Linear(128, num_classes)
)
def forward(self, x):
x = self.features(x)
x = x.view(-1, 32 * 56 * 56)
x = self.classifier(x)
return x
def predict(image):
image = Image.fromarray(np.uint8(image)).convert('RGB')
## give the weights trained
model_path = 'cnn_tumorbrain_classifier_self.pth'
model_load = BrainTumorClassifier(4)
model_load.load_state_dict(torch.load(model_path, map_location=torch.device('cpu')))
## put the model in evaluation mode
model_load.eval()
transform_pipeline = transforms.Compose([
transforms.Resize((224,224)),
transforms.ToTensor(),
transforms.Normalize((0.5,0.5,0.5),(0.5,0.5,0.5))
])
## transform the img like the training image
input_img = transform_pipeline(image).unsqueeze(0)
# input_img
## define the label by index
class_to_label = {0: 'glioma', 1: 'meningioma', 2: 'notumor', 3: 'pituitary'}
## run the model
with torch.no_grad():
output = model_load(input_img)
## convert to the softmax for getting percent each label
probabilities = F.softmax(output, dim=1)
## get predicted label with highest value
_, predicted_label = torch.max(probabilities,1)
# confidence_percent = probabilities[0].tolist()[predicted_label.item()]
conf, _ = torch.max(probabilities, 1)
result = "{}, with confidence level in {}%".format(class_to_label[predicted_label.item()], conf.item()*100)
return result
iface = gr.Interface(fn=predict,
inputs=gr.Image(),
outputs="textbox")
iface.launch(share=True)