当前位置: 首页 > news >正文

如何用 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领域最经久不衰的话题&#xff0c;也因此催生了众多优秀的去中心化协议&#xff0c;如 Uniswap 和 Curve。这些协议逐渐成为了整个系统的基石。 在永续合约方面&#xff0c;DYDX 的出现将 WEB2 时代的订单簿带回了web3。其链下交易的设计&#xff0c;仿…...

【PMP】优秀的项目经理如何做好范围管理?

范围管理是项目管理中的一个专用词汇&#xff0c;它的主要任务是界定项目包含且只包含所有需要完成的工作&#xff0c;并对项目其他管理工作起到指导作用&#xff0c;以保证顺利完成项目的所有过程。确定了项目范围&#xff0c;也就确定了项目的工作边界&#xff0c;明确了项目…...

【Linux】 密码相关。pwconv

密码相关。pwconv 在linux中&#xff0c;早期的用户密码&#xff08;经过加密&#xff09;存放在/etc/passwd文件之中&#xff0c;但是大多数的应用程序通常都需要读取这个文件&#xff0c;所以会造成一定的安全隐患 因此后来的linux&#xff08;centos&#xff09;系统将这个…...

揭秘阿里新大招:大模型只是前菜

技术的代际变革往往对商业格局产生深远影响。眼下&#xff0c;随着产业各界对大模型的投入布局加深&#xff0c;一个业界共识逐渐诞生&#xff1a;大模型正在改变云生态&#xff0c;将为云计算行业带来新的奇点。 在过去的一段时间里&#xff0c;市场研究机构IDC在2022年底的预…...

【U8+】win10/11系统注册用友U8硬加密

【问题需求】 由于用友U813.0及之前版本都是硬加密&#xff0c; 并且注册的时候严格要求使用IE浏览器。 但是随着系统的升级&#xff0c;绝大多数的都开始使用win10/11系统。 并且IE浏览器已经不支持win10/11系统&#xff0c; 取而代之的是Edge浏览器。 【经验分享】 以下分享…...

SQL Server 服务器安装配置和使用

目录 一、SQL Server概述 1、SQL Server 环境需求 2、SQL Server的特点和组成 &#xff08;1&#xff09;SQL Server 特点 &#xff08;2&#xff09;SQL Server 基本组成 3、SQL Server 安装需注意 &#xff08;1&#xff09;数据文件的存储位置 &#xff08;2&#xf…...

Spring常见面试题汇总

文章目录 在Spring中&#xff0c;Bean的作用域有哪几个&#xff1f;SpringMVC的执行流程你知道吗&#xff1f;谈谈你对Spring IOC的理解&#xff1f;DI又是什么&#xff1f;谈谈你对Spring AOP的理解&#xff1f;Spring Bean的生命周期你能说出多少&#xff1f;Spring如何解决循…...

javaEE汽车用油加油站销售管理系统servlet

经过我的实地考察&#xff0c;我发现现在的销售管理有以下弊端&#xff1a; (1)、大多数都是人工记录&#xff0c;人工开票&#xff0c;这样既费时费力&#xff0c;还费财&#xff1b; (2)、由于品种种类的增多&#xff0c;记录货品的资料变得麻烦&#xff1b; (3)、对一些顾客…...

CSS动画

CSS中的动画类型 transition补间动画&#xff08;有开头有结尾&#xff0c;浏览器自己补中间&#xff09; 要求元素状态有变化&#xff0c;如hover .container{width:100px;height:100px;background:red;transition:width 1s;/*transition-delay:1s 延迟一秒再动*//*tranisi…...

《花雕学AI》21:ChatGPT能否应对脑筋急转弯?逻辑推理和创造性思维的大考验!

当我们谈到脑筋急转弯时&#xff0c;很多人都会感到兴趣和好奇。脑筋急转弯是一种智力游戏&#xff0c;可以锻炼我们的思维能力以及解决问题的能力。然而&#xff0c;对于许多人来说&#xff0c;脑筋急转弯也是一项相当具有挑战性的任务。在这个过程中&#xff0c;我们需要运用…...

【Vue】学习笔记-列表渲染/数据监视

列表渲染/数据监视 基本列表Key的作用与原理列表过滤列表排序Vue 数据监视原理 基本列表 v-for指令 用于展示列表数据语法&#xff1a;v-for“(item,index) in xxx” :key“yyy”可遍历&#xff1a;数组&#xff0c;对象&#xff0c;字符串&#xff08;用的很少&#xff09;&…...

人工标注或成过去式?SSA语义分割框架、SSA-engine自动类别标注引擎,大幅提升细粒度语义标注效率

推荐语 4月5日&#xff0c;Meta发布 Segment Anything 模型和 SA-1B 数据集&#xff0c;引发CV届“地震”&#xff0c;其凭借一己之力&#xff0c;成功改写了物体检测、数据标注、图像分割等任务的游戏规则。 复旦大学ZVG实验室团队基于此最新开源了SSA语义分割框架和SSA-engin…...

远程工具在哪里打开?使用教程

在现在的互联网时代&#xff0c;越来越多的人开始采用远程工具来处理工作。无论你是在家里还是在办公室&#xff0c;使用远程工具可以让你更加高效地完成工作&#xff0c;同时也可以帮助你与其他人更好地沟通。但是&#xff0c;对于一些新手来说&#xff0c;使用远程工具可能会…...

HBase高手之路7—HBase之全文检索Phoneix

文章目录 HBase之全文检索Phoenix一、全文检索二、全文检索工具phoenix简介1. 简介2. 使用Phoenix是否会影响HBase性能3. 哪些公司在使用Phoenix4. 官方性能测试4.1 Phoenix对标Hive&#xff08;基于HDFS和HBase&#xff09;4.2 Phoenix对标Impala4.3 关于上述官网两张性能测试…...

城镇水务系统碳减排路径|雨水系统

1.1 雨水系统 1.1.1碳减排路径分析 雨水系统碳排放主要来自于规划建设阶段。在压力流系统以及低洼点位排水过程中&#xff0c;随着水泵使用也会造成一定碳排放。在雨水系统规划建设过程中&#xff0c;应优先使用绿色基础设施、绿色建材&#xff1b;在运行过程中&#xff0c;雨…...

摆花

[NOIP2012 普及组] 摆花 题目描述 小明的花店新开张&#xff0c;为了吸引顾客&#xff0c;他想在花店的门口摆上一排花&#xff0c;共 m m m 盆。通过调查顾客的喜好&#xff0c;小明列出了顾客最喜欢的 n n n 种花&#xff0c;从 1 1 1 到 n n n 标号。为了在门口展出更…...

APK Installer终极指南:在Windows电脑上高效安装Android应用

APK Installer终极指南&#xff1a;在Windows电脑上高效安装Android应用 【免费下载链接】APK-Installer An Android Application Installer for Windows 项目地址: https://gitcode.com/GitHub_Trending/ap/APK-Installer 你是否厌倦了在Windows电脑上运行Android应用需…...

魔兽世界宏编辑器终极指南:5分钟掌握GSE高级宏编译工具

魔兽世界宏编辑器终极指南&#xff1a;5分钟掌握GSE高级宏编译工具 【免费下载链接】GSE-Advanced-Macro-Compiler GSE is an alternative advanced macro editor and engine for World of Warcraft. 项目地址: https://gitcode.com/gh_mirrors/gs/GSE-Advanced-Macro-Compi…...

B站视频下载终极指南:5步轻松掌握BilibiliDown完整教程

B站视频下载终极指南&#xff1a;5步轻松掌握BilibiliDown完整教程 【免费下载链接】BilibiliDown (GUI-多平台支持) B站 哔哩哔哩 视频下载器。支持稍后再看、收藏夹、UP主视频批量下载|Bilibili Video Downloader &#x1f633; 项目地址: https://gitcode.com/gh_mirrors/…...

从BERT到GPT-4:大语言模型的技术演进与应用实践

1. 从单向到双向&#xff1a;大语言模型如何重塑AI的认知边界如果你在2018年之前问我&#xff0c;一个AI模型能不能同时理解一句话里每个词的前后文关系&#xff0c;我会告诉你这很难。那时的主流模型&#xff0c;比如OpenAI的GPT初代&#xff0c;就像一个只能从左到右阅读的读…...

企业微信消息监听实战:如何实时接收客户消息回调?

自动回复、AI 客服、CRM 联动的核心&#xff0c;其实都是“消息回调”。很多开发者在接入企业微信自动化时&#xff0c;第一个遇到的问题就是&#xff1a;“为什么收不到客户消息&#xff1f;”实际上&#xff0c;企业微信的大部分自动化能力&#xff0c;都是基于“消息监听 消…...

用C++和Eigen库手把手实现UR3机械臂逆解(附完整代码与避坑指南)

从理论到实践&#xff1a;基于Eigen库的UR3机械臂逆运动学完整实现指南 在工业自动化和机器人研究领域&#xff0c;六轴协作机械臂因其灵活性和广泛的应用场景而备受关注。UR3作为Universal Robots旗下的紧凑型协作机械臂&#xff0c;凭借其轻量化设计和用户友好特性&#xff0…...

3个步骤让Photoshop拥抱AVIF时代:免费插件解锁下一代图像格式

3个步骤让Photoshop拥抱AVIF时代&#xff1a;免费插件解锁下一代图像格式 【免费下载链接】avif-format An AV1 Image (AVIF) file format plug-in for Adobe Photoshop 项目地址: https://gitcode.com/gh_mirrors/avi/avif-format 还在为Photoshop无法处理AVIF格式而烦…...

当AI开始检测自身缺陷:测试工具失控的风险与应对

在软件测试领域&#xff0c;AI正从辅助工具向核心角色转变。2026年的测试场景中&#xff0c;AI不仅能自动生成测试用例、自我修复失效选择器&#xff0c;还能以人眼精度完成视觉回归检测。这些能力让测试工程师从繁琐的重复劳动中解放出来&#xff0c;将精力聚焦于业务逻辑与边…...

如何通过League Akari获得终极英雄联盟游戏体验:你的智能游戏助手完整指南

如何通过League Akari获得终极英雄联盟游戏体验&#xff1a;你的智能游戏助手完整指南 【免费下载链接】League-Toolkit An all-in-one toolkit for LeagueClient. Gathering power &#x1f680;. 项目地址: https://gitcode.com/gh_mirrors/le/League-Toolkit 还在为英…...

基于ToF传感器与MIDI协议的动态激光竖琴设计与实现

1. 项目概述&#xff1a;当激光竖琴遇见飞行时间传感器如果你玩过电子音乐&#xff0c;或者对创客项目感兴趣&#xff0c;那你一定见过那种用手“拨动”激光束来触发音符的激光竖琴。传统的激光竖琴大多基于“遮光即触发”的原理&#xff0c;就像一道光电门&#xff0c;手一挡&…...