import gradio as gr import torch import torchvision.models as models from torchvision import transforms from torch import nn from PIL import Image transform = transforms.Compose([ transforms.Resize((128, 128)), transforms.ToTensor(), transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225]) ]) model = models.mobilenet_v3_large(pretrained=True) model.classifier[3] = nn.Linear(model.classifier[3].in_features, 2) model = model.to("cpu") model.load_state_dict(torch.load("cnn_model.pth", weights_only=True, map_location="cpu")) model.eval() label = ["nsfw", "safe"] def inference(image): image = transform(image).unsqueeze(0) with torch.no_grad(): output = model(image) output = torch.nn.functional.softmax(output, dim=1) predicted_class = torch.argmax(output, dim=1).item() score = output[0][predicted_class] if label[predicted_class] == "nsfw": output = f'Boneka ini terlalu seksi dan tidak aman dilihat anak kecil (NSFW) [{label[predicted_class]}:{score}]' else: output = f'Boneka ini aman (SAFE) [{label[predicted_class]}:{score}]' return output with gr.Blocks() as demo: with gr.Row(): with gr.Column(): inputs = gr.Image(type="pil") with gr.Column(): btn = gr.Button("Cek") pred = gr.Text(label="Prediction") btn.click(fn=inference, inputs=inputs, outputs=pred) demo.queue().launch()