Hi, I'm trying to use simswap with insightface library directly installed through pip. But result look totally weird. How to use model correctly? Is latent_id and embedding different?
What am i missing🤔?
Here is the entire code:
# running from simswap directoryimportcv2importPILimporttorchimporttorch.nnasnnimportnumpyasnpimportinsightfacefromtorchvisionimporttransformsfrommodels.fs_networksimportGenerator_Adain_Upsampledefresize_with_padding(image,target_size):original_height,original_width=image.shape[:2]target_width,target_height=target_sizeaspect_ratio=original_width/original_heighttarget_aspect_ratio=target_width/target_heightiftarget_aspect_ratio>aspect_ratio:new_width=target_height*aspect_rationew_height=target_heightelse:new_width=target_widthnew_height=target_width/aspect_ratioresized_image=cv2.resize(image,(int(new_width),int(new_height)))top_padding=(target_height-resized_image.shape[0])//2bottom_padding=target_height-resized_image.shape[0]-top_paddingleft_padding=(target_width-resized_image.shape[1])//2right_padding=target_width-resized_image.shape[1]-left_paddingpadded_image=cv2.copyMakeBorder(resized_image,top_padding,bottom_padding,left_padding,right_padding,cv2.BORDER_CONSTANT,value=(0,0,0))returnpadded_image## insightface analyserface_analyser=insightface.app.FaceAnalysis(name='buffalo_l')face_analyser.prepare(ctx_id=0,det_size=(640,640),det_thresh=0.5)defget_face_info(img):crop=lambdaimg,bb:img[int(bb[1]):int(bb[3]),int(bb[0]):int(bb[2])]face=face_analyser.get(img)[0]embedding=np.array([face['embedding']])cropped=crop(img,face['bbox'])returnresize_with_padding(cropped,(224,224)),embedding## read imagesimg1=cv2.imread("./demo_file/Iron_man.jpg")img2=cv2.imread("./demo_file/specific3.png")## cropped face and embeddingface1,embed1=get_face_info(img1)face2,embed2=get_face_info(img2)## load simswap modeldevice=torch.device("cuda:0")net=Generator_Adain_Upsample(input_nc=3,output_nc=3,latent_size=512,n_blocks=9,deep=False)net.to(device)net.load_state_dict(torch.load("./checkpoints/simswap_224_latest_net_G.pth"))withtorch.no_grad():transform=transforms.ToTensor()tensor1=transform(face1[:,:,::-1].astype('float32').copy())tensor1=tensor1.unsqueeze(0)embed2=torch.from_numpy(embed2)embed2/=torch.linalg.norm(embed2,dim=1,keepdim=True)tensor1=tensor1.to('cuda')embed2=embed2.to('cuda')img_fake=net.forward(tensor1,embed2)cv2_img=img_fake.squeeze(0).permute(1,2,0).cpu().numpy()[...,::-1]cv2.imwrite("test_swap.jpg",(cv2_img*255).astype('uint8'))
img1:
img2
result
Hi, I'm trying to use simswap with insightface library directly installed through pip. But result look totally weird. How to use model correctly? Is latent_id and embedding different?
What am i missing🤔?
Here is the entire code:
````python
# running from simswap directory
import cv2
import PIL
import torch
import torch.nn as nn
import numpy as np
import insightface
from torchvision import transforms
from models.fs_networks import Generator_Adain_Upsample
def resize_with_padding(image, target_size):
original_height, original_width = image.shape[:2]
target_width, target_height = target_size
aspect_ratio = original_width / original_height
target_aspect_ratio = target_width / target_height
if target_aspect_ratio > aspect_ratio:
new_width = target_height * aspect_ratio
new_height = target_height
else:
new_width = target_width
new_height = target_width / aspect_ratio
resized_image = cv2.resize(image, (int(new_width), int(new_height)))
top_padding = (target_height - resized_image.shape[0]) // 2
bottom_padding = target_height - resized_image.shape[0] - top_padding
left_padding = (target_width - resized_image.shape[1]) // 2
right_padding = target_width - resized_image.shape[1] - left_padding
padded_image = cv2.copyMakeBorder(
resized_image,
top_padding,
bottom_padding,
left_padding,
right_padding,
cv2.BORDER_CONSTANT,
value=(0, 0, 0)
)
return padded_image
## insightface analyser
face_analyser = insightface.app.FaceAnalysis(name='buffalo_l')
face_analyser.prepare(ctx_id=0, det_size=(640, 640), det_thresh=0.5)
def get_face_info(img):
crop = lambda img,bb:img[int(bb[1]):int(bb[3]), int(bb[0]):int(bb[2])]
face = face_analyser.get(img)[0]
embedding = np.array([face['embedding']])
cropped = crop(img, face['bbox'])
return resize_with_padding(cropped, (224,224)), embedding
## read images
img1 = cv2.imread("./demo_file/Iron_man.jpg")
img2 = cv2.imread("./demo_file/specific3.png")
## cropped face and embedding
face1, embed1 = get_face_info(img1)
face2, embed2 = get_face_info(img2)
## load simswap model
device = torch.device("cuda:0")
net = Generator_Adain_Upsample(input_nc=3, output_nc=3, latent_size=512, n_blocks=9, deep=False)
net.to(device)
net.load_state_dict(torch.load("./checkpoints/simswap_224_latest_net_G.pth"))
with torch.no_grad():
transform = transforms.ToTensor()
tensor1 = transform(face1[:, :, ::-1].astype('float32').copy())
tensor1 = tensor1.unsqueeze(0)
embed2 = torch.from_numpy(embed2)
embed2 /= torch.linalg.norm(embed2, dim=1, keepdim=True)
tensor1 = tensor1.to('cuda')
embed2 = embed2.to('cuda')
img_fake = net.forward(tensor1, embed2)
cv2_img = img_fake.squeeze(0).permute(1, 2, 0).cpu().numpy()[..., ::-1]
cv2.imwrite("test_swap.jpg", (cv2_img*255).astype('uint8'))
````
img1:

img2

result

Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Hi, I'm trying to use simswap with insightface library directly installed through pip. But result look totally weird. How to use model correctly? Is latent_id and embedding different?
What am i missing🤔?
Here is the entire code:
img1:

img2

result

@harisreedhar why close? I'm also looking to get better than 128x128 resolution from insightface