import os import pandas as pd import numpy as np import matplotlib.pyplot as plt import torch import torch.nn as nn import torch.optim as optim from torch.utils.data import Dataset, DataLoader from torchvision import models from torchvision import transforms from PIL import Image from PIL import UnidentifiedImageError import cv2 import segmentation_models_pytorch as sm import gradio as gr from aib_cdr import calculate_cdr class Net1(nn.Module): def __init__(self): super(Net1, self).__init__() self.model = models.resnet50(pretrained=True) for param in self.model.parameters(): param.requires_grad = False num_ftrs = self.model.fc.in_features self.model.fc = nn.Sequential( nn.Linear(num_ftrs, 512), nn.ReLU(), nn.Dropout(0.2), nn.Linear(512, 3), nn.Softmax(dim=1) ) def forward(self, x): x = self.model(x) return x class Net2(nn.Module): def __init__(self): super(Net2, self).__init__() self.model = models.resnet50(pretrained=True) for param in self.model.parameters(): param.requires_grad = False num_ftrs = self.model.fc.in_features self.model.fc = nn.Sequential( nn.Linear(num_ftrs, 512), nn.ReLU(), nn.Dropout(0.2), nn.Linear(512, 2) ) def forward(self, x): x = self.model(x) probas = nn.functional.softmax(x, dim=1) return x, probas disc_model_path = 'models/disc_model.pth' cup_model_path = 'models/cup_model.pth' quality_model_path = 'models/quality_model.pth' camtype_model_path = 'models/camtype_model.pth' dr_model_path = 'models/dr_model.pth' device = torch.device('cuda' if torch.cuda.is_available() else 'cpu') disc_model = sm.Unet('resnet34', classes=2, activation=None) disc_model.load_state_dict(torch.load(disc_model_path, map_location=device)) disc_model.to(device) disc_model.eval() cup_model = sm.Unet('resnet34', classes=2, activation=None) cup_model.load_state_dict(torch.load(cup_model_path, map_location=device)) cup_model.to(device) cup_model.eval() quality_model = Net1().to(device) quality_model.load_state_dict(torch.load(quality_model_path,map_location=device)) quality_model.to(device) quality_model.eval() camtype_model = models.resnet50(pretrained=True) num_features = camtype_model.fc.in_features camtype_model.fc = nn.Linear(num_features, 1) camtype_model.load_state_dict(torch.load(camtype_model_path,map_location=device)) camtype_model.to(device) camtype_model.eval() dr_model = Net2().to(device) dr_model.load_state_dict(torch.load(dr_model_path,map_location=device)) dr_model.to(device) dr_model.eval() transform = transforms.Compose([ transforms.Resize((512, 512)), transforms.ToTensor(), ]) def model_interface(image): image = Image.fromarray(image.astype('uint8'), 'RGB') image = image.resize((512, 512)) image_np = np.array(image) image_tensor = transform(image).unsqueeze(0).to(device) cdr = calculate_cdr(image_tensor, disc_model, cup_model, device) cdr = round(cdr,2) quality_probs = quality_model(image_tensor) quality_probs = quality_probs.flatten() quality_dict = {"Image Quality : ACCEPTABLE": quality_probs[0].item(), "Image Quality : GOOD": quality_probs[1].item(),"Image Quality : POOR" : quality_probs[2].item()} camtype_pred = camtype_model(image_tensor) camtype_pred = camtype_pred.item() camtype = "Eidon" if camtype_pred == 0 else "Nidek" dr_grading = dr_model(image_tensor) dr_grading = dr_grading[1].flatten() dr_dict = {"DR : Negative": dr_grading[0].item(), "DR : Positive": dr_grading[1].item()} disc_pred = disc_model(image_tensor) disc_mask = (disc_pred.argmax(dim=1) > 0.5).squeeze().cpu().numpy() disc_contours, _ = cv2.findContours(disc_mask.astype('uint8'), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) image_np1 = np.array(image) image_np1 = cv2.drawContours(image_np1, disc_contours, -1, (0, 255, 0), 2) cup_pred = cup_model(image_tensor) cup_mask = (cup_pred.argmax(dim=1) > 0.5).squeeze().cpu().numpy() cup_contours, _ = cv2.findContours(cup_mask.astype('uint8'), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) image_np2 = np.array(image) image_np2 = cv2.drawContours(image_np2, cup_contours, -1, (0, 0, 255), 2) return quality_dict, camtype, dr_dict, image_np1 , image_np2,cdr iface = gr.Interface( fn=model_interface, inputs=gr.inputs.Image(), outputs=[ gr.outputs.Label(num_top_classes=3, label="Image Quality"), gr.outputs.Textbox(label="Camera Type"), gr.outputs.Label(num_top_classes=2, label="DR Grading"), gr.outputs.Image(type='numpy', label="Disc Mask"), gr.outputs.Image(type='numpy', label="Cup Mask"), gr.outputs.Textbox(label="Cup-to-disc Ratio") ] ) iface.launch(debug=True)