from argparse import Namespace import sys sys.path.append(".") sys.path.append("..") sys.path.append("./encoder4editing") from PIL import Image import torch import torchvision.transforms as transforms import dlib from utils.alignment import align_face from utils.common import tensor2im from models.psp import pSp # we use the pSp framework to load the e4e encoder. experiment_type = 'ffhq_encode' EXPERIMENT_DATA_ARGS = { "ffhq_encode": { "model_path": "encoder4editing/e4e_ffhq_encode.pt", "image_path": "notebooks/images/input_img.jpg" }, } # Setup required image transformations EXPERIMENT_ARGS = EXPERIMENT_DATA_ARGS[experiment_type] EXPERIMENT_ARGS['transform'] = transforms.Compose([ transforms.Resize((256, 256)), transforms.ToTensor(), transforms.Normalize([0.5, 0.5, 0.5], [0.5, 0.5, 0.5])]) class psp_encoder: def __init__(self, model_path: str, shape_predictor_path: str): self.ckpt = torch.load(model_path, map_location="cpu") self.opts = self.ckpt["opts"] # update the training options self.opts["checkpoint_path"] = model_path self.opts= Namespace(**self.opts) self.net = pSp(self.opts) self.net.eval() self.net.cuda() self.shape_predictor = dlib.shape_predictor(shape_predictor_path) self.device = torch.device("cuda" if torch.cuda.is_available() else "cpu") def get_w(self, image_path): original_image = Image.open(image_path) original_image = original_image.convert("RGB") input_image = align_face(filepath=image_path, predictor=self.shape_predictor) resize_dims = (256, 256) input_image.resize(resize_dims) img_transforms = EXPERIMENT_ARGS["transform"] transformed_image = img_transforms(input_image) with torch.no_grad(): _, latents = self.net(transformed_image.unsqueeze(0).to(self.device).float(), randomize_noise=False, return_latents=True) return latents.cpu().numpy()