光谷做网站推广费用,免费微信商城小程序,公司做网站是做什么账务处理,创业FaceFusion源码框架解读
我的视频讲解#xff1a;FaceFusion入门教学
FaceFusion官网
FaceFusion是一款开源的AI换脸工具#xff0c;一款非常好用的换脸工具#xff0c;操作简单#xff0c;上手容易。 Facefusion#xff1a;GitHub - facefusion/facefusion: Next gene…FaceFusion源码框架解读
我的视频讲解FaceFusion入门教学
FaceFusion官网
FaceFusion是一款开源的AI换脸工具一款非常好用的换脸工具操作简单上手容易。 FacefusionGitHub - 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.pydefault.pywebcam.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 NotImplementedErrorexcept 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.pydefault.pywebcam.py]中要实现的函数5个函数
UI_LAYOUT_METHODS \
[pre_check,pre_render,render,listen,run
]在layout[benchmark.pydefault.pywebcam.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 NotImplementedErrorexcept 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群