# First Order Motion First Order Motion的任务是图像动画/Image Animation,即输入为一张源图片和一个驱动视频,源图片中的人物则会做出驱动视频中的动作。如下图所示,源图像通常包含一个主体,驱动视频包含一系列动作。
以左上角的人脸表情迁移为例,给定一个源人物,给定一个驱动视频,可以生成一个视频,其中主体是源人物,视频中源人物的表情是由驱动视频中的表情所确定的。通常情况下,我们需要对源人物进行人脸关键点标注、进行表情迁移的模型训练。 用下图可以简单阐述其中原理:
不仅可以做脸部表情动作迁移,这篇文章提出的方法只需要在同类别物体的数据集上进行训练即可,比如实现太极动作迁移就用太极视频数据集进行训练,想要达到表情迁移的效果就使用人脸视频数据集voxceleb进行训练。训练好后,我们使用对应的预训练模型就可以达到前言中实时image animation的操作。 ## 特点 - #### 支持多人脸同时驱动 - **独家引入人脸检测算法,自动检测多人脸,实现多人脸表情同时驱动。** - 使用PaddleGAN提供的[人脸检测算法S3FD](https://github.com/PaddlePaddle/PaddleGAN/tree/develop/ppgan/faceutils/face_detection/detection),将照片中多个人脸检测出来并进行表情迁移,实现多人同时换脸。 具体技术原理: 1. 使用S3FD人脸检测模型将照片中的每张人脸检测出来并抠出 2. 使用First Order Motion模型对抠出的每张人脸进行脸部表情迁移 3. 将完成表情迁移的人脸进行适当剪裁后贴回原照片位置 同时,PaddleGAN针对人脸的相关处理提供[faceutil工具](https://github.com/PaddlePaddle/PaddleGAN/tree/develop/ppgan/faceutils),包括人脸检测、五官分割、关键点检测等能力。 - #### 新增人脸增强效果 - **人脸增强特效使得驱动后的视频中人脸清晰度大大提升。** - #### 丰富的在线体验应用 - 🐜**蚂蚁呀嘿**🐜:https://aistudio.baidu.com/aistudio/projectdetail/1603391 - 💙**520告白特辑**💙:https://aistudio.baidu.com/aistudio/projectdetail/1956943 - **复刻故人的微笑(▰˘◡˘▰)**:https://aistudio.baidu.com/aistudio/projectdetail/1660701 - 👨**父亲节特辑**:https://aistudio.baidu.com/aistudio/projectdetail/2068655 ## 使用方法 ### 1. 人脸检测与效果增强 用户可上传一张单人/多人照片与驱动视频,并在如下命令中的`source_image`参数和`driving_video`参数分别换成自己的图片和视频路径,然后运行如下命令,即可完成单人/多人脸动作表情迁移,运行结果为命名为result.mp4的视频文件,保存在output文件夹中。 注意:使用多人脸时,尽量使用人脸间距较大的照片,效果更佳,也可通过手动调节ratio进行效果优化。 本项目中提供了原始图片和驱动视频供展示使用,运行的命令如下: #### 运行命令如下: ``` cd applications/ python -u tools/first-order-demo.py \ --driving_video ../docs/imgs/fom_dv.mp4 \ --source_image ../docs/imgs/fom_source_image.png \ --ratio 0.4 \ --relative \ --adapt_scale \ --image_size 512 \ --face_enhancement \ --multi_person ``` #### 参数说明: | 参数 | 使用说明 | | ---------------- | ------------------------------------------------------------ | | driving_video | 驱动视频,视频中人物的表情动作作为待迁移的对象。 | | source_image | 原始图片,支持单人图片和多人图片,视频中人物的表情动作将迁移到该原始图片中的人物上。 | | relative | 指示程序中使用视频和图片中人物关键点的相对坐标还是绝对坐标,建议使用相对坐标,若使用绝对坐标,会导致迁移后人物扭曲变形。 | | adapt_scale | 根据关键点凸包自适应运动尺度。 | | ratio | 贴回驱动生成的人脸区域占原图的比例, 用户需要根据生成的效果调整该参数,尤其对于多人脸距离比较近的情况下需要调整改参数, 默认为0.4,调整范围是[0.4, 0.5]。 | | image_size | 图片人脸大小,默认为256,可设置为512. | | face_enhancement | 添加人脸增强,不添加参数默认为不使用增强功能 | | multi_person | 当图片中有多张人脸请添加此参数,不加则默认为单人脸 | #### 📣新增脸部增强功能 | 人脸增强前 | 人脸增强后 | | :----------------------------------------------------------: | :----------------------------------------------------------: | | | | ### 2. 模型训练 #### **数据集:** - fashion 可以参考[这里](https://vision.cs.ubc.ca/datasets/fashion/) - VoxCeleb 可以参考[这里](https://github.com/AliaksandrSiarohin/video-preprocessing). 将数据按照需求处理为想要的大小,即可开始训练,这里我们处理了256和512两种分辨率大小,结果对比如下: ![](../../imgs/fom_512_vs_256.png) #### **参数说明:** - dataset_name.yaml: 需要配置自己的yaml文件及参数 - GPU单卡训练: ``` export CUDA_VISIBLE_DEVICES=0 python tools/main.py --config-file configs/dataset_name.yaml ``` - GPU多卡训练: ``` export CUDA_VISIBLE_DEVICES=0,1,2,3 python -m paddle.distributed.launch \ tools/main.py \ --config-file configs/dataset_name.yaml \ ``` **例如:** - GPU单卡训练: ``` export CUDA_VISIBLE_DEVICES=0 python tools/main.py --config-file configs/firstorder_fashion.yaml ``` - GPU多卡训练: ``` export CUDA_VISIBLE_DEVICES=0,1,2,3 python -m paddle.distributed.launch \ tools/main.py \ --config-file configs/firstorder_fashion.yaml \ ``` ## 生成结果展示
## 参考文献 ``` @InProceedings{Siarohin_2019_NeurIPS, author={Siarohin, Aliaksandr and Lathuilière, Stéphane and Tulyakov, Sergey and Ricci, Elisa and Sebe, Nicu}, title={First Order Motion Model for Image Animation}, booktitle = {Conference on Neural Information Processing Systems (NeurIPS)}, month = {December}, year = {2019} } ```