SimSwap复现指引及代码分析【2023有更新】

SimSwap复现指引及代码分析【2023有更新】

  • 0、前言
  • 1、复现指引
    • 环境配置指引
    • Inference for image or video face swapping
    • Inference参数解析
    • Inference用法示例
      • 图像
      • 视频
  • 2、结果分析
  • 3、代码分析

0、前言

论文讲解在:https://blog.csdn.net/qq_45934285/article/details/127701689

1、复现指引

环境配置指引

  1. 首先一步一步执行我的环境:
    官方的安装教程不要用!!!过时了,看下面我的环境!!!
'''官方教程已过时!!!踩坑了'''
conda create -n simswap python=3.6 -y
conda activate simswap
conda install pytorch==1.8.0 torchvision==0.9.0 torchaudio==0.8.0 cudatoolkit=10.2 -c pytorch -y
pip install --ignore-installed imageio
pip install insightface==0.2.1 onnxruntime moviepy # 比较慢而且会报出一些红色的ERROR,暂且跳过不用管。不管不行会报错
pip install onnxruntime-gpu
pip install opencv-python

我的环境!!!

'''我的安装教程'''
conda create -n simswap python=3.8 -y
conda activate simswap
conda install pytorch torchvision torchaudio pytorch-cuda=11.7 -c pytorch -c nvidia -y
pip install --ignore-installed imageio
pip install insightface==0.2.1 onnxruntime moviepy	#成功
pip install onnxruntime-gpu # 成功

之后会遇到:

  • ValueError: This ORT build has [‘TensorrtExecutionProvider’, ‘CUDAExecutionProvider’, ‘CPUExecutionProvider’] enabled. Since ORT 1.9, you are required to explicitly set the providers parameter when instantiating InferenceSession. For example, onnxruntime.InferenceSession(…, providers=[‘TensorrtExecutionProvider’, ‘CUDAExecutionProvider’, ‘CPUExecutionProvider’], …)
  • 解决办法:将anaconda3/envs/simswap/lib/python3.8/site-packages/insightface/model_zoo/model_zoo.py的第23行的session = onnxruntime.InferenceSession(self.onnx_file, None)改为session = onnxruntime.InferenceSession(self.onnx_file, None, providers=['TensorrtExecutionProvider', 'CUDAExecutionProvider', 'CPUExecutionProvider'])

还会遇到

  • AttributeError: module ‘numpy’ has no attribute ‘float’.
    np.float was a deprecated alias for the builtin float. To avoid this error in existing code, use float by itself. Doing this will not modify any behavior and is safe. If you specifically wanted the numpy scalar type, use np.float64 here.
    The aliases was originally deprecated in NumPy 1.20; for more details and guidance see the original release note at:
    https://numpy.org/devdocs/release/1.20.0-notes.html#deprecations
  • 解决方案成功解决AttributeError: module ‘numpy‘ has no attribute ‘float‘.

至此环境配置完毕!下面是所需要的checkpoint。

  1. 然后下载antelope.zip,解压到./insightface_func/models(需要新建文件夹models)
    这是使用Insightface的面部检测和对齐方法进行图像预处理。
  2. 下载79999_iter.pth然后放到./parsing_model/checkpoint(需要新建文件夹checkpoint)
    这是使用来自 face-parsing.PyTorch 的人脸解析进行图像后处理。
  3. 下载arcface_checkpoint.tar然后新建一个arcface_model文件夹,直接将arcface_checkpoint.tar放入。
    下载checkpoints.zip或者512.zip(建议直接下一个512体验高清就行了) 然后新建一个checkpoints文件夹,直接将512.zip解压放入,里面是一个550000_net_G.pth文件
    注意2023-04-25:修复了"AttributeError: ‘SGD’ object has no attribute ‘defaults’ now" 错误。如果您已经下载了arcface_checkpoint.tar,请重新下载。此外,您还需要更新 ./models/ 中的脚本。

至此环境准备结束。

Inference for image or video face swapping

先试试环境是否有问题,图片是代码包中给的。我用的是512的checkpoint,无水印,a是源脸,b是目标脸。输出到./output/result_whole_swapsingle.jpg

python test_wholeimage_swapmulti.py --no_simswaplogo  --crop_size 512 --use_mask  --name people --Arc_path arcface_model/arcface_checkpoint.tar --pic_a_path ./demo_file/Iron_man.jpg --pic_b_path ./demo_file/multi_people.jpg --output_path ./output/

如图是可以成功换脸的:(为了方便查看将图像裁剪到了128x128)
SimSwap复现指引及代码分析【2023有更新】_第1张图片SimSwap复现指引及代码分析【2023有更新】_第2张图片
SimSwap复现指引及代码分析【2023有更新】_第3张图片

Inference参数解析

参数 函数
–name SimSwap 训练日志名称
–pic_a_path 要交换的源面图像路径
–pic_b_path 目标人脸图像路径
–pic_specific_path 待交换特定面孔的图像路径
–multisepcific_dir 用于多特定面交换的图像文件夹路径
–video_path 与源面互换的视频路径
–temp_path 存放中间文件的路径
–output_path 换脸结果存放目录路径
–no_simswaplogo 控制是否去水印的超参数
–use_mask 控制是否使用人脸解析的超参数,视觉效果更好(推荐使用)

Inference用法示例

--crop_size 224表示图像预处理,相应的改为--crop_size 512也是一样。不加--crop_size就是对已经面部对齐的图像进行简单的面部交换。
加上--no_simswaplogo就是无水印。

图像

  • 仅交换一张图像中的一张脸(人脸检测置信度最高的一张)。结果将保存到 ./output/result_whole_swapsingle.jpg
python test_wholeimage_swapsingle.py --crop_size 224 --use_mask  --name people --Arc_path arcface_model/arcface_checkpoint.tar --pic_a_path ./demo_file/Iron_man.jpg --pic_b_path ./demo_file/multi_people.jpg --output_path ./output/ 
  • 交换一张图片中的所有面孔。结果将保存到 ./output/result_whole_swapmulti.jpg
python test_wholeimage_swapmulti.py --crop_size 224 --use_mask  --name people --Arc_path arcface_model/arcface_checkpoint.tar --pic_a_path ./demo_file/Iron_man.jpg --pic_b_path ./demo_file/multi_people.jpg --output_path ./output/ 
  • 交换一张图片中的特定面孔。结果将保存到 ./output/result_whole_swapspecific.jpg
python test_wholeimage_swapspecific.py --crop_size 224 --use_mask  --name people --Arc_path arcface_model/arcface_checkpoint.tar --pic_a_path ./demo_file/Iron_man.jpg --pic_b_path ./demo_file/multi_people.jpg --output_path ./output/ --pic_specific_path ./demo_file/specific2.png 
  • 在一个图像中交换具有多个特定 ID 的多个特定面部。结果将保存到 ./output/result_whole_swap_multispecific.jpg
python test_wholeimage_swap_multispecific.py --crop_size 224 --use_mask  --name people --Arc_path arcface_model/arcface_checkpoint.tar --pic_b_path ./demo_file/multi_people.jpg --output_path ./output/ --multisepcific_dir ./demo_file/multispecific 

视频

  • 只交换视频中的一张脸(人脸检测置信度最高的那一张)。
python test_video_swapsingle.py --crop_size 224 --use_mask --name people --Arc_path arcface_model/arcface_checkpoint.tar --pic_a_path ./demo_file/Iron_man.jpg --video_path ./demo_file/multi_people_1080p.mp4 --output_path ./output/multi_test_swapsingle.mp4 --temp_path ./temp_results 
  • 交换视频中的所有面孔。
python test_video_swapmulti.py --crop_size 224 --use_mask --name people --Arc_path arcface_model/arcface_checkpoint.tar --pic_a_path ./demo_file/Iron_man.jpg --video_path ./demo_file/multi_people_1080p.mp4 --output_path ./output/multi_test_swapmulti.mp4 --temp_path ./temp_results 
  • 交换视频中的特定面孔。
python test_video_swapspecific.py --crop_size 224 --use_mask --pic_specific_path ./demo_file/specific1.png --name people --Arc_path arcface_model/arcface_checkpoint.tar --pic_a_path ./demo_file/Iron_man.jpg --video_path ./demo_file/multi_people_1080p.mp4 --output_path ./output/multi_test_specific.mp4 --temp_path ./temp_results 

换脸时,需要给出换脸人的照片。然后将图片路径分配给参数“–pic_specific_path”。这张图片应该是正面,并且展示了整个头部和颈部,可以帮助准确换脸(如果你还不知道如何选择图片,可以参考./demo_file/specific*.png).如果这张图是从要改的视频里截的就更好了。

  • 在视频中用多个特定 ID 交换多个特定面孔。
python test_video_swap_multispecific.py --crop_size 224 --use_mask  --name people --Arc_path arcface_model/arcface_checkpoint.tar --video_path ./demo_file/multi_people_1080p.mp4 --output_path ./output/multi_test_multispecific.mp4 --temp_path ./temp_results --multisepcific_dir ./demo_file/multispecific 

您分配给“–multisepcific_dir”的文件夹应该如下所示:

$Your folder name$

├── DST_01.jpg(png)
└── DST_02.jpg(png)
└──...
└── SRC_01.jpg(png)
└── SRC_02.jpg(png)
└──...

结果就是视频中SRC_01.jpg(png)对应的人脸会被DST_01.jpg(png)对应的人脸替换掉。然后将SRC_02.jpg(png)对应的字符替换为DST_02.jpg(png)的人脸,以此类推。注意使用自己的数据命名时,不要去掉SRC_(DST_)01.jpg(png)中的0等。

总体可以记忆为:一换一,一换具体一,一换具体多,具体多换具体多。四种

2、结果分析

  • 源脸的脸型几乎没有传递到目标脸,也就是说直接重用目标脸的脸型,如果两张图片脸型相差过大效果就不好了。
  • 清晰度不高,肤色也没变,光照保存的也一般,还有很多问题。
  • 不过很多方法是可以借鉴的。

3、代码分析

打算下一篇博客写按照论文的pipeline梳理一遍代码,感兴趣的可以follow一下。

你可能感兴趣的:(CV,python,pytorch,开发语言,AI换脸,Face,Swapping)