import torch import warnings import gradio as gr import cv2 import torchvision from torch import nn from torchvision.models import mobilenet_v3_small import numpy as np #device = "cuda" if torch.cuda.is_available() else "cpu" device = "cpu" warnings.filterwarnings("ignore") def flip_text(x): return x[::-1] def method1_prep(image): transforms = torchvision.models.MobileNet_V3_Small_Weights.IMAGENET1K_V1.transforms() image = torch.from_numpy(image).permute(2, 0, 1) return transforms(image) def method2_prep(image): transforms = torchvision.transforms.Compose([ torchvision.transforms.Resize((256, 256)), torchvision.transforms.CenterCrop((224, 224)) ]) t_lower = 50 t_upper = 150 height, width = image.shape[:2] x = (width - 1920) // 2 y = (height - 1080) // 2 image = image[y:y+1080, x:x+1920] img = torch.from_numpy(cv2.Canny(image, t_lower, t_upper)[np.newaxis, ...]) img = torch.vstack((img, img, img)) return transforms(img.type(torch.float32)) def model1_inf(x): print("Method 1") image = method1_prep(x).unsqueeze(dim=0) model = mobilenet_v3_small(weights='DEFAULT') model.classifier[3] = nn.Linear(in_features=1024, out_features=2, bias=True) model.load_state_dict(torch.load('./method1(0.668).pt',map_location=torch.device('cpu'))) model.eval() # Set the model to evaluation mode with torch.inference_mode(): model = model.to(device) image = image.to(device) output = torch.softmax(model(image), dim=1).detach().cpu() prediction = torch.argmax(output, dim=1).item() del model torch.cuda.empty_cache() if prediction == 0: return "The image is not pixelated" else: return "The image is pixelated" def model2_inf(x): print("Method 2") image = method2_prep(x).unsqueeze(dim=0) model = mobilenet_v3_small(weights='DEFAULT') model.classifier[3] = nn.Linear(in_features=1024, out_features=2, bias=True) image_np = image[0].permute(1, 2, 0).cpu().numpy() image_np = (image_np * 255).astype(np.uint8) # Ensure the image is of type uint8 model.load_state_dict(torch.load('./method2(0.960).pt',map_location=torch.device('cpu'))) #print("\nModel weights loaded successfully") model.eval() # Set the model to evaluation mode with torch.inference_mode(): model = model.to(device) image = image.to(device) output = torch.softmax(model(image), dim=1).detach().cpu() prediction = torch.argmax(output, dim=1).item() del model torch.cuda.empty_cache() if prediction == 0: return "The image is not pixelated" else: return "The image is pixelated" with gr.Blocks() as app: gr.Markdown("### Pixelation Detection App") # Selecting method method = gr.Radio(["Method 1 (Baseline Method) ", "Method 2 (Proposed Method)"], label="Select Method") with gr.Tab("Classification by image"): image_input = gr.Image(type="numpy", label="Upload an image") output_text = gr.Textbox(label="Output") def classify_image(img, method): if method == "Method 1": return model1_inf(img) else: return model2_inf(img) method.change(fn=classify_image, inputs=[image_input, method], outputs=output_text) image_input.change(fn=classify_image, inputs=[image_input, method], outputs=output_text) app.launch(share=False)