| from torchvision import models, transforms | |
| import torch.nn as nn | |
| from pytorch_grad_cam import GradCAM | |
| import torch | |
| def load_model(model_path: str): | |
| """Load a fine-tuned VGG model from model path""" | |
| vgg_model = models.vgg16(pretrained=False) | |
| vgg_model.classifier[6] = nn.Sequential( | |
| nn.Linear(vgg_model.classifier[6].in_features, 512), | |
| nn.BatchNorm1d(512), | |
| nn.ReLU(), | |
| nn.Dropout(0.5), | |
| nn.Linear(512,3) | |
| ) | |
| vgg_model.load_state_dict(torch.load(model_path, map_location='cpu')) | |
| vgg_model.eval() | |
| return vgg_model | |
| def convert_to_gradcam(model): | |
| """Initialize a Grad-CAM explainer for the provided model""" | |
| target_layers = [model.features[-1]] | |
| return GradCAM(model=model, target_layers=target_layers) | |
| def preprocess_image(image): | |
| """Apply image pre-processing for VGG-16 model""" | |
| transform = transforms.Compose([ | |
| transforms.Resize((224, 224)), | |
| transforms.ToTensor(), | |
| transforms.Normalize(mean=[0.3205, 0.2244, 0.1613], | |
| std=[0.2996, 0.2158, 0.1711]) | |
| ]) | |
| return transform(image) |