Spaces:
Sleeping
Sleeping
import os | |
import cv2 | |
import torch | |
import torchvision | |
from torch import nn | |
from torchvision import transforms | |
from PIL import Image | |
class_names = ["Glioma Tumor", "Meningitis Tumor", "No Tumor", "Pituitary Tumor"] | |
class CFG: | |
DEVICE = 'cpu' | |
NUM_DEVICES = torch.cuda.device_count() | |
NUM_WORKERS = os.cpu_count() | |
NUM_CLASSES = 4 | |
EPOCHS = 16 | |
BATCH_SIZE = 32 | |
LR = 0.001 | |
APPLY_SHUFFLE = True | |
SEED = 768 | |
HEIGHT = 224 | |
WIDTH = 224 | |
CHANNELS = 3 | |
IMAGE_SIZE = (224, 224, 3) | |
class EfficientNetV2Model(nn.Module): | |
def __init__(self, backbone_model, name='efficientnet-v2-large', | |
num_classes=CFG.NUM_CLASSES, device=CFG.DEVICE): | |
super(EfficientNetV2Model, self).__init__() | |
self.backbone_model = backbone_model | |
self.device = device | |
self.num_classes = num_classes | |
self.name = name | |
classifier = nn.Sequential( | |
nn.Flatten(), | |
nn.Dropout(p=0.2, inplace=True), | |
nn.Linear(in_features=1280, out_features=256, bias=True), | |
nn.GELU(), | |
nn.Dropout(p=0.2, inplace=True), | |
nn.Linear(in_features=256, out_features=num_classes, bias=False) | |
).to(device) | |
self._set_classifier(classifier) | |
def _set_classifier(self, classifier:nn.Module) -> None: | |
self.backbone_model.classifier = classifier | |
def forward(self, image): | |
return self.backbone_model(image) | |
def get_effiecientnetv2_model( | |
device: torch.device=CFG.NUM_CLASSES) -> nn.Module: | |
# Set the manual seeds | |
torch.manual_seed(CFG.SEED) | |
torch.cuda.manual_seed(CFG.SEED) | |
# Get model weights | |
model_weights = ( | |
torchvision | |
.models | |
.EfficientNet_V2_L_Weights | |
.DEFAULT | |
) | |
# Get model and push to device | |
model = ( | |
torchvision.models.efficientnet_v2_l( | |
weights=model_weights | |
) | |
).to(device) | |
# Freeze Model Parameters | |
for param in model.features.parameters(): | |
param.requires_grad = False | |
return model | |
# Get EfficientNet v2 model | |
backbone_model = get_effiecientnetv2_model(CFG.DEVICE) | |
efficientnetv2_params = { | |
'backbone_model' : backbone_model, | |
'name' : 'efficientnet-v2-large', | |
'device' : CFG.DEVICE | |
} | |
# Generate Model | |
efficientnet_model = EfficientNetV2Model(**efficientnetv2_params) | |
efficientnet_model.load_state_dict( | |
torch.load('efficientnetV2.pth', map_location=torch.device('cpu')) | |
) | |
# def predict_eff(image_path): | |
# # Define the image transformation | |
# transform = transforms.Compose([ | |
# transforms.Resize((224, 224)), | |
# transforms.ToTensor() | |
# ]) | |
# # Load and preprocess the image | |
# # image_path = "glioma.jpg" # Replace with the path to your image | |
# image = Image.open(image_path) | |
# input_tensor = transform(image) | |
# input_batch = input_tensor.unsqueeze(0).to("cuda") # Add batch dimension | |
# # Perform inference | |
# with torch.no_grad(): | |
# output = efficientnet_model(input_batch).to("cuda") | |
# # You can now use the 'output' tensor as needed (e.g., get predictions) | |
# # print(output) | |
# return output | |
def predict_eff(image_path): | |
# Define the image transformation | |
transform = transforms.Compose([ | |
transforms.Resize((224, 224)), | |
transforms.ToTensor() | |
]) | |
# Load and preprocess the image | |
# image_path = "glioma.jpg" # Replace with the path to your image | |
image = Image.open(image_path) | |
input_tensor = transform(image) | |
input_batch = input_tensor.unsqueeze(0).to(CFG.DEVICE) # Add batch dimension | |
# Perform inference | |
with torch.no_grad(): | |
output = efficientnet_model(input_batch).to(CFG.DEVICE) | |
# You can now use the 'output' tensor as needed (e.g., get predictions) | |
# print(output) | |
res = torch.softmax(output, dim=1) | |
probs = {class_names[i]: float(res[0][i]) for i in range(len(class_names))} | |
return probs |