AI换脸之实战DeepFake(一)

目录

  1. 环境配置
  2. 代码解读
  3. 实例

一.环境

本实验所用工具:
pycharm+anaconda
ffmpeg
环境:
python3.6
tensorflow 1.1.0
keras 2.2.2
注意事项:
本人所用tensorflow版本并非DeepFake所要求版本。运行会出现错误,错误解决方案请见本人另两篇文章。
环境安装:
pycharm+anaconda安装教程:https://www.cnblogs.com/yuxuefeng/articles/9235431.html
tensorflow配置教程:https://www.cnblogs.com/elroye/p/7864988.html
ffmpeg安装教程https://blog.csdn.net/yang725614/article/details/79696756

二.代码解读

源码: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,后续改进)
代码+人脸分类器:https://download.csdn.net/download/qq_36625422/11170644 (我知道你们肯定不舍的花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

实际的效果:

AI换脸之实战DeepFake(一)_第1张图片AI换脸之实战DeepFake(一)_第2张图片

四 不足与可用改进

1.人脸提取,opencv人脸分类器表现不够好
改进:更换为dlib
2.图片输入是256*256的,过小
改进:变更网络的输入与输出
3.图像融合,边缘明显,肤色差异明显
改进:采用泊松融合,或采用smooth_mask
改进:引入肤色处理
(实验的改进见后续更新)

你可能感兴趣的:(ai换脸,deepfake,神经网络实战)