DeepFake——实际操作


原本这些文字是为了我方便,临时记录的,所以整体逻辑可能不清晰,留坑以后再梳理的更好。

文件结构

总的来说:

  • 云端没有必要这么麻烦,只需要几个文件夹:源码、input、output、input_A、input_B、models,出过源码一般都要是空的才好。
  • oss 端:文件系统需要完善一些,OSS可以作为一个项目的中心
  • Mac端:Mac端主要起到的作用是:
    • 准备素材:利用软件下载视频,利用FFmpeg剪切视频、切出图片等等。
    • 查看效果:查看convert的结果的效果怎么样。

文件结构:
项目P:

  • code: —————————————————————GPU
  • data:—————————————————————————CPU
    • A:
      • video.rmvb(target_video.rmvb)下载素材视频
      • photo_v/ : fps=100 生成素材照片
      • photo_p 下载素材照片
      • photo_f 合并素材照片
      • A_source.zip(photo_v+photo_p) 压缩素材照片
    • B
  • OSS:————————————————————————————————————OSS
    • V_1:
      • source: A_source.zip;A_source.zip 上传至OSS,并下载到Mac
  • extract:—————————————————————————————GPU or cpu
    • V_1
      • A
        • input : 下载并解压缩
        • output : 提取人脸照片集
        • A_extract.zip(output) 压缩人脸照片集
      • B
  • OSS:————————————————————————————————————OSS
    • V_1:
      • extract :A_extract.zip;B_extract.zip 上传至OSS,并下载到Mac
  • select:—————————————————————————————————————————Mac
    • V_1: auto →manual
      • select_A→zip(A_select.zip) 挑选并压缩
      • select_B→zip(B_select.zip) 挑选并压缩
  • OSS:————————————————————————————————————————————————OSS
    • V_1:
      • select :A_select.zip;B_select.zip 上传至OSS,并下载到GPU
  • train:———————————————————————————————————————————————————— ————GPU
    • V_1_1:
      • input_A :下载解压
      • input_B :下载解压
      • models :训练生成
      • models.zip:压缩模型
  • OSS:————————————————————————————————————————————————OSS
    • V_1_1:
      • models :models.zip 上传至OSS,并下载到GPU
  • convert:———————————————————————————————————————————————————————— ——————GPU
    • V_1_1_1:
      • target_video.rmvb:目标视频 软连接做好
      • input :切出照片集( fps=25)
      • models : 转换算法软连接做好
      • output: 转换结果
      • silent.mp4: 合成无声视频
      • voice.mp3 :取出目标视频音频
      • result.mp4:合成最终完整结果
      • result.zip:压缩(output+silent.mp4+voice.mp3+result.mp4)
  • OSS:——————————————————————————————————————————————————————————————————————————OSS
    • V_1_1_1:
      • result :result.zip 上传至OSS,并下载到Mac

项目Q:

oss

  • data
    • h
    • l
      • photo
      • video
    • p
      • photo
      • video
  • l_project/
    • v_1/
      • source/
      • extract/
      • select/
      • v_1_1/
        • models/
        • V_1_1_1/
          • result/

执行步骤

1——环境搭建:

  1. 硬件:实例(OSS)、GPU、CUDN、CUDNN、
  2. 软件: anaconda、TensorFlow_GPU 、dlib 、face_recognize、keras、、、、、
  3. 文件:code、input_A 、input_B/、input、output、models、data(photo、video、history)

2——数据准备:

  1. 视频剪切
  2. 音频导出
  3. 图片切出

3——人脸提取:extract

  1. A:
    • 把A的照片集cp到input里
    • python3 faceswap.py extract -i input -o output( -i input -o output可以省略不写)
    • 手动删除output不合适的照片
    • mv output input_A;rm input/*
  2. B:
    • 把B的照片集cp到input里
    • python3 faceswap.py extract -i input -o output( -i input -o output可以省略不写)
    • 手动删除output不合适的照片
    • mv output input_B;rm input/*

4——模型训练:train

  • python3 faceswap.py train -A input_A -B input_B -o models(-A input_A -B input_B可以省略不写)
  • lossA 和 loss B 至少降到0.015以下

5——照片转换:convert

  • python3 faceswap.py convert -i input -o output( -i input -o output可以省略不写)
  • 照片中尽量只有目标人脸,不要有其他人脸,不然会一起被转换了的

效果优化

总结:

* 最必要的一个参数就是在convert时候的-f fi
* 其他的参数基本上用处不大(-v 可以展现详细的信息)
* train中的部分参数,可能要启动图形界面相关的东西,在云端无GUI的命令行界面下简单调用可能会出错。
* 训练的时候:input_A是吴京的大头照,input_B是你的大头照(假设你想验一下战狼2),如果反了,在convert中有一个参数可以调整,我的经验下来,感觉,loss_B 的训练似乎非常重要,因为如果视频同一画面中有多张人人脸的时候(例如吴京、达康书记、张翰等等),你会发现你的脸会出现他们每个明星的脸上,而且有时候效果也差不多。
* 如果input_A、input_B文件数比较多,例如5000以上,可以考虑把样本拆分成10 份(等距随机抽样),然后一份一份的训练,先用第一份把loss训练到0.3左右,再在这个基础上,继续训练原有模型,用第二份训练到0.2左右。这样可能比直接用5000份样本来训练,要快一些。
* 注意aligment.json这个文件,这个文件在extract过程中,在input文件里产生的,里面保存的应该是人脸识别的一些结果,例如68个关键点的坐标等等。如果你仍然用这个input文件去convert,会自动调取aligment.json文件的结果,而不是在convert过程再去识别一次。如果input里的这个文件不小心被你删掉了,那么程序就会从新去识别一次人脸,找出关键点等等,这样convert过程就会很慢,很慢。
* 从耗时角度来看:最耗时的是train过程,要想把loss降到0.15以下,可能花费数个小时的GPU时间,下来是extract过程,稍微会花一些时间,十几分钟到几十分钟不等,取决文件数量。convert非常快,前提是aligment.json文件正确且完好。当然以上都是PGU环境下,CPU环境下,会非常慢,train过程更是无法想象。
* models 是可以借力训练的:
    * 训练一半,按下enter键退出训练(千万不要Ctrl+C)并保存结果后,可以再次启动训练,程序会默认加载已有的models继续训练(除非没有models)。
    * 利用上面这个特性,你可以在你替换吴京的models基础上训练你替换钢铁侠。
* 整个过程,难点是环境搭建和效果优化两个层面
    * 环境搭建:建议用anaconda建立虚拟环境,借用阿里云镜像市场的深度学习镜像,配合镜像保存环境,具体内容见环境配置。
    * 效果优化:主要牵扯到效果优化和速度提升。
        * 效果优化:低级层面能操作的就只有优化样本,和调整参数
        * 速度提升:低级层面能操作就只有优化样本了。
* 省钱策略:
    * 充分利用阿里云OSS:可以更加快速传输文件,更加廉价的保存文件
    * 镜像:基本环境搭建好了,就可以利用镜像保存环境了。
    * 其他:利用其他云端平台,还未尝试。

切图层面:

ffmpeg
* 用%4d这样方便排列顺序

extract层面:

更多高质量人脸

* CPU跑提取过程:
    * 速度太慢,3~4s一个,1万张需要 需要8个小时 如果是晚上自己去跑还是可以考虑的
    * 建议直接上GPU,不要浪费时间,除非能够利用上睡觉时间。
* 尝试多线程:=cpu数量时,差异不大,但是>CPU数量,就变慢了
* 提取的时候,加上人脸选择功能:-f 目标人脸 -n 删除掉不是目标人脸的人脸。
    * 初次尝试,发现加上-f 虽然没有报错,但是也没有work.
    * 第二次尝试,改变参数的输入方式,由多个照片到一个照片(且照片中仅有一张脸),由字符串到直接输入。依然是没有报错,也没有work。
    * 第三次尝试,换成输入extract的结果,即大头照,并且cp到当前目录,试试。有效果,但是准确率似乎并不好,很多漏掉的,很多错的也加进来来了。后续可以优化的方法:加上旋转功能或者改变阈值。我决定不在这个方向继续优化,理由是,宁愿多花一点时间,手动过滤,保证数据集的质量,也不在这个上面浪费时间。
    * -n  第一次尝试,似乎没有任何效果.
    * 反向使用(-f 非目标人脸jpg),似乎效果挺好的,哈哈,基本上目标人脸都没有是识别出来。指的注意一点是,0405照片似乎是识别出来了(=非目标人脸jpg),但是为什么-n使用的时候,这张照片没有过滤掉呢?
    * 决定不再继续在这个点上进行优化,因为虽然对速度没有多大改进,但是完全无法保证正确率,所以还是手动筛选吧,以保证数据集的质量。
* 旋转人脸:
    * 例: python3 code/faceswap-master/faceswap.py  extract -r 30
        * 的确多检查出了一些,但是速度满了6倍,而且还有多了一些不是的,不值得。
* 调价阈值:
    * 没有尝试,但是不是很建议,可以尝试设置的更高一些,以提高人脸质量,但是相信默认值是作者验证过的最优值。
* 模糊检测:
    * 不试了,没有必要,速度第一位,其他人来搞。
* 尝试CNN检测器:
    * python3 faceswap.py  extract -D "cnn"
        * 同样也是慢了很多
* 对其人眼:
    * python3 code/faceswap-master/faceswap.py  extract   -ae 
        * 速度正常,可以使用
* 预处理:
    * 视频预处理:尽量找仅有目标人脸的,尽量把没有目标人脸的视频剪切掉
    * 图片预处理:原始切出
* 展示更为详细的输出 -v:
    * python3 code/faceswap-master/faceswap.py  extract   -v 
    * 实测,可行,可以用来比对速度
* 画出脸部标记:
    * python3 code/faceswap-master/faceswap.py  extract   -dl
        * 没有必要,而且不知道会不会影响后面算法训练过程。
* 多终端一起跑:
    * 当然首先把数据集进行切分,一起跑,首先可以先手动删掉一些图片,然后再跑。
* 长时间运行,可能会导致速度变慢
    * 猜测是因为没有做内存优化,导致内存膨胀原因导致。
    * 解决:停掉进程,同时再次运行时,先检测运行结果 加上-s
* alignments.json 是在extract这一步写到input里的,在后面convert时候会用到,这个只要在目标视频的extract过程注意好就行了,即为目标视频,你必须这样切一下。别忘了在extract后,把json文件加到原文件当中。
    * 记得在多次对同一个input进行尝试时候,每次尝试都要删除一下 input里的alignments.json文件
* 模糊提出;
    * 并不是真正剔除,会放到output/blur文件夹内
    * 操作形式为 -bt 参数int 或者 --blur-threshold 参数int 
    * 参数取值建议我3比较理想

select 层面:

* 做一个人脸识别系统,把阈值大于一定值的人脸全部跳出来,删除掉
    * 可以先把阈值设的高一点,把一定不是的删掉,然后再阈值降低,再删除
    * 当然每一波都得要人眼过滤一遍
    * 最终结果也要人眼过滤一下

原始数据优化:

* 视频
    * 尽量找只有目标人物的。
    * 在切出照片前可以提前剪辑,去掉没有大段没有目标任务的片段。
* 照片:
    * 爬虫百度图片
    * 爬虫其他明星照片网站

执行过程优化:

* 使用OSS作为数据中转站:
* 做一个表格辅助多线程操作(记录操作步骤和关键信息)
* 服务器端用本地磁盘,加快下载复制速度:没有必要,已经很快了,而且用本地磁盘成本陡升,用ssd盘就好了

convert :

DeepFake——实际操作

其他优化idea

* 而数据B包含想要插入到数据中的人的面孔
* 拼接时:转换出的人脸比较小的话,拼接时,拉伸到比较大时,就会导致比较模糊
* 拼接时:脸的外侧有一个模糊的区间,也会产生问题。
* 选择人脸的区域:完全整个人脸都选中了,还是选了一部分呢,也会影响最终效果
* 两个人脸的相似度,会影响。
* 既用视频中的人脸,也用外部的人脸,这样效果会好一些(防止过拟合或欠拟合xs)
* 侧脸也会影响。
* 通用模型:别人训练好,直接用就好,例如dlib。非通用模型: 每次应用时候,都需要全部或部分单独训练,例如AB人脸替换。AB替换时,如果你用奥巴马的脸替换川普的模型训练好了,再制作奥巴马替换普京的时候,可以用之前的模型直接继续training,会省时间。
* deepfake 版本选择:选deepfake-fakeswap 
* shuffle 优化:把原始图片扭曲后送入encoding,因为图片扭曲了,更容易学到共性。
* 边缘拼接:
* 训练集:并非图像越多越好,最好找一些多角度的高质量的图片训练集
* 难度在于配置,想办法在iCloud跑通。
* loss 降到0.015以内
I trained a video of Katy Perry with many different scenes, that caused the 20 days delay. Since the scenes had different positions on the faces, I had to take lots of pictures of mine. I realized that it's faster if you train each separate scene. Now that I have 20 days of training, I spend about 30 minutes on new scenes using the previous training.

辅助知识

源代码使用教程:
github.com/Fabsqrt/BitTigerLab
https://github.com/Fabsqrt/BitTigerLab/blob/master/SystemDesign/DeepFake/README.md

python环境变量的修改:
https://blog.csdn.net/qw_xingzhe/article/details/52695486

深度学习环境配置:
http://www.52nlp.cn/深度学习主机环境配置-ubuntu-16-04-nvidia-gtx-1080-cuda-8

GPU计算能力查询表:
https://blog.csdn.net/JiaJunLee/article/details/52067962
https://blog.csdn.net/allyli0022/article/details/54628987

cudnn下载:但是这个cudnn不知道怎样用,怎样解压
https://developer.nvidia.com/rdp/cudnn-archive

如何让linux程序在ssh shell关闭后继续运行?
https://blog.csdn.net/u012973744/article/details/37659551
https://blog.csdn.net/laven54/article/details/45569617

统计文件数
https://www.cnblogs.com/uzipi/p/6100790.html

图片体积,图片分辨率,图片尺寸之间是啥关系?

https://www.zhihu.com/question/19617114

创建镜像
https://help.aliyun.com/document_detail/25460.html?spm=5176.11065259.1996646101.searchclickresult.261b66d0mZJyAI 链接。

linux操作

查看文件夹下文件个数: ls -l |grep “^-”|wc -l

实验记录

DeepFake——实际操作
DeepFake——实际操作
DeepFake——实际操作
DeepFake——实际操作
DeepFake——实际操作
DeepFake——实际操作
DeepFake——实际操作

DeepFake——实际操作
DeepFake——实际操作
放大100倍后的图
DeepFake——实际操作
DeepFake——实际操作
DeepFake——实际操作
DeepFake——实际操作
DeepFake——实际操作
DeepFake——实际操作
DeepFake——实际操作
DeepFake——实际操作
DeepFake——实际操作
DeepFake——实际操作

环境配置

apt-get 源更新:
https://www.cnblogs.com/gabin/p/6519352.html

环境配置——数据:

数据源是视频,所以免不了用ffmpeg进行一顿操作。
ffmpeg安装:可用anaconda一键安装
ffmpeg操作:

  1. 视频剪切:ffmpeg -ss 0:2:22 -t 0:0:10 -i input.avi -vcodec copy -acodec copy output.mp4
  2. 提取音频:ffmpeg -i source_video.avi -vn -ar 44100 -ac 2 -ab 192 -f mp3 sound.mp3
  3. 切出图片:ffmpeg -i input.mp4 -vf fps=25 -qscale:v 2 “imagename%7d.jpg”
  4. 合成视频:
    1. ffmpeg -f image2 -i image%d.jpg video.mp4
    2. ffmpeg -f concat -safe 0 -i Desktop/input.txt -vsync vfr -pix_fmt yuv420p Desktop/output.mp4
  5. 添加音频:
    1. ffmpeg -i son.mp3 -i video_origine.mp4 video_finale.mp4
    2. 如果视频少帧了,可以进行如下尝试 ffmpeg -i son.mp3 -i video_origine.mp4 -c copy video_finale.mp4
  6. 视频合并:ffmpeg -f concat -i filelist.txt -c copy output.mkv
    1. filelist.txt 文件结构:https://blog.csdn.net/doublefi123/article/details/47276739
    2. python代码:
  7. 音频合并:ffmpeg64.exe -i “concat:123.mp3|124.mp3” -acodec copy output.mp3
  8. 注意点:
    • 切图片的频率要设为25时,这样后面音频视频才能匹配上,>25音慢图像块,<25音快图像慢。
    • 切图时候图片名称格式要和合图时候一直,例如均为:imagename%04d 或 image%d
    • rmvb格式的视频无法进行“切出图片”操作
    • 腾讯视频Mac本地缓存文件位置: /Users/longqi/Library/Containers/com.tencent.tenvideo/Data/Library/Application Support/Download/video
    • 命令行视频下载工具:you-get和youtube-dl
    • 视频剪辑的精准切割:把-i input.avi 放到 -ss 前面可以实现精准时间切割,否则,最小时间间隔为8秒左右https://zhuanlan.zhihu.com/p/28008666
  9. 学习资料:

环境配置——第三方库

必要库安装:其他的都问题不大,直接用pip或者是conda安装即可,主要是下面三个比较难搞

环境配置——操作工具

软件:配色、wget、anaconda、zip、unzip、scp、ssh

  • (vim ~/.bashrc )
  • export PS1=’[\e[32m][[\e[35m]\u[\e[m]@[\e[36m]\h [\e[31m]\W[\e[32m]][\e[36m]$[\e[m] ’
  • anaconda

    • 下载地址:https://www.anaconda.com/download/#linux
    • 安装教程:(linux)https://docs.anaconda.com/anaconda/install/linux
    • 环境变量:
      • 如果在安装Anaconda的过程中没有将安装路径添加到系统环境变量中,需要在安装后手工添加:
      • 在终端输入$sudo gedit /etc/profile,打开profile文件。
      • 在文件末尾添加一行:export PATH=/home/grant/anaconda2/bin:$PATH,其中,将“/home/grant/anaconda2/bin”替换为你实际的安装路径,保存
    • 安装注意事项:
      • 首先要确保进入了conda建立的隔离环境当中。
      • 在conda隔离环境当中,用pip和pip3是没有差别的,因为如果你的环境是Python3的,那么无论pip3 or pip 都会把包安装到cond下面的Python3中。
      • pip的镜像源默认为阿里云,所以会更快,所以能用pip就用pip,有问题(通常是依赖关系问题)再用conda。
  • scp
    scp -r [email protected]:/root/tiger/congcongphoto congcongphoto

  • wget:

    • wget -c http://www.xxx.xxx/xxx(文件的下载链接)
    • 服务器从oss上下载文件非常快,但要注意文件名尽量不要有中文,否则会乱码。
    • 有些网站的下载链接会隐藏起来,你直接右键获取不到真正的下载链接,这时候就要启动一些前端开发者模式
    • -c 的意思是断点续传,最好加上,防止中断。
  • oss:
    https://help.aliyun.com/product/31815.html?spm=a2c4g.11186623.3.1.1YQRqF
    Mac文件上传到OSS:直接拖拽即可
    服务器从OSS下载文件:wget -c 即可(速度要求不高时)
    工具下载地址:建议把名字改成oss
    本地化调用配置:把oss 放到PATH变量支持的路径或者修改PATH也行(echo $PATH 查看PATH变量 )
    先修改权限:chmod 755 ossutilmac64
    配置文件配置:

    • Access Key管理 :右键头像
      • LTAI6EQI9vrYRRH8

    02Z5bGk3YstFfWqf4VGoCfJ36OIBPD

    • endpoint:https://help.aliyun.com/document_detail/31837.html
      • 阿里云服务器用内网endpoint,非常快,可以达到100MB每秒以上
      • 本地Mac必须要要用外网endpoint。
      • oss-cn-shanghai-internal.aliyuncs.com
      • oss-cn-shanghai.aliyuncs.comf
        使用:
    • 查看帮助:oss help cmd -L CH
    • cp:
      • oss cp pp_photo.zip oss://fenneishi-test/data/photo/pp/
        • 生成:oss://bucket1/b/a
      • oss cp oss://bucket/abcdir/a b/
        • 在目录b下生成文件a
          以上,如果b/文件夹不存在都会新建的,无论是在OSS还是在src

环境配置——硬件

  • 迁移CUDNN:

    你还需要设置 LD_LIBRARY_PATH 和 CUDA_HOME 环境变量. 可以考虑将下面的命令 添加到 ~/.bash_profile 文件中, 这样每次登陆后自动生效. 注意, 下面的命令 假定 CUDA 安装目录为 /usr/local/cuda:
    export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:/usr/local/cuda/lib64"
    export CUDA_HOME=/usr/local/cuda

  • linux 检查nvdia驱动
    https://zhidao.baidu.com/question/91751639.html
    查看nvdia 信息:nvidia-smi
    命令行下执行:$ lshw -c video看configurure字段有没有driver字样,若有内容,则显卡驱动装好了。
    直接安装CUDA 会有相应的驱动自动安装的

  • GPU驱动安装:

DeepFake——实际操作
DeepFake——实际操作
===========
= Summary =
===========

Driver:   Not Selected
Toolkit:  Installed in /usr/local/cuda-9.0
Samples:  Installed in /root, but missing recommended libraries

Please make sure that
 -   PATH includes /usr/local/cuda-9.0/bin
 -   LD_LIBRARY_PATH includes /usr/local/cuda-9.0/lib64, or, add /usr/local/cuda-9.0/lib64 to /etc/ld.so.conf and run ldconfig as root

To uninstall the CUDA Toolkit, run the uninstall script in /usr/local/cuda-9.0/bin

Please see CUDA_Installation_Guide_Linux.pdf in /usr/local/cuda-9.0/doc/pdf for detailed information on setting up CUDA.

***WARNING: Incomplete installation! This installation did not install the CUDA Driver. A driver of version at least 384.00 is required for CUDA 9.0 functionality to work.
To install the driver using this installer, run the following command, replacing <CudaInstaller> with the name of this run file:
    sudo <CudaInstaller>.run -silent -driver

Logfile is /tmp/cuda_install_1247.log
![在这里插入图片描述](https://img-blog.csdnimg.cn/20190122143453192.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl8zNjY3MzA0Mw==,size_16,color_FFFFFF,t_70)
![在这里插入图片描述](https://img-blog.csdnimg.cn/20190122143522357.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl8zNjY3MzA0Mw==,size_16,color_FFFFFF,t_70)

环境配置——其他

  1. cpu机上充分利用算力:
    https://github.com/lakshayg/tensorflow-build
  2. 持续训练:
    关闭云终端shell后,训练能够继续进行
    一直未解决这个问题,但是实际上这个问题很重要,要不然你很有可能会遇到功亏一篑的情况(例如训练一半,断网导致云端shell退出,训练停止,而你不知道,傻等了几个小时,浪费了时间+金钱)
  3. 镜像
    阿里云部分GPU服务器无法一键镜像
    使用阿里云GN5i服务器正常,使用gn5,因为默认搞了一个本地盘,导致无法一键镜像,但是应该可以通过进入具体的盘处,操作快照和镜像。
    尽量提前1h 制作镜像。
  4. 停机不收费
    阿里云部分机型支出停机不收费,或者很低的费用,好像主要是在CPU环境下,没有仔细研究这块,但是建议如果不用了,就镜像+释放。

bug解除

1、input/alignments.json not read!
解决:在用ffmpeg从视频中提取图片集时,会出现这个/alignments.json。另外,最终用来转换的是原始照片集,不是用deepfake.py extract 出来的大头照。

2、源码参数不调节会把照片中所有人脸全部替换掉,而不是只替换目标人脸。
解决:只出现目标人脸

3、ImportError: libiomp5.so: cannot open shared object file: No such file or directory
解决:猜测是因为云端的英特尔芯片驱动问题,所以直接上了GPU的实例+搭建好的深度学习unbuntu框架.

关键信息

DeepFake——实际操作