赞
踩
wav2lip,主要是通过音频以及和音频同步的图片以及不同步的图片作为输入,构造了encoder-deocder结构,其中损失模块包括了三个部分,第一是重建损失,第二是同步损失,其中提前预训练了一个同步模型,第三增加了gan架构,用来提升生成的质量。但是wav2lip开源版本不够高清,生成出来的唇形仍然比较模糊,有两种做法,一个是训练高清版本的,另一个就是接fpgan这种增强的方式,但是后者速度很慢。
1.安装
python37 cuda 10.1
sudo yum install libsndfile
pip install -r requirements
在face_detection/detection/sfd/sfd_detector.py中把s3fd.pth的路径换一下就好。
2.推理
实际上还是一个跨模态的模型,输入是一段音频特征和图像对,其中音频特征以及处理成mel频谱,这也是很常见音频处理,图像特征是一段长视频进行随机的切割,产生的两段,其中第一段橙色和第二段粉色的,将两段图像进行拼接之后,将橙色段的唇形部位全部mask掉,输入一个encoder和decode的结构,在解码时,产生了音频对应的唇形图,将唇形图和gt进行loss计算,gt即是被mask掉的橙色块,这里输入mask橙色块的时候拼了粉色块,我觉得主要还是让模型只学习唇形这一块,因为是基于gan的模型,不然很容易学飞了,粉色图片序列其实就是减少模型的复杂度,给了一块先验,要学的只是mask掉区域。
原作者开源出来的不是高清版本的,人脸是96x96的。
音频每块是16,一个视频对应的音频,偏移量是80/fps,fps=25,每次偏移大概3。
3.训练
音频和视频同步判断器要提前训练好,即右下角模块,右上角是标准的gan结构,不用gan结构就是l2损失。
随机帧是和音频不同步,是根据音频和mask的图形生成真实的唇形,参考帧的意义我自己感觉是减少模型复杂度,但是也有解释,在前向推理时,其实输入的一定是和音频不同步的视频帧,此时不仅对唇形区域做mask,也会把原始的图像拼接起来concat,这样其实训练和推理时就保持一致了。上面的loss是重建损失,后面还有同步损失。
l1主要是重建损失,虽然生成了唇形,但是不足以保证同步,提前训练好一个sync判别器。 下面是syncnet网络。
上面两部分主要考虑的是唇形生成和同步的监督,但是还要考虑唇形生成质量问题,为了提升质量,在生成器后面加了一个gan结构,主要是判别器。
预测:
3.如何解决画面模糊问题?
3.1 wav2lip后面接一个gan
视频超分:srresnet/basicvsr++,视频超分对显存要求高,1080ti跑步起来,对部署不好。
图像超分:
gfpgan:1min->1457张图,20min左右
gpen:1min->1457张图,16min26s左右
wget https://github.com/ninja-build/ninja/releases/download/v1.8.2/ninja-linux.zip sudo unzip ninja-linux.zip -d /usr/local/bin/ sudo update-alternatives --install /usr/bin/ninja ninja /usr/local/bin/ninja 1 --force
3.2 wav2lip使用hq版本训练
4.模型推理和训练
4.1 模型推理
python inference.py
4.2 模型训练
4.2.1 对数据预处理
python preprocess.py 进行数据预处理,将数据处理成一个文件夹下图片和音频的集合。
4.2.2 训练唇形同步模型
k80会卡主,1080ti没问题
python color_syncnet_train.py
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。