import torch import torch.nn as nn from torchvision import transforms, models import gradio as gr from PIL import Image # Model Architecture (sama seperti sebelumnya) class ModelRecommender(nn.Module): def __init__(self, num_models, text_embedding_dim=768): super(ModelRecommender, self).__init__() # CNN for image processing self.cnn = models.resnet18(pretrained=True) self.cnn.fc = nn.Linear(512, 256) # MLP for text processing self.text_mlp = nn.Sequential( nn.Linear(text_embedding_dim, 512), nn.ReLU(), nn.Linear(512, 256), nn.ReLU() ) # Combined layers self.combined = nn.Sequential( nn.Linear(512, 256), nn.ReLU(), nn.Dropout(0.5), nn.Linear(256, num_models) ) def forward(self, image, text_features): # Process image img_features = self.cnn(image) # Process text text_features = self.text_mlp(text_features) # Combine features combined = torch.cat((img_features, text_features), dim=1) # Final prediction output = self.combined(combined) return output # Load model dan dataset info def load_model(): # Load dataset info dataset_info = torch.load('dataset_info.pth') model_names = dataset_info['model_names'] # Initialize model device = torch.device("cuda" if torch.cuda.is_available() else "cpu") model = ModelRecommender(len(model_names)) # Load model weights checkpoint = torch.load('sd_recommender_model.pth', map_location=device) model.load_state_dict(checkpoint['model_state_dict']) model.to(device) model.eval() return model, model_names, device def calculate_euclidean_distance(features1, features2): return np.linalg.norm(features1 - features2) def predict_image(image): if not hasattr(predict_image, "model"): predict_image.model, predict_image.model_names, predict_image.device = load_model() transform = transforms.Compose([ transforms.Resize((224, 224)), transforms.ToTensor(), transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]) ]) image_tensor = transform(image).unsqueeze(0).to(predict_image.device) dummy_text_features = torch.zeros(1, 768).to(predict_image.device) # Get image features with torch.no_grad(): img_features = predict_image.model.cnn(image_tensor).cpu().numpy() outputs = predict_image.model(image_tensor, dummy_text_features) top5_prob, top5_indices = torch.topk(outputs, 5) # Create HTML gallery html_output = """