FaceFusion源码框架解读

news2024/10/7 12:23:31

FaceFusion源码框架解读

我的视频讲解:FaceFusion入门教学

FaceFusion官网

FaceFusion是一款开源的AI换脸工具,一款非常好用的换脸工具,操作简单,上手容易。
Facefusion:GitHub - facefusion/facefusion: Next generation face swapper and enhancer
Facefusion官方教程:Introduction - FaceFusion

云端部署FaceFusion

自己没有好的算力,推荐用 众聚云,有windows桌面,方便操作。

众聚云网址:GPULab算力云-Ai算力租赁/GPU服务器租赁/远程显卡租赁/CPU租赁

开启部署环境:快速部署GPU Cloud 云主机

文末加V,可以领取优惠券。
在这里插入图片描述

源码

整个代码,整体分为以下3个部门做解读

  • 界面交互-事件绑定
  • 算法处理模块
  • 业务-算法处理层

大方向

  • 每个控件都是全局的
  • 控件对应的值,也设计成了全局的
  • 代码有3个core.py, core的代码是作为代码上下文沟通的桥梁,这个设计很nice,值得学习
  • 有Python实现多态的味道,要实现的函数,作者还做了自检
  • 主程序core - 界面core - 算法core重点关注这三个文件的交互, 有Get到些东西

界面交互-事件绑定

uis

3个layout,不同处理功能。
在这里插入图片描述
在benchmark.py,default.py,webcam.py中, 要做的事情 就是控件布局。

重要文件:facefusion\uis\core.py
core核心思想:中间桥梁-接口

UI_LAYOUT_METHODS =\
[
	'pre_check',
	'pre_render',
	'render',
	'listen',
	'run'
]


def load_ui_layout_module(ui_layout : str) -> Any:
	try:
		ui_layout_module = importlib.import_module('facefusion.uis.layouts.' + ui_layout)
		for method_name in UI_LAYOUT_METHODS:
			if not hasattr(ui_layout_module, method_name):
				raise NotImplementedError
	except ModuleNotFoundError as exception:
		logger.error(wording.get('ui_layout_not_loaded').format(ui_layout = ui_layout), __name__.upper())
		logger.debug(exception.msg, __name__.upper())
		sys.exit(1)
	except NotImplementedError:
		logger.error(wording.get('ui_layout_not_implemented').format(ui_layout = ui_layout), __name__.upper())
		sys.exit(1)
	return ui_layout_module

这个片段的代码,比较有意思,首先layout[benchmark.py,default.py,webcam.py]中要实现的函数:5个函数

UI_LAYOUT_METHODS =\
[
	'pre_check',
	'pre_render',
	'render',
	'listen',
	'run'
]

在layout[benchmark.py,default.py,webcam.py]中,代表着3个不同的layout,里面都要实现上面5个函数,因为作者想动态加载界面,有点C++多态的味道。

函数 load_ui_layout_module,也就是动态加载界面,主程序通过core.py, 去构建UI。也就是说core是uis模块与外界沟通的接口,桥梁。
作者挺喜欢的设计方式,下文会再次用到这样的设计。

也就是:
uis-core的代码,就是 uis构建的逻辑,外部只需要关心core的代码,内部的代码不用考虑。

components

定义组件,如果你想添加自己的组件,就放到下面,然后在layouts中,使用你添加的组件
在这里插入图片描述
在components中,每一个components都要定义两个函数

  • render()渲染
  • listen() 监听

render() 构建界面控件。全部的控件都定义成了全局的,因为某一个控件变化时,需要根据控件名称去更新对应的控件。

listen() 控件和响应事件绑定。

这页面,从控件的定义, 布局,事件绑定代码规划的很清晰。 后期再添加新功能时,只需要按套路往里面写就可以,代码不会乱。

算法处理模块

在这里插入图片描述
六个文件,六个功能

face_debugger.py 调试功能
face_enhancer.py 人脸增强功能
face_swapper.py 换脸功能
frame_colorizer.py 帧的颜色功能
frame_enhancer.py 帧的增强功能
lip_syncer.py 嘴唇同步功能

这部分的代码,有一定的统一性,他们都要实现以下方法:

FRAME_PROCESSORS_METHODS =\
[
	'get_frame_processor',
	'clear_frame_processor',
	'get_options',
	'set_options',
	'register_args',
	'apply_args',
	'pre_check',
	'post_check',
	'pre_process',
	'post_process',
	'get_reference_frame',
	'process_frame',
	'process_frames',
	'process_image',
	'process_video'
]

这些方法,将会在业务处理的core中,被动态的调用,类似于C++中的多态。
这里面的函数,只是一个封装,具体的业务处理代码,作者放在了外部:
在这里插入图片描述

也就是processors中的处理器,会调用外部的具体业务处理代码,完成事件处理。

重要文件:facefusion\processors\frame\core.py
core核心思想:中间桥梁-接口,这里再次用到这样的思想,去构建代码。


def load_frame_processor_module(frame_processor : str) -> Any:
	try:
		frame_processor_module = importlib.import_module('facefusion.processors.frame.modules.' + frame_processor)
		for method_name in FRAME_PROCESSORS_METHODS:
			if not hasattr(frame_processor_module, method_name):
				raise NotImplementedError
	except ModuleNotFoundError as exception:
		logger.error(wording.get('frame_processor_not_loaded').format(frame_processor = frame_processor), __name__.upper())
		logger.debug(exception.msg, __name__.upper())
		sys.exit(1)
	except NotImplementedError:
		logger.error(wording.get('frame_processor_not_implemented').format(frame_processor = frame_processor), __name__.upper())
		sys.exit(1)
	return frame_processor_module

在使用六个功能时,根据“模块名称”去导入,同时,还要检查方法是否实现,这个思路平时写代码用的少,在这里学习到了,真的有点 Python的多态感。

这里的设计有点意思,上面我们提到的六个功能,在对外别的代码被调用时,不能直接引用过去,而是通过 facefusion\processors\frame\core.py中的函数load_frame_processor_module导入。

也就是说 你在全部的代码中是看不到:import facefusion.processors.modules.xxx的代码的。

这里有学到一个点,通过core,统一对外提供功能接口。


加群交流,备注:进AIGC群
在这里插入图片描述

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

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

相关文章

最新Adaptive特征融合策略,涨点又高效,想发表论文可以参考

自适应特征融合是一种非常高效的数据处理方法,它比传统的特征更能适应不同的数据和任务需求,也因此拥有广泛的应用前景,是深度学习领域的研究热点。 这种方法通过动态选择和整合来自不同层次或尺度的特征信息,不仅显著提升了模型…

USB抓包工具:bushound安装及使用

一、环境搭建 下载busbound6.01安装包,安装完成,重启电脑。 二、工具配置 按照下图配置工具: 使能自动识别新设备 2. 设置抓取数据的容量 三、抓包 回到capture选项卡,在页面的右下角有个run的按钮,点击使能&…

nacos-opera(k8s)安装问题解决

整理一些关于k8s部署nacos出现的一些恶心的问题 网上说其他说的更改数据库连接都未解决。 在用nacos-opera想安装高可用nacos时连接mysql数据库报错: 报错具体项: No DataSource set 具体就是说没找到数据源。 第一个 检查一下nacos连接数据库配置 : 第二个 检查一下数据库…

视频监控汇聚平台LntonCVS通过GB/T28181国标协议实现视频监控平台的级联方案

近年来,随着网络视频监控应用范围的拓展,越来越多的政府部门和跨区域行业单位对视频监控的需求已经不局限于本地联网监控。他们正在探索在原有的本地联网监控基础上,建设省级乃至全国范围内的跨区域监控联网,以全面打造数据共享平…

【Unity2D:C#Script】实现角色射击功能

一、创建子弹预制体 1. 创建子弹预制体 2. 调整图片大小、层级 二、为子弹添加碰撞体积 1. 添加Box Collider 2D、Rigidbody 2D组件 2. 锁定z轴 三、编辑敌人脚本 注:在以下代码中,只显示本章节新增的代码,省略原有的代码 1. 为敌人添加生…

安科瑞为河南省促进分布式光伏发电健康持续发展提供解决方案

1 光伏、储能运维市场分析 在光伏、储能行业飞速发展的同时,已建的光伏、风力发电站和储能系统的监控、运维管理项目的招标也非常多,2023年上半年,光伏电站开发企业运维招标规模28.6GW,同比增长204.3%,上述28.6GW招标…

抖店一件代发,从0到1操作全流程

我是王路飞。 先说明一点,新手不需要纠结抖店一件代发(即无货源模式)还能不能做的问题。 无货源只是前期帮助新手阶段的你进入到这个市场里来的一种方式,不是你长期做店的思路。 入门之后,基本就转型为有货源去玩了…

深度学习之基于暗通道算法+卷积神经网络图像去雾可视化系统

欢迎大家点赞、收藏、关注、评论啦 ,由于篇幅有限,只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 一、项目背景与意义 在图像处理领域,图像去雾技术一直是一个重要的研究方向。由于雾霾等天气条件的影响…

vue项目中如何使用iconfont

导读:vue项目中引入iconfont的方式 iconfont 的三种使用方法 unicode 不常用Font class 像字体一样使用,默认黑色图标,无法修改颜色Symbol 支持多色图标,更灵活,推荐 一、unicode 略 二、Font class 方式一&#…

一般EI论文的格式是什么样的?

论文应该符合会议的提交要求和模板,包括页面格式、字体、字号、行距等。可以在特定会议的官方网站上找到详细的提交指南和模板。 EI会议论文的格式通常遵循以下基本结构: 标题和作者信息:论文标题应该简洁明了,能够准确概括您研究…

【金砖赛】基于docker搭链

一.基于docker搭建 启动并检查是否启动成功 #启动命令 sudo systemctl start docker#检查命令 sudo systemctl status docker修改权限 chomd 777 build_chain.sh 进行4节点联盟链搭建(举例) sudo ./build_chain.sh -d -l "127.0.0.1…

Java web应用性能分析之【高并发之缓存-多级缓存】

说到缓存,作为java开发第一时间想到的是不是上图所示的Redis,又或者是Guava Cache、Caffeine、EhCache这些;Redis作为分布式缓存、其他的可以作为本地缓存。但是作为一名资深开发人员,着眼的层面应该再提升一个级别,从…

云上聚智——移动云云服务器进行后端的搭建及部署

什么是移动云 移动云是指将移动设备和云计算技术相结合,为移动应用提供强大的计算和存储能力的服务模式。传统的移动应用通常在本地设备上进行计算和存储,而移动云将这些任务转移到云端进行处理。通过移动云,移动设备可以利用云端的高性能计算…

Linux程序开发(三):MakeFile编程及Githup项目编码

Tips:"分享是快乐的源泉💧,在我的博客里,不仅有知识的海洋🌊,还有满满的正能量加持💪,快来和我一起分享这份快乐吧😊! 喜欢我的博客的话,记得…

海外私人IP和原生IP有什么区别,谁更有优势?

一、什么是海外私人IP?什么是原生IP? 1、海外私人IP: 海外私人IP是由专门的服务提供商提供的IP地址,这些IP地址通常与特定地理位置或国家相关联。这些IP地址独享私人而不用与其他用户共享。海外私人IP访问特定国家或地区的网站&am…

新定义RD8T36P48使用USCI0的TWI功能点亮OLED

时间不多,因此先只给出工程,等有时间再添加详细说明 现象 这是从之前的一个51单片机的程序移植过来的,主要修改了IIC启动和停止,以及数据发送的代码,我现在还不是很满意的一点是发送过程中要等待上一个字节发送完才能…

如何通过OpenHarmony的音频模块实现录音变速功能?

简介 OpenAtom OpenHarmony(以下简称“OpenHarmony”)是由开放原子开源基金会孵化及运营的开源项目,是面向全场景、全连接、全智能时代的智能物联网操作系统。 多媒体子系统是OpenHarmony系统中的核心子系统,为系统提供了相机、…

hpc中查看显存占用,等效nvidia-smi

nvidia-smi在hpc中无法使用, 但是可以通过以下方法查看应用程序占用的显存 先执行程序,之后 bjobs输出 可以看到使用的是gpu01节点 之后 ssh gpu01

高刚性滚柱直线导轨有哪些优势?

滚柱导轨是机械传动系统中用于支持和引导滑块或导轨的装置,承载能力较高、刚性强及高精度等特点。特别适用于大负载和高刚性的工业设备,如机床、数控机床等设备,这些优势使其在工业生产和机械设备中得到了广泛的应用。 1、高精度:…