基于faceswap-GAN进行换脸

官方Github:faceswap-GAN

先运行MTCNN_video_face_detection_alignment.ipynb对视频中的人脸进行分割,并生成人脸图片供使用,运行该文件会需要运行以下命令:

  • 该步骤调用了facenet的mtcnn的weights,需要下载训练好的mtcnn模型参数
  • 在系统环境里安装ffmpeg, ffmpeg用于将视频转成图片,处理图片,和将图片转换回视频:sudo apt-get install ffmpeg
  • 在python环境里安装相关工具moviepy:pip3 install moviepy
  • 运行MTCNN_video_face_detection_alignment.ipynb(要先在python环境里安装jupyter notebook,并运行jupyter notebook),该代码中,我注释掉了global pnet, rnet, onet这行,否则会由于global了两次导致错误。
WEIGHTS_PATH = "./mtcnn_weights/"

sess = K.get_session()
with sess.as_default():
    global pnet, rnet, onet 
    pnet, rnet, onet = create_mtcnn(sess, WEIGHTS_PATH)

# global pnet, rnet, onet
    
pnet = K.function([pnet.layers['data']],[pnet.layers['conv4-2'], pnet.layers['prob1']])
rnet = K.function([rnet.layers['data']],[rnet.layers['conv5-2'], rnet.layers['prob1']])
onet = K.function([onet.layers['data']],[onet.layers['conv6-2'], onet.layers['conv6-3'], onet.layers['prob1']])
  • 我在导入视频时使用了一个手机拍摄的视频,人脸检测和截取后获得的人脸图像很少,而且很多不清晰,原因是我用手机拍摄的视频默认旋转了90度(虽然mtcnn会进行人脸摆正,但是90度的旋转很难处理),且分辨率是“宽短高长”(手机拍摄的瘦高分辨率的视频),于是用视频截取工具,把含有人脸的区域截取了出来,再导入处理即可,大家可以尝试一下。

处理自己的图片数据集也可以使用MTCNN_video_face_detection_alignment.ipynb

实际上是converter库里的video-converter里的process_video函数(该函数的输入就是图片,只不过作者对视频进行了帧抓取)对照片进行的人脸捕捉和输出,可以直接修改MTCNN_video_face_detection_alignment.ipynb最后一块代码,将视频输入修改成图片输入。

tip:由于mtcnn的性能问题,输入的图片最好是清晰的脸占大面积的图片,否则很可能捕捉不到人脸。

运行prep_binary_masks.ipynb来生成二进制的mask用于训练,mask可以增强眼睛真实度和消除遮挡物带来的模糊问题。

(该步为可选项,也可以不设置eye_mask(在train_test notebook里设置use_bm_eyes=False),或者使用第一步产生的粗糙eye mask进行训练)                    该步需要支持cuda

  • 按照该文件里的指南一步步操作,需要按照torch(需要装cuda版本的)、dlib、cmake等环境和工具,其中使用pip安装的最好在python环境里安装,其他的需要使用系统环境安装。torch、dlib主要是会在需要装的Github库face_alignment里用到。
  • dir_faceA和dir_faceB分别设置成第一步人脸检测和截取到的人脸的文件夹,dir_bm_faceA_eyes是eye_mask的保存地址,如果修改了dir_bm_faceA_eyes,dir_bm_faceB_eyes的地址,需要修改下面对应的mkdir里的文件夹名称。
  • 需要从www.adrianbulat.com上下载face landmark(人脸关键点检测)的模型用于捕捉关键点,从而将eye mask生成出来

tip: 按照该ipynb的教程装torch可能会比较大,下载速度不稳定,建议直接到https://pytorch.org/官网上,找对应的pytorch install命令。

Run FaceSwap_GAN_v2.2_train_test.ipynb to train models.

  • 在执行以下命令时可能会出现以下bug
    model.build_pl_model(vggface_model=vggface, before_activ=loss_config["PL_before_activ"])
    
    #以下是bug
    
    from keras.applications.imagenet_utils import _obtain_input_shape
    ImportError: cannot import name '_obtain_input_shape'
    原因是keras版本的问题,2.2.2版本后的keras只需要将keras_vggface.models里的

        from keras.applications.imagenet_utils import _obtain_input_shape

        改为:

        from keras_applications.imagenet_utils import _obtain_input_shape

  • 构建VGGFace的过程中会下载相应的vggface的识别模型。

Run FaceSwap_GAN_v2.2_video_conversion.ipynb to create videos using the trained models in step 3.

  • 使用上一步骤里训练出的faceswap_gan model(用于换人脸) + mtcnn model(用于检测到人脸)对视频进行换脸

猜你喜欢

转载自blog.csdn.net/ygfrancois/article/details/89055107