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

news2025/1/14 2:24:16

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)
请添加图片描述请添加图片描述
请添加图片描述

Inference参数解析

参数函数
–nameSimSwap 训练日志名称
–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一下。🥰🥰🥰

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/626932.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

33、js - 事件循环 微任务 宏任务

1、事件循环♻️(EventLoop) js是单线程语言,也就是某一刻只能执行一行代码,为了让耗时代码不阻塞其他代码运行,设计了事件循环模型。 事件循环是一个并发模型,负责执行代码、收集异步任务的模型&#xff0…

容器(第四篇)创建镜像-dockerfile

创建镜像有三种方法,分别为基于已有镜像创建、基于本地模板创建以及基于Dockerfile创建。 基于现有镜像创建: ①先使用现有镜像创建容器 docker run ②再进入容器进行内容更新 docker exec ③最后提交成新的镜像 docker commit 或 docker…

Linux远程管理工具(PuTTY和SecureCRT)

通过《Linux远程管理协议》一节可以知道,Linux远程管理服务器多基于 SSH 协议。本节给大家介绍 2 种常见的基于 SSH 协议的远程管理工具,分别是 PuTTY 和 SecureCRT。 在使用远程管理工具之前,应先设置宿主机 Windows 与虚拟机 Linux 能够连…

mysql 联合查询

mysql联合查询 联合查询:union,将多次查询(多条select语句)的结果,在字段数相同的情况下,在记录的层次上进行拼接。 基本语法 联合查询由多条select语句构成,每条select语句获取的字段数相同,但与字段类…

Seata介绍、原理、配置

目录 介绍: 核心组件: 原理: Seata 会有 4 种分布式事务解决方案,分别是 AT 模式、TCC 模式、Saga 模式和 XA 模式 AT模式原理: 一阶段: 二阶段提交: 二阶段回滚: Seata配置…

【轨迹跟踪】基于自适应跟踪(EAT)方法的无人机/移动机器人轨迹跟踪(MatlabSimulink)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

随着信息技术的快速发展,编程已经成为一个越来越重要的技能。那么,我们该如何入门编程呢?

*随着信息技术的快速发展,编程已经成为一个越来越重要的技能。那么,我们该如何入门编程呢? 一、自学编程需要注意什么? 自学编程需要注意以下几点: 设定清晰的学习目标:在开始学习编程前,你需…

chatgpt赋能python:Python在485读电表方面的应用

Python在485读电表方面的应用 介绍 近年来,随着智能电网和智慧城市的不断发展,越来越多的城市和企事业单位开始关注能源消费情况并采取有效管理手段,实现节能减排。而想要实现对能源消费情况的监测和控制,就需要能够对电表进行读…

Docker数据管理和网络通信

Docker 的数据管理 管理 Docker 容器中数据主要有两种方式:数据卷(Data Volumes)和数据卷容器(DataVolumes Containers)。 1.数据卷 数据卷是一个供容器使用的特殊目录,位于容器中。可将宿主机…

MQTT协议基本讲解(结合netty)

正文 前提MQTT结构可变报文头(Variable Header)有效负荷(payload)固定报文头(Fixed Header)消息类型(Message Type)QoS级别标志(0,1,2&#xff09…

Spring Cloud OpenFeign源码解析,代理的魅力一展无遗

文章目录 一、OpenFeign简介二、OpenFeign中Bean的动态装载1、EnableFeignClients2、registerFeignClients3、FeignClientFactoryBean.getObject4、loadBalance5、DefaultTarget.target6、ReflectiveFeign.newInstance生成代理(1)targetToHandlersByName…

C语言字符及字符串讲解

文章目录 前言一、字符介绍和使用二、字符串介绍和使用三、字符串操作函数四、字符串的长度和字符串所占内存空间的大小总结 前言 C 语言中的字符和字符串是常用的数据类型。字符是一个单个的字母、数字、标点符号或者其他可打印的符号,使用单引号 ’ ’ 表示&…

Linux route命令实战:route 命令实战教程,配置静态路由,删除路由表项

前言 大家好,又见面了,我是沐风晓月,本文是专栏【linux基本功-基础命令实战】的第61篇文章。 专栏地址:[linux基本功-基础命令专栏] , 此专栏是沐风晓月对Linux常用命令的汇总,希望能够加深自己的印象&am…

使用大型语言模(LLM)构建系统(四):链式提示

今天我学习了DeepLearning.AI的 Building Systems with LLM 的在线课程,我想和大家一起分享一下该门课程的一些主要内容。 下面是我们访问大型语言模(LLM)的主要代码: import openai#您的openai的api key openai.api_key YOUR-OPENAI-API-KEY def get_…

word如何转化为pdf格式?分享四个方法给大家!

在工作和学习中,经常需要对文档进行转换,其中将Word文档转换为PDF是最常见的格式转换之一。下面介绍几种常用的转换方法,包括使用记灵在线工具。 方法一:使用Word软件直接转换 如果你使用的是电脑上的Word软件,可以直…

vue3ts安装sass(scss)

序 1、我附上个sass的github(跟本教程无关)地址GitHub - sass/sass: Sass makes CSS fun! 2、博主本地环境 "vue": "^3.2.47", "typescript": "^5.0.2" "vite": "^4.3.9", node18.12.1 3、…

外贸企业必看!这五种企业邮箱最适合你的跨国业务需求

在当今的数字世界中,电子邮件的使用对任何外贸企业的成功都至关重要。在技术的冲击下,企业开展运营以及与客户、潜在客户和合作伙伴沟通的方式发生了巨大变化,电子邮件迅速成为外贸中首选的沟通方式。 说到哪种企业邮箱最适合外贸企业使用&am…

MATLAB使用技巧之局部放大图的制作及文本箭头的便捷设置

MATLAB使用技巧之局部放大图的制作及文本箭头的便捷设置 文章目录 MATLAB使用技巧之局部放大图的制作及文本箭头的便捷设置制作局部放大图的方法文本箭头的便捷设置小结 本文主要介绍如何在MATLAB中绘制局部放大图和如何便捷地设置文本箭头的相关内容,以作后续回顾之…

CISP-PTE2022最新考试经验分享

CISP_PTE2022年10月份考试心得体会 2022年9月份由于公司需要,参加了中启航的CISPPTE培训,总培训时间八天,8师傅讲的很好,浅显易懂,经过4天的理论学习和4天的实操练习,经过十一假期的熟练,我在10…

2005-2021年全国及31省绿色信贷水平(含原始数据和测算过程)

1、时间:2005-2021年 2、范围:全国及31省市 4、内容说明:包含原始数据、计算结果、计算过程 5、来源:工业NJ、2018年经济普查、其中2017年缺失已采用插值法补齐 6、计算说明: 选取各省六大高耗能产业利息支出占工…