Guide To SimSwap: An Efficient Framework For High Fidelity Face Swapping

Deepfake and Face Swapping have emerged as a new trend in the past few years. As crazy as this technology sounds and has been introduced as a concept in the market, it has become more popular than ever. The social media space is buzzing lately with images and videos of people swapping faces and impersonating their favourite idols, whether politicians, top musicians, actors, or other highly admired personalities. It is interchanging your face with another person, and it mostly results in hilarious pictures and videos only when done with the right intentions. Face Swap apps enable you to have a lot of fun on your own and with your friends to create content that could take the social media by storm. Impersonating a famous Hollywood actor or a pop star has never been easier as you can just swap faces with your favorite celebrity. It is also important to note that the results you’ll be able to get are completely dependent on the app’s face-swapping capabilities. New and upcoming technologies such as Deepfake also have an interesting take on such, where you can replace and swap a face with someone else and create a video so flawless that it seems completely authentic. Easily accessible and highly downloaded mobile applications based on the Deepfake concept, such as Reface and MSQRD are being used to get a feel of what it would be like to be in the shoes of the eminents; but with your face! 

Deepfake, a technology that uses deep learning and neural networks, is an AI or artificial intelligence-based human synthesis technique used to combine and superimpose existing images and videos onto source images or videos using a generative adversarial network as GAN, a deep learning technique. Combining an existing source video with an image to morph results apparently in a “fake” video that shows a person or persons performing an action at an event that never actually occurred in real life. GANs are a kind of neural network where two different networks coordinate each other. One network generates the fakes or generative network as it can be called, and the other evaluates how real and distinct they look. 

Face swapping was inculcated in movies for years. Highly skilled video editors and computer-generated imagery or CGI experts needed to spend several hours achieving only decent results using heavy computational power. Today with new & emerging breakthroughs in technology allow anyone with deep learning techniques and a powerful graphics processing unit to create fake videos and images far superior to the traditional face-swapping techniques seen in old films. No heavy video editing skills are needed now as the entire process is handled automatically by an algorithm. But these days, such technologies are also being misused to create hatred among the masses and or for people’s political agendas. 


Sign up for your weekly dose of what's up in emerging technology.

What is SimSwap?

SimSwap is an efficient framework that aims to generalize high fidelity face-swapping. In contrast to previous conventional approaches that either lack the ability to generalize to arbitrary identity or fail to preserve and detect specific distinct attributes like facial expression and gaze direction, SimSwap’s framework transfers the identity of an arbitrary source face easily into an arbitrary target face while preserving the attributes of the target face. The mentioned process is performed in the following two ways. At first, the ID Injection Module (IIM) transfers the identity information of the source face into the target face at a feature level. By using this module, it extends the architecture of an identity specific face swapping algorithm to a framework for arbitrary face-swapping. Secondly, using the Weak Feature Matching Loss Efficiently helps the framework preserve and implicitly save the facial attributes. The Encoder extracts the target’s features containing both identities and attributes information from the target face during the process. Since the Decoder only manages to convert the target’s features to an image with the source’s identity, the identity information of the source face gets integrated into the weights of the Decoder. So the Decoder in DeepFakes hence can be only applied to one specific identity. The industrial face-swapping method utilizes advanced equipment to reconstruct the actor’s face model and rebuild the scene’s lighting condition, which is beyond the reach of most people. Recently, face-swapping without high-end equipment by using technologies such as SimSwap has attracted the researcher’s attention lately. SimSwap is fully capable of achieving competitive identity performance to other such technologies while preserving attributes better than previous state-of-the-art methods. 

Image Source:

Creating Your Own Face Swapping Model 

We will try to create our face-swapping model by making use of SimSwap. We will implement face swapping on a video to replace the faces in the target video with a different facial image. The following is an official implementation from the creators of SimSwap, whose GitHub can be accessed from the link here.

Getting Started

First, we will call our model from SimSwap’s Github repository, using the following code. 

 !git clone
 !cd SimSwap && git pull 

Then we will install all  our dependencies to get started with using the following code,

 !pip install insightface==0.2.1 onnxruntime moviepy
 !pip install googledrivedownloader
 !pip install imageio==2.4.1 

Here we are using Insightface and imageio. Imageio is a Python library that provides an interface to read and write different kinds of image data, such as animated images and volumetric data from images.

Calling the prerequisites from SimSwap,

 import os
 os.chdir("SimSwap") #importing SimSwap Model 

Calling the prerequisites from InsightFace,

 !wget --no-check-certificate "" -O
 !unzip ./ -d ./insightface_func/models/ 

Importing further dependencies for the face swapping model, 

 import cv2
 import torch
 import fractions
 import numpy as np
 from PIL import Image
 import torch.nn.functional as F
 from torchvision import transforms
 from models.models import create_model
 from options.test_options import TestOptions
 from insightface_func.face_detect_crop_multi import Face_detect_crop
 from util.videoswap import video_swap
 from util.add_watermark import watermark_image 

We will start building the transformer for our face-swapping model with everything imported, which will consist of an encoder and decoder to implement our face swap on the target video.

 #creating the video transformer
 transformer = transforms.Compose([
         #transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])
 transformer_Arcface = transforms.Compose([
         transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])
 detransformer = transforms.Compose([
         transforms.Normalize([0, 0, 0], [1/0.229, 1/0.224, 1/0.225]),
         transforms.Normalize([-0.485, -0.456, -0.406], [1, 1, 1])

Setting the path to our target image and video, we are using an image of actor Robert Downey Jr to replace the faces in the target video. 

 opt = TestOptions()
 opt.parser.add_argument('-f') ## dummy arg to avoid bug
 opt = opt.parse()
 opt.pic_a_path = './demo_file/Iron_man.jpg' ## image to be replace it with 
 opt.video_path = './demo_file/multi_people_1080p.mp4' #Target video Path
 opt.output_path = './output/demo.mp4'#Path to save output at 
 opt.temp_path = './tmp'
 opt.Arc_path = './arcface_model/arcface_checkpoint.tar'
 opt.isTrain = False 

Creating our neural network model,

 crop_size = 224
 torch.nn.Module.dump_patches = True
 model = create_model(opt)
 app = Face_detect_crop(name='antelope', root='./insightface_func/models')
 app.prepare(ctx_id= 0, det_thresh=0.6, det_size=(640,640))
 pic_a = opt.pic_a_path
 # img_a ='RGB')
 img_a_whole = cv2.imread(pic_a)
 img_a_align_crop, _ = app.get(img_a_whole,crop_size)
 img_a_align_crop_pil = Image.fromarray(cv2.cvtColor(img_a_align_crop[0],cv2.COLOR_BGR2RGB)) 
 img_a = transformer_Arcface(img_a_align_crop_pil)
 img_id = img_a.view(-1, img_a.shape[0], img_a.shape[1], img_a.shape[2])
 # convert numpy to tensor
 img_id = img_id.cuda() 

Training our Model And Implementing the Transformation 

 #create latent id
 img_id_downsample = F.interpolate(img_id, scale_factor=0.5)
 latend_id = model.netArc(img_id_downsample)
 latend_id = latend_id.detach().to('cpu')
 latend_id = latend_id/np.linalg.norm(latend_id,axis=1,keepdims=True)
 latend_id ='cuda')
 video_swap(opt.video_path, latend_id, model, app, opt.output_path,temp_results_dir=opt.temp_path) 

Output :

 input mean and std: 127.5 127.5
 find model: ./insightface_func/models/antelope/glintr100.onnx recognition
 find model: ./insightface_func/models/antelope/scrfd_10g_bnkps.onnx detection
 set det-size: (640, 640)
   0%|          | 0/594 [00:00<?, ?it/s](142, 366, 4)
 100%|██████████| 594/594 [08:19<00:00,  1.19it/s]
 [MoviePy] >>>> Building video ./output/demo.mp4
 [MoviePy] Writing audio in demoTEMP_MPY_wvf_snd.mp3
 100%|██████████| 438/438 [00:00<00:00, 635.28it/s][MoviePy] Done.
 [MoviePy] Writing video ./output/demo.mp4
 100%|██████████| 595/595 [00:55<00:00, 10.69it/s]
 [MoviePy] Done.
 [MoviePy] >>>> Video ready: ./output/demo.mp4  

The Face Swapped Video will be saved at the mentioned path with the output being 

Isn’t That Cool?


In this article, we have explored the domain of face swapping and deepfake using the SimSwap Library. We have implemented a face-swapping model, which has replaced the target video with our image. You can try with different faces and more complex images to see how SImSwap behaves with them. You can find the link to this colab implementation here. 

References :

More Great AIM Stories

Victor Dey
Victor is an aspiring Data Scientist & is a Master of Science in Data Science & Big Data Analytics. He is a Researcher, a Data Science Influencer and also an Ex-University Football Player. A keen learner of new developments in Data Science and Artificial Intelligence, he is committed to growing the Data Science community.

Our Upcoming Events

Conference, in-person (Bangalore)
Machine Learning Developers Summit (MLDS) 2023
19-20th Jan, 2023

Conference, in-person (Bangalore)
Rising 2023 | Women in Tech Conference
16-17th Mar, 2023

Conference, in-person (Bangalore)
Data Engineering Summit (DES) 2023
27-28th Apr, 2023

Conference, in-person (Bangalore)
MachineCon 2023
23rd Jun, 2023

Conference, in-person (Bangalore)
Cypher 2023
20-22nd Sep, 2023

3 Ways to Join our Community

Whatsapp group

Discover special offers, top stories, upcoming events, and more.

Discord Server

Stay Connected with a larger ecosystem of data science and ML Professionals

Subscribe to our newsletter

Get the latest updates from AIM