NiceLeeのBlog 用爱发电 bilibili~

Python 换脸视频的简单实现

2021-08-20
nIceLee

阅读:


基于dlib库的人脸识别,对视频里面的人脸逐帧进行转换。

前言

偶然被人安利了一个AI换脸的视频,问了一下,技术上还是机器学习,具体用的是DeepFaceLab
碰巧,在学剪辑的时候发现AE也有换脸插件,只需要你照着图锚定好脸部特侦就差不多了。
感觉是不是可以放宽要求,尝试用更简单一点的方法来达到这个目的呢?
于是,我在github上搜了一下,发现一个opencv + dlib人脸识别的实现思路。

首先,要看看两个项目。

  • simple_faceswap
    • 实现了摄像头捕捉的视频流的简单换脸,将其实时显示。
    • 换脸思路是直接整个面部到面部的转换。
  • AI-Change-face-in-the-video
    • 实现了视频中的人脸到指定照片中的人脸的更换,并且输出视频。
      但中间有很多冗余步骤,将视频转换为图片保存,再处理图片,再合并视频。
      这其中多出了大量磁盘读写IO,且视频帧频率信息丢失。
    • 换脸思路是五官到五官的转换。

考虑到项目2的缺陷,我们可以参考一个简单的opencv读取复制视频的例子,对其进行改善。

# opencv读取复制视频
import cv2

video = cv2.VideoCapture("faces/trump.avi")
fps = video.get(cv2.CAP_PROP_FPS)
frameCount = video.get(cv2.CAP_PROP_FRAME_COUNT)
size = (int(video.get(cv2.CAP_PROP_FRAME_WIDTH)), int(video.get(cv2.CAP_PROP_FRAME_HEIGHT)))
videoWriter = cv2.VideoWriter('trans.mp4', cv2.VideoWriter_fourcc(*'MP4V'), fps, size)  
success, frame = video.read()  
index = 1
while success :  
	videoWriter.write(frame)
	success, frame = video.read()
	index += 1
video.release()

效果预览

https://www.bilibili.com/video/BV1ff4y137ep

源代码

https://github.com/nICEnnnnnnnLee/FaceSwap

可能的坑

  • 安装dlib报错
    根据报错信息提示,使用pip安装Cmake即可。
    但安装Cmake可能也会报错,你需要根据提示再安装Visual Studio,主要是要保证C++的编译环境。

  • 转换后的视频花屏
    原始的image矩阵是0~255的整型的,经过处理后可能变成了浮点型,需要再进行img.astype(np.uint8)操作。

如何使用

  • 根据requirements.txt安装依赖
  • 修改L15~L18行的参数,指定输入的图片、视频即可。

内容
隐藏