目录
- 环境配置
- 代码解读
- 实例
一.环境
本实验所用工具:
pycharm+anaconda
ffmpeg
环境:
python3.6
tensorflow 1.1.0
keras 2.2.2
注意事项:
本人所用tensorflow版本并非DeepFake所要求版本。运行会出现错误,错误解决方案请见本人另两篇文章。
环境安装:
pycharm+anaconda安装教程:
tensorflow配置教程:
ffmpeg安装教程
二.代码解读
源码:https://github.com/joshua-wu/deepfakes_faceswap 源码文件:
image_augmentation.py 图像增强,仿射变换,重映射
model.py 搭建网络,编码器和解码器
pixel_shuffler.py 分辨率提高,扭曲图片,增加训练难度
script.py 融合图片
train.py 训练模型
training_data.py 数据处理
umeyama.py 点云匹配
utils.py 定位路径一类的工作
具体解析:在此省略,见更新。
三.实例
1.从github上获取源码。
2.在pycharm上新建项目,将源码文件全部拷贝到项目目录之下,并在目录下创建model文件夹。
3.制作数据集
数据集样例:
链接:https://pan.baidu.com/s/1dF4f0cT 密码:mwk6
or
anonfile.com/p7w3m0d5be/face-swap.zip
包含data和model
3.1.录制视频,或者是下载一段视频(尽量保证只出现一张人脸,本实验预处理不包含分辨不同人脸,建议录制)
3.2.提取帧
利用ffmpeg从视频里抽取帧
win+r然后输cmd,运行。使用运行命令
ffmpeg -i 视频路径 -r 每秒抽取帧数 图片保存路径
例子:ffmpeg -i E:/shipin/one.mp4 -r 60 E:/tupian/image%d.jpg
3.3.提取人脸
本文采用opencv人脸分类器识别含有人脸的图片。(效果差于dlib和cnn,后续改进)
代码+人脸分类器: (我知道你们肯定不舍的花c币的,我把资源放到百度网盘里了,自行下载)
百度网盘:链接:https://pan.baidu.com/s/1QEThGIN7ocWqYwbIUSh5vw
提取码:il86
利用python处理之后,仍需要自己删除质量差的图片
3.4.新建data文件夹,在data文件夹下分别创建cage,drump文件夹,cage里面放的是替换人脸,trump里面放的是被替换的人脸。最后将data拷贝到新建项目的目录下。
4运行
4.1 运行train.py,等到loss下降至0.015就能获得不错的效果了。(运行时间较长)
4.2 模型训练完毕,运行script.py,在项目下会生成outpt文件夹,里面是替换的图片(时间花费很短)
5制作视频
5.1 将图片拷贝到一个文件夹里。对图片改名,为了ffmpeg能合成视频。把代码贴出来了,分享太麻烦了。
# -*-coding:utf8-*-
import os
import cv2
import time
import shutil
def getAllPath(dirpath, *suffix):
PathArray = []
for r, ds, fs in os.walk(dirpath):
for fn in fs:
if os.path.splitext(fn)[1] in suffix:
fname = os.path.join(r, fn)
PathArray.append(fname)
return PathArray
def readPicSaveFace_1(sourcePath, targetPath, invalidPath, *suffix):
try:
ImagePaths = getAllPath(sourcePath, *suffix)
# 对list中图片逐一进行检查,找出其中的人脸然后写到目标文件夹下
count = 1
# haarcascade_frontalface_alt.xml为库训练好的分类器文件,下载opencv,安装目录中可找到
face_cascade = cv2.CascadeClassifier('E:\BaiduNetdiskDownload\opencv\sources\data\haarcascades\haarcascade_frontalface_alt.xml')
for imagePath in ImagePaths:
try:
img = cv2.imread(imagePath)
if type(img) != str:
cv2.imwrite(targetPath + os.sep + 'image%s.jpg' % count, img)
count += 1
print(imagePath + "have face")
# else:
# shutil.move(imagePath, invalidPath)
except:
continue
except IOError:
print("Error")
else:
print('Find ' + str(count - 1) + ' faces to Destination ' + targetPath)
if __name__ == '__main__':
invalidPath = r'E:\jiqixuexidata\unused1'
sourcePath = r'E:\jiqixuexidata\trump'
targetPath1 = r'E:\jiqixuexidata\trumptarget'
readPicSaveFace_1(sourcePath, targetPath1, invalidPath, '.jpg', '.JPG', 'png', 'PNG')
5.2合成视频
运行cmd
例子:
ffmpeg -f image2 -i /home/ttwang/images/image%d.jpg tt.mp4
实际的效果:
四 不足与可用改进
1.人脸提取,opencv人脸分类器表现不够好
改进:更换为dlib
2.图片输入是256*256的,过小
改进:变更网络的输入与输出
3.图像融合,边缘明显,肤色差异明显
改进:采用泊松融合,或采用smooth_mask
改进:引入肤色处理
(实验的改进见后续更新)