|
import time |
|
import os |
|
import torch |
|
import numpy as np |
|
import torchvision |
|
import torch.nn.functional as F |
|
from torchvision.datasets import ImageFolder |
|
import torchvision.transforms as transforms |
|
from tqdm import tqdm |
|
import pickle |
|
import argparse |
|
from PIL import Image |
|
|
|
concat = lambda x: np.concatenate(x, axis=0) |
|
to_np = lambda x: x.data.to("cpu").numpy() |
|
|
|
|
|
class Wrapper(torch.nn.Module): |
|
def __init__(self, model): |
|
super(Wrapper, self).__init__() |
|
self.model = model |
|
self.avgpool_output = None |
|
self.query = None |
|
self.cossim_value = {} |
|
|
|
def fw_hook(module, input, output): |
|
self.avgpool_output = output.squeeze() |
|
|
|
self.model.avgpool.register_forward_hook(fw_hook) |
|
|
|
def forward(self, input): |
|
_ = self.model(input) |
|
return self.avgpool_output |
|
|
|
def __repr__(self): |
|
return "Wrappper" |
|
|
|
|
|
def QueryToEmbedding(query_path): |
|
dataset_transform = transforms.Compose( |
|
[ |
|
transforms.Resize(256), |
|
transforms.CenterCrop(224), |
|
transforms.ToTensor(), |
|
transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225]), |
|
] |
|
) |
|
|
|
model = torchvision.models.resnet50(pretrained=True) |
|
model.eval() |
|
myw = Wrapper(model) |
|
|
|
query_pil = Image.open(query_path) |
|
query_pt = dataset_transform(query_pil) |
|
|
|
with torch.no_grad(): |
|
embedding = to_np(myw(query_pt.unsqueeze(0))) |
|
|
|
return np.asarray([embedding]) |
|
|