首页 > 技术文章 > .《First order motion for Image Animation》心得

ljh354114513 2021-12-06 19:19 原文

  《First order motion for Image Animation》

1.论文理解:

       很难在同一框架下,完成表情迁移,动作迁移等多项目研究。像表情迁移,其中有固定的眼,鼻子,嘴巴。像动作迁移,有固定关节等。目标不一样很难实现。本文采用关键点检测的方法。想做什么就通过导入大量相同类型下的数据(表情迁移,数据就是人脸表情的变化。动作迁移,数据就是人动作变化),用模型去判别,关键点及分布。

2.任务描述:

        以表情迁移来讲,图片动画化,给定一个源图像,给定一个驱动视频,可以生成一个视频,其中主题是源人物,视频中源人物的表情是有驱动视频中的表情所确定。

3.动机

        万物皆可动,该模型可应用于表情迁移,虚拟换衣等多个领域。不需要源图片的先验信息和标签信息相对于Monkey-net对于无法通过图像扭曲得到图片的话,采用贴图(image inpainting)方法得到。

输入:                                                                                                 输出:

   源图像 S         -----------------------------------------------------------+++\         Ts ← D   密集运动场 

 驱动图像 D       -----------------------------------------------------------+++/        Os ← D   贴图遮罩

注:

①  Ts ← D   密集运动场,D中的关键点到S的映射关系,其中通过 参考帧R得到,用R分别对应D与S建立关系,从而建立两者之间关系。

② Os ← D  大概对应 代码中的  occlusion-map,表明在最终生成的图像中,对于驱动图像D而言,哪部分姿态可以通过S扭曲得到,那部分只能通过贴图 (image inpainting)方法得到。

Keypoint_detect(关键点检测)

关键点探测器除了要探测关键点位置,D和S中关键点的位置是 由编码器-解码器网络 (Hourglass结构) 分别预测,还要计算局部的Affine Transformation(仿射变换)矩阵加上这个矩阵的一阶导数(Jacobi),要同时估计源影像和驱动帧的关键点变换参数,参数都是相对于虚拟的参考帧(因源影像可能与驱动帧可能完全不同)。关键点探测部分是一个U-Net.然后把关键点的参数给密集运动场以生成每一个像素的运动(就是图像的光流场)。考虑遮挡的图像生成这里主要考虑源影像和驱动帧像素之间不是一一对应的关系,这个问题可以通过特征变形的方式解决,两个下采样卷积层得到一个特征图,然后将这个特征图按照仿射变换矩阵进行变形。

Affine Transformation(仿射变换)

引入参考帧(原影像),因原影像和驱动帧在外观上可能非常不同,建立R系,使用标准的U-Net架构来估计K个热图,每个热图一个 关键点。解码器的最后一层使用softmax激活,以预测可以 被解释为关键点检测置信度图。估计每个预期的关键点位置 使用对应公式进行平均运算。

Dense motion (密集运动)

掩膜为源影像中的子集。掩膜就是源影像物体减去(源影像物体和驱动帧物体的交集),也就是源影像物体减去驱动帧物体。同时密集运动场还要输出上面提到的那个掩膜,最后生成模块将密集运动场的输出和源影像结合生成一个新影像。大概意思:假设影像中,只有我的手运动,身体躯干与原始背景都未改变,此时图片其他部分不需要修复,只需要修复手运动部分。原始影像-当前,不同部分为掩膜。掩膜大概就是修补部分?

遮挡感知图像生成

源图像不是与要生成的图像逐像素对齐的 为了处理这种错位,我们使用了类似于[30,29,15]的特征扭曲策略

训练损失

使用预先训练的VGG-19网络作为主要驾驶损失这 分辨率分别为256 × 256、128 × 128、64 × 64和32 × 32。因为训练过程是一个图像重建的过程,所以引入了重建损失,具体形式为感知损失,将两幅图片分别过VGG19,取其中5层的特征值分别做差,平均然后求和。此外,感知损失采用了金字塔模式,即在4个不同的尺度上进行计算(256、128、64、32)。

4.文件架构

1. demo.py 为测试入口文件
2. run.py 为训练的入口文件(训练的基础配置和模型定义)
3. train.py为训练的入口文件(配置训练)
4. frames_dataset.py完成对数据读入的定义
5. generator.py 中完成对生成模块中的生成器定义
6. discriminator.py中完成对生成模块中判别器的定义
7. keypoint_detector.py中完成对动作估计模块的骨骼关键点提取定义
8. dense_motion.py将关键点转换为D到S的映射,在生成器中使用
9. model.py是为了将所有与生成器/判别器有关的更新合并到同一个模型中,方便训练

5.运行

一.Config 配置文件

1.将配置文件yaml文件放入此文件夹下

二.Data 数据集文件

1.将训练集与测试集分别放置于train,test两个文件夹下

2.yaml文件下的root_dir参数为数据集路径

终端运行

python run.py  --config config/mgif-256clone.yaml --device_ids 0

会生成一个checkpoint.pth.tar压缩文件,此文件为模型参数文件

终端运行

checkpoint.pth.tar(关键点检测参数文件)放入自定义的文件夹下

python demo.py --config config/mgif-256clone.yaml --driving_video DSC/driving_video.mp4 --source_image DSC/xinba.png --checkpoint DSC/checkpoint.pth.tar --relative --adapt_scale

python demo.py --config config/mgif-256.yaml --driving_video REP/driving_video.mp4 --source_image REP/xinba.png --checkpoint REP/mgif-cpk.pth.tar --relative --adapt_scale

                            

 

推荐阅读