如何用 ModelScope 实现 “AI 换脸” 视频
前言
当下,视频内容火爆,带有争议性或反差大的换脸视频总能吸引人视线。虽然 AI 换脸在市面上已经流行了许久,相关制作工具或移动应用也是数不胜数。但是多数制作工具多数情况下不是会员就是收费,而且替换模板有限。以下在实战的角度,用阿里 ModelScope 的图像人脸融合实现一下 AI 视频换脸。

流程
提供一段视频和一张替换的人脸图片,用 opencv-python 将视频根据帧率拆成图片,用 FFmpeg 提取视频里的音频为单独文件 (mp3)。遍历目录下的每一帧的图片,通过 ModelScope 的人脸融合模型,传入新的人脸和帧率图片,得到替换过人脸的帧图片。最后再通过 opencv-python 将替换的人脸图片组合成新视频,FFmpeg 添加提取出的音频文件。
环境
1. Python 3.7.16
2. ModelScope 1.4.2
3. OpenCV-Python 4.7.0
4. FFmpeg 12.2.0
环境安装
1. Python 虚拟环境添加
conda create -n modelscope python=3.7 && conda activate modelscope
2. 安装 ModelScope,使用了国内镜像源
pip install modelscope --upgrade -i https://pypi.tuna.tsinghua.edu.cn/simple
3. 安装 OpenCV
pip install opencv-python -i https://pypi.tuna.tsinghua.edu.cn/simple
4. 安装 FFmpeg
因为单是图片用不上,所以安装方法放在下面视频换脸里
图片换脸
1. 素材准备
我这里分别准备了一个画面里出现正脸,侧脸和两张脸的图片,然后分别用一张图片替换,最后运行代码查看效果。(可能是模型原因,感觉光看图片的换脸好像相差不大,倒有点像只是开了个美颜,也有可能是俩演员有点像,认真看还有有点不同)。

2. 代码部分
import cv2
from modelscope.outputs import OutputKeys
from modelscope.pipelines import pipeline
from modelscope.utils.constant import Tasksimage_face_fusion = pipeline(Tasks.image_face_fusion, model='damo/cv_unet-image-face-fusion_damo')
template_path = '181.jpg'
user_path = 'face.jpg'
result = image_face_fusion(dict(template=template_path, user=user_path))cv2.imwrite('result.png', result[OutputKeys.OUTPUT_IMG])
print('finished!')


视频换脸
1. FFmpeg 安装
如果是 windows10 可以按我下面的选择,shared 是动态版本,不带的是静态版本,所有的功能都集合在一起。

2. FFmpeg 环境配置
下载后解压会生成一下目录,将 bin 文件放入电脑环境变量中,然后通过 ffmpeg -version 查看是否安装成功。

3. FFmpeg 用法
3.1. 从视频中抽取音频 (输入视频和输出音频的地址可以是相对路径)
ffmpeg -i videos\11.mp4 -q:a 0 -map a audio\audio.mp3
3.2. 将独立音频文件添加到视频里 (接收输入视频,输入音频,输出新视频)
ffmpeg -i videos/ldh.mp4 -i audio/audio.mp3 -c:v copy -c:a aac -strict experimental videos/new_ldh.mp4
4. 开始编码
from pathlib import Path
import cv2
import osdef video2mp3_img(video_path, save_path):def video_split(video_path, save_path):if not os.path.exists(save_path):os.makedirs(save_path)cap = cv2.VideoCapture(video_path)i = 0while True:ret, frame = cap.read()if ret:cv2.imwrite(save_path + '/' + str(i) + '.jpg', frame)i += 1else:breakcap.release()if not os.path.exists(save_path):os.makedirs(save_path)# 视频分割video_split(video_path, save_path)# 视频转音频os.system("ffmpeg -i {} -q:a 0 -map a {}/audio.mp3".format(video_path, save_path))def face_replace(user_path=""):from pathlib import Pathimport cv2from modelscope.outputs import OutputKeysfrom modelscope.pipelines import pipelinefrom modelscope.utils.constant import Tasksimport osos.environ['KMP_DUPLICATE_LIB_OK'] = 'True'def my_function(img_path):image_face_fusion = pipeline(Tasks.image_face_fusion, model='damo/cv_unet-image-face-fusion_damo')template_path = img_pathfilename = os.path.splitext(os.path.basename(img_path))[0]# 替换面部依赖result = image_face_fusion(dict(template=template_path, user=user_path))cv2.imwrite(f'video_imgout/{filename}.jpg', result[OutputKeys.OUTPUT_IMG])threads = []BASE_PATH = os.path.dirname(__file__)for dirpath, dirnames, filenames in os.walk(r"D:\3code\3Python\modelscope\mv_face_change-main"):for filename in filenames:print(filename)if filename.endswith('.jpg'):file_path = Path(os.path.join(dirpath, filename))print(file_path)my_function(str(file_path))def img2mp4(video_path, save_name):BASE_PATH = "D:\3code\3Python\modelscope\mv_face_change-main"img = cv2.imread("video_img/0.jpg")imgInfo = img.shapesize = (imgInfo[1], imgInfo[0])files = []for dirpath, dirnames, filenames in os.walk(r"D:\3code\3Python\modelscope\mv_face_change-main\video_imgout"):for filename in filenames:fileName = Path(os.path.join(dirpath, filename))files.append(os.path.join(dirpath, filename))files = [file.replace('\\', '/') for file in files]files.sort(key=lambda x: int(x.split('/')[-1].split('.')[0]))fourcc = cv2.VideoWriter_fourcc(*'mp4v')videoWrite = cv2.VideoWriter(r"D:\3code\3Python\modelscope\mv_face_change-main\videos\ldh.mp4", fourcc, 25, size) # 写入对象 1 file name 3: 视频帧率for i in files:print(i)img = cv2.imread(str(i))videoWrite.write(img)# 将video_img中的音频文件添加到视频中os.system("ffmpeg -i {} -i {} -c:v copy -c:a aac -strict experimental {}".format("videos/ldh.mp4", "audio/audio.mp3", "videos/newlest_ldh.mp4"))if __name__ == '__main__':BASE = os.path.dirname(__file__)video_path = os.path.join(BASE, "videos/demo.mp4") save_path = os.path.join(BASE, "video_img") # 视频 ==> imgsvideo2mp3_img(video_path, save_path)# 人脸替换face_replace(user_path='zsy.jpg')# imgs ==> 视频img2mp4(video_path, save_name='zsy')
5. 报错汇总
当运行上面代码,如果出现 Output file does not contain any stream,那就是分离音频或追加音频到视频的这两个地方报的错误,大部分情况下输出路径不正确或命令参数不对。还有一个错误我没有记录,就是让视频压根没有声音,再执行分离操作时也会报错。这个是我上班时随便拿的视频测试 (因为不能戴耳机,刚好视频就是没声音的),所以使劲测使劲报错,换了视频就好了,关键是错误提示也没说是视频没声音。
6. 效果演示
由于时间原因,没有用杨过的视频,就用没有声音的视频做了换脸演示。以后还要对换脸图片替换做多线程处理。



相关文章:
如何用 ModelScope 实现 “AI 换脸” 视频
前言 当下,视频内容火爆,带有争议性或反差大的换脸视频总能吸引人视线。虽然 AI 换脸在市面上已经流行了许久,相关制作工具或移动应用也是数不胜数。但是多数制作工具多数情况下不是会员就是收费,而且替换模板有限。以下在实战的角…...
怎么样成为一名Python工程师?到底要会哪些东西?你会了多少?
目录 重点:爬虫部分项目、源码展示python数据分析可视化大屏看板python爬虫爬取淘宝卤鸭货商品数据python游戏开发python自动化办公 重点: 1、做一名程序员,绝对要耐得住寂寞,并且要一直有点兴趣促进你学习。如果你完全没兴趣&am…...
项目前期1.0
今天是项目的第二天 昨天一顿迷茫,可恶 今天啥也不关先来点基本的构架 #include<queue>//队列 #define FALSE 0 #define TRUE 1 #define ERROR 0 #define OK 1 #define nocnect 999999//未链接的距离 #define maxplace 31//景区的观景点的最大个30数不要0下标的 #defi…...
MySQL语句执行耗时分析
MySQL语句执行耗时分析 MySQL Profile查看SQL执行各阶段耗时Performance Schema查看SQL执行各阶段耗时配置收集哪些用户的SQL执行信息开启SQL执行信息收集的相关特性执行目标SQL获取SQL执行的EVENT_ID获取SQL执行各阶段耗时 MySQL Profile查看SQL执行各阶段耗时 --开启SQL Pro…...
FVM链的Themis Pro(0x,f4) 5日IDO超百万美元,领Filecoin重回高点
交易一直是 DeFi 乃至web3领域最经久不衰的话题,也因此催生了众多优秀的去中心化协议,如 Uniswap 和 Curve。这些协议逐渐成为了整个系统的基石。 在永续合约方面,DYDX 的出现将 WEB2 时代的订单簿带回了web3。其链下交易的设计,仿…...
【PMP】优秀的项目经理如何做好范围管理?
范围管理是项目管理中的一个专用词汇,它的主要任务是界定项目包含且只包含所有需要完成的工作,并对项目其他管理工作起到指导作用,以保证顺利完成项目的所有过程。确定了项目范围,也就确定了项目的工作边界,明确了项目…...
【Linux】 密码相关。pwconv
密码相关。pwconv 在linux中,早期的用户密码(经过加密)存放在/etc/passwd文件之中,但是大多数的应用程序通常都需要读取这个文件,所以会造成一定的安全隐患 因此后来的linux(centos)系统将这个…...
揭秘阿里新大招:大模型只是前菜
技术的代际变革往往对商业格局产生深远影响。眼下,随着产业各界对大模型的投入布局加深,一个业界共识逐渐诞生:大模型正在改变云生态,将为云计算行业带来新的奇点。 在过去的一段时间里,市场研究机构IDC在2022年底的预…...
【U8+】win10/11系统注册用友U8硬加密
【问题需求】 由于用友U813.0及之前版本都是硬加密, 并且注册的时候严格要求使用IE浏览器。 但是随着系统的升级,绝大多数的都开始使用win10/11系统。 并且IE浏览器已经不支持win10/11系统, 取而代之的是Edge浏览器。 【经验分享】 以下分享…...
SQL Server 服务器安装配置和使用
目录 一、SQL Server概述 1、SQL Server 环境需求 2、SQL Server的特点和组成 (1)SQL Server 特点 (2)SQL Server 基本组成 3、SQL Server 安装需注意 (1)数据文件的存储位置 (2…...
Spring常见面试题汇总
文章目录 在Spring中,Bean的作用域有哪几个?SpringMVC的执行流程你知道吗?谈谈你对Spring IOC的理解?DI又是什么?谈谈你对Spring AOP的理解?Spring Bean的生命周期你能说出多少?Spring如何解决循…...
javaEE汽车用油加油站销售管理系统servlet
经过我的实地考察,我发现现在的销售管理有以下弊端: (1)、大多数都是人工记录,人工开票,这样既费时费力,还费财; (2)、由于品种种类的增多,记录货品的资料变得麻烦; (3)、对一些顾客…...
CSS动画
CSS中的动画类型 transition补间动画(有开头有结尾,浏览器自己补中间) 要求元素状态有变化,如hover .container{width:100px;height:100px;background:red;transition:width 1s;/*transition-delay:1s 延迟一秒再动*//*tranisi…...
《花雕学AI》21:ChatGPT能否应对脑筋急转弯?逻辑推理和创造性思维的大考验!
当我们谈到脑筋急转弯时,很多人都会感到兴趣和好奇。脑筋急转弯是一种智力游戏,可以锻炼我们的思维能力以及解决问题的能力。然而,对于许多人来说,脑筋急转弯也是一项相当具有挑战性的任务。在这个过程中,我们需要运用…...
【Vue】学习笔记-列表渲染/数据监视
列表渲染/数据监视 基本列表Key的作用与原理列表过滤列表排序Vue 数据监视原理 基本列表 v-for指令 用于展示列表数据语法:v-for“(item,index) in xxx” :key“yyy”可遍历:数组,对象,字符串(用的很少)&…...
人工标注或成过去式?SSA语义分割框架、SSA-engine自动类别标注引擎,大幅提升细粒度语义标注效率
推荐语 4月5日,Meta发布 Segment Anything 模型和 SA-1B 数据集,引发CV届“地震”,其凭借一己之力,成功改写了物体检测、数据标注、图像分割等任务的游戏规则。 复旦大学ZVG实验室团队基于此最新开源了SSA语义分割框架和SSA-engin…...
远程工具在哪里打开?使用教程
在现在的互联网时代,越来越多的人开始采用远程工具来处理工作。无论你是在家里还是在办公室,使用远程工具可以让你更加高效地完成工作,同时也可以帮助你与其他人更好地沟通。但是,对于一些新手来说,使用远程工具可能会…...
HBase高手之路7—HBase之全文检索Phoneix
文章目录 HBase之全文检索Phoenix一、全文检索二、全文检索工具phoenix简介1. 简介2. 使用Phoenix是否会影响HBase性能3. 哪些公司在使用Phoenix4. 官方性能测试4.1 Phoenix对标Hive(基于HDFS和HBase)4.2 Phoenix对标Impala4.3 关于上述官网两张性能测试…...
城镇水务系统碳减排路径|雨水系统
1.1 雨水系统 1.1.1碳减排路径分析 雨水系统碳排放主要来自于规划建设阶段。在压力流系统以及低洼点位排水过程中,随着水泵使用也会造成一定碳排放。在雨水系统规划建设过程中,应优先使用绿色基础设施、绿色建材;在运行过程中,雨…...
摆花
[NOIP2012 普及组] 摆花 题目描述 小明的花店新开张,为了吸引顾客,他想在花店的门口摆上一排花,共 m m m 盆。通过调查顾客的喜好,小明列出了顾客最喜欢的 n n n 种花,从 1 1 1 到 n n n 标号。为了在门口展出更…...
通义千问1.5-1.8B-Chat-GPTQ-Int4在MySQL数据库中的智能应用
通义千问1.5-1.8B-Chat-GPTQ-Int4在MySQL数据库中的智能应用 让数据库听懂人话,让查询像聊天一样简单 你有没有遇到过这样的情况:面对复杂的业务数据,明明知道想要什么结果,却不知道怎么写SQL语句?或者看着慢查询日志头…...
用快马平台5分钟构建qoderwork理念下的待办事项应用原型
最近在研究qoderwork这个概念,简单来说就是通过AI辅助快速把想法变成可运行的代码原型。正好用InsCode(快马)平台试了下做个待办事项应用,整个过程比想象中顺畅很多,分享下具体实现思路。 整体框架搭建 首先确定基础HTML结构,分为…...
Navicat数据库自动备份实战:如何设置定时任务避免数据丢失
Navicat数据库自动备份实战:如何设置定时任务避免数据丢失 数据是现代企业的核心资产,一次意外的数据丢失可能造成难以估量的损失。作为数据库管理工具中的佼佼者,Navicat提供了强大的自动备份功能,能够帮助中小企业和个人开发者建…...
[ linux添加应用图标到桌面 ] : 中将应用程序添加图标(快捷方式 ),并放置任务栏中,.desktop文件使用
.desktop文件格式在你的主目录中打开终端(ctrlaltt),接着输入以下代码:touch test.desktop vim test.desktop这里我选择的是vim的编辑方式,当然如果你没有vim或者说不太熟练的话,你可以直接双击打开该文件。代码解释:t…...
消息防撤回方案:RevokeMsgPatcher的通讯内容保护实践
消息防撤回方案:RevokeMsgPatcher的通讯内容保护实践 【免费下载链接】RevokeMsgPatcher :trollface: A hex editor for WeChat/QQ/TIM - PC版微信/QQ/TIM防撤回补丁(我已经看到了,撤回也没用了) 项目地址: https://gitcode.com…...
Cursor Pro免费激活指南:3步解锁AI编程工具的完整功能
Cursor Pro免费激活指南:3步解锁AI编程工具的完整功能 【免费下载链接】cursor-free-vip [Support 0.45](Multi Language 多语言)自动注册 Cursor Ai ,自动重置机器ID , 免费升级使用Pro 功能: Youve reached your tri…...
效率翻倍,一键生成企业级vue3+ts+pinia项目脚手架,告别重复环境配置
最近在搭建一个企业级中后台管理系统时,发现从零开始配置Vue3项目环境特别耗时。传统方式需要手动安装各种依赖、配置代码规范、设计目录结构,经常因为版本兼容问题卡住半天。后来尝试用InsCode(快马)平台生成项目脚手架,效率直接翻倍&#x…...
LPDDR4X引脚功能详解:从CK到DQS,这些信号线你都用对了吗?
LPDDR4X引脚功能深度解析:信号完整性设计与实战避坑指南 在移动设备和高性能嵌入式系统中,LPDDR4X内存已成为主流选择。但许多硬件工程师在实际设计中常陷入"信号连通即可"的误区,导致系统稳定性问题频发。本文将带您深入理解每个…...
长期用嘴呼吸,颈肩肌肉代偿性紧张
很多人因为鼻塞、习惯等原因长期用嘴呼吸,却不知道这会导致颈肩肌肉代偿性紧张,影响颈腰椎健康。用嘴呼吸时,头部会不自觉地向前伸、仰起,颈椎长期处于过度前屈或后伸状态,颈部肌肉持续牵拉,容易导致肌肉劳…...
WebGL开发者必备:用RenderDoc旧版本抓帧调试的完整避坑指南(附DEBUG_CHROME.bat脚本)
WebGL开发者必备:用RenderDoc旧版本抓帧调试的完整避坑指南(附DEBUG_CHROME.bat脚本) 最近在WebGL开发中遇到一个棘手问题:最新版RenderDoc已经禁止了对Chrome等浏览器的抓帧功能。这对于正在学习图形学课程(比如GAMES…...
