Spaces:
Running
Running
| from numpy.lib.arraysetops import isin | |
| import torchvision.models as models | |
| import torch.nn as nn | |
| import torch | |
| class Vgg19(nn.Module): | |
| def __init__(self): | |
| super(Vgg19, self).__init__() | |
| self.vgg19 = self.get_vgg19().eval() | |
| vgg_mean = torch.tensor([0.485, 0.456, 0.406]).float() | |
| vgg_std = torch.tensor([0.229, 0.224, 0.225]).float() | |
| self.mean = vgg_mean.view(-1, 1 ,1) | |
| self.std = vgg_std.view(-1, 1, 1) | |
| def to(self, device): | |
| new_self = super(Vgg19, self).to(device) | |
| new_self.mean = new_self.mean.to(device) | |
| new_self.std = new_self.std.to(device) | |
| return new_self | |
| def forward(self, x): | |
| return self.vgg19(self.normalize_vgg(x)) | |
| def get_vgg19(last_layer='conv4_4'): | |
| vgg = models.vgg19(weights=models.VGG19_Weights.IMAGENET1K_V1).features | |
| model_list = [] | |
| i = 0 | |
| j = 1 | |
| for layer in vgg.children(): | |
| if isinstance(layer, nn.MaxPool2d): | |
| i = 0 | |
| j += 1 | |
| elif isinstance(layer, nn.Conv2d): | |
| i += 1 | |
| name = f'conv{j}_{i}' | |
| if name == last_layer: | |
| model_list.append(layer) | |
| break | |
| model_list.append(layer) | |
| model = nn.Sequential(*model_list) | |
| return model | |
| def normalize_vgg(self, image): | |
| ''' | |
| Expect input in range -1 1 | |
| ''' | |
| image = (image + 1.0) / 2.0 | |
| return (image - self.mean) / self.std | |
| if __name__ == '__main__': | |
| from PIL import Image | |
| import numpy as np | |
| from utils.image_processing import normalize_input | |
| image = Image.open("example/10.jpg") | |
| image = image.resize((224, 224)) | |
| np_img = np.array(image).astype('float32') | |
| np_img = normalize_input(np_img) | |
| img = torch.from_numpy(np_img) | |
| img = img.permute(2, 0, 1) | |
| img = img.unsqueeze(0) | |
| vgg = Vgg19() | |
| feat = vgg(img) | |
| print(feat.shape) |