文章目录
原本这些文字是为了我方便,临时记录的,所以整体逻辑可能不清晰,留坑以后再梳理的更好。
文件结构
总的来说:
- 云端没有必要这么麻烦,只需要几个文件夹:源码、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
- A:
- OSS:————————————————————————————————————OSS
- V_1:
- source: A_source.zip;A_source.zip 上传至OSS,并下载到Mac
- V_1:
- extract:—————————————————————————————GPU or cpu
- V_1
- A
- input : 下载并解压缩
- output : 提取人脸照片集
- A_extract.zip(output) 压缩人脸照片集
- B
- A
- V_1
- OSS:————————————————————————————————————OSS
- V_1:
- extract :A_extract.zip;B_extract.zip 上传至OSS,并下载到Mac
- V_1:
- select:—————————————————————————————————————————Mac
- V_1: auto →manual
- select_A→zip(A_select.zip) 挑选并压缩
- select_B→zip(B_select.zip) 挑选并压缩
- V_1: auto →manual
- OSS:————————————————————————————————————————————————OSS
- V_1:
- select :A_select.zip;B_select.zip 上传至OSS,并下载到GPU
- V_1:
- train:———————————————————————————————————————————————————— ————GPU
- V_1_1:
- input_A :下载解压
- input_B :下载解压
- models :训练生成
- models.zip:压缩模型
- V_1_1:
- OSS:————————————————————————————————————————————————OSS
- V_1_1:
- models :models.zip 上传至OSS,并下载到GPU
- V_1_1:
- 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)
- V_1_1_1:
- OSS:——————————————————————————————————————————————————————————————————————————OSS
- V_1_1_1:
- result :result.zip 上传至OSS,并下载到Mac
- V_1_1_1:
项目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/
- v_1/
执行步骤
1——环境搭建:
- 硬件:实例(OSS)、GPU、CUDN、CUDNN、
- 软件: anaconda、TensorFlow_GPU 、dlib 、face_recognize、keras、、、、、
- 文件:code、input_A 、input_B/、input、output、models、data(photo、video、history)
2——数据准备:
- 视频剪切
- 音频导出
- 图片切出
3——人脸提取:extract
- A:
- 把A的照片集cp到input里
- python3 faceswap.py extract -i input -o output( -i input -o output可以省略不写)
- 手动删除output不合适的照片
- mv output input_A;rm input/*
- 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 :
其他优化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
linux操作
查看文件夹下文件个数: ls -l |grep “^-”|wc -l
实验记录
放大100倍后的图
环境配置
apt-get 源更新:
https://www.cnblogs.com/gabin/p/6519352.html
环境配置——数据:
数据源是视频,所以免不了用ffmpeg进行一顿操作。
ffmpeg安装:可用anaconda一键安装
ffmpeg操作:
- 视频剪切:ffmpeg -ss 0:2:22 -t 0:0:10 -i input.avi -vcodec copy -acodec copy output.mp4
- 提取音频:ffmpeg -i source_video.avi -vn -ar 44100 -ac 2 -ab 192 -f mp3 sound.mp3
- 切出图片:ffmpeg -i input.mp4 -vf fps=25 -qscale:v 2 “imagename%7d.jpg”
- 合成视频:
- ffmpeg -f image2 -i image%d.jpg video.mp4
- ffmpeg -f concat -safe 0 -i Desktop/input.txt -vsync vfr -pix_fmt yuv420p Desktop/output.mp4
- 添加音频:
- ffmpeg -i son.mp3 -i video_origine.mp4 video_finale.mp4
- 如果视频少帧了,可以进行如下尝试 ffmpeg -i son.mp3 -i video_origine.mp4 -c copy video_finale.mp4
- 视频合并:ffmpeg -f concat -i filelist.txt -c copy output.mkv
- filelist.txt 文件结构:https://blog.csdn.net/doublefi123/article/details/47276739
- python代码:
- 音频合并:ffmpeg64.exe -i “concat:123.mp3|124.mp3” -acodec copy output.mp3
- 注意点:
- 切图片的频率要设为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
- 学习资料:
环境配置——第三方库
必要库安装:其他的都问题不大,直接用pip或者是conda安装即可,主要是下面三个比较难搞
-
TensorFlow:
- pip install --ignore-installed —upgrade https://mirrors.tuna.tsinghua.edu.cn/tensorflow/linux/gpu/tensorflow_gpu-1.4.0-cp35-cp35m-linux_x86_64.whl
-
dlib:
- 如果是仅安装dlib,那么建议多次尝试:conda install -c menpo dlib
-
同时安装 face_recognition,dlib
综合下面两个教程: -
OpenCV:如果普通的pip、conda方法不行,尝试下面的方法:
- 如果普通的pip、conda方法不行,尝试下面的方法:
- conda install —channel https://conda.anaconda.org/menpo opencv3
- 如果上面这个方法把OpenCV的依赖包都下完了,就是没下OpenCV,可以用pip单独下一次OpenCV试一下。
-
pip:
-
安装结果检查:基本上直接用Python import一下就好了。
-
tensorflow检查:
-
import tensorflow as tf
-
检查版本:tf.version
-
安装路径: tf.path
-
安装TensorFlow:http://wiki.jikexueyuan.com/project/tensorflow-zh/get_started/os_setup.html
- 安装TensorFlow和CUDA常见问题:链接底部:http://wiki.jikexueyuan.com/project/tensorflow-zh/get_started/os_setup.html
- Keras 的两个 Backen:https://morvanzhou.github.io/tutorials/machine-learning/keras/1-3-backend/
- fakeapp 源码操作视频教程:https://m.weike.fm/lecture/6062924?st=sharelink&inviter_id=54173110
环境配置——操作工具
软件:配色、wget、anaconda、zip、unzip、scp、ssh
-
ssh
ssh -i fenneishi_personal_1.pem root@47.100.229.181 —— 绑定秘钥
ssh root@47.100.229.181 ——————————————–没有绑定 -
配色方案
- (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 root@101.132.150.5:/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
- 在目录b下生成文件a
- oss cp pp_photo.zip oss://fenneishi-test/data/photo/pp/
- Access Key管理 :右键头像
环境配置——硬件
-
迁移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驱动安装:
===========
= 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)
环境配置——其他
- cpu机上充分利用算力:
https://github.com/lakshayg/tensorflow-build - 持续训练:
关闭云终端shell后,训练能够继续进行
一直未解决这个问题,但是实际上这个问题很重要,要不然你很有可能会遇到功亏一篑的情况(例如训练一半,断网导致云端shell退出,训练停止,而你不知道,傻等了几个小时,浪费了时间+金钱) - 镜像
阿里云部分GPU服务器无法一键镜像
使用阿里云GN5i服务器正常,使用gn5,因为默认搞了一个本地盘,导致无法一键镜像,但是应该可以通过进入具体的盘处,操作快照和镜像。
尽量提前1h 制作镜像。 - 停机不收费
阿里云部分机型支出停机不收费,或者很低的费用,好像主要是在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框架.