[飞桨] First Order Motion Model for Image Animation

目录

写在前面

任务描述:Image Animation

作者动机

作者贡献

流程概述

用局部仿射变换描述运动

考虑遮挡的图像生成

代价函数

测试阶段:相对运动迁移


写在前面

这篇文章是百度顶会论文复现营GAN方向五篇之一,选择读这篇是因为被老师说的“万物皆可动”打动了,读完之后,发现做出了一个比较正确的选择,作者把一堆难懂的都丢到附录里去了,阅读起来十分友好,再加上这篇其实更多的再讲Image Animation的专业知识,对GAN本身说的倒不是很多,新手就相当舒服了。

任务描述:Image Animation

Video generation 是让静止的图片动起来,Image Animation 是视频生成的一个子类,让静止影像中的物体按照驱动视频的运动轨迹运动,这其中要求静止影像和驱动视频的物体属于同一类别。换脸,制造假新闻等等都可以由这个技术完成,这里的物体是脸,叫face animation,主要捕捉的是表情;也可以捕捉人体动作,可以让一个不会跳舞的人也跳起极乐净土。要说这和GAN有什么关系呢,就是因为要生成图片序列,而不仅仅是动作捕捉。而这篇文章的重点其实是动作捕捉来着。

作者动机

1.特定领域设计

传统方法对要迁移的对象有很强的先验假设,导致各个领域方法不统一,简单来讲就是表情迁移,动作迁移,手势迁移这样相关性很强的工作并不能统一到一个框架下来,因为他们对三维模型的假设不同,脸有一个鼻子,一个嘴巴,两个眼睛,而人体是按关节划分。对先验的要求就是只能各自处理各自的。解决的方法就是不依赖先验,而是做关键点的探测(通过半监督训练得到,对某一类物体进行训练以获得它的关键点个数及分布)

半监督是因为没有办法做完全的监督,因为两个不同物体按相同轨迹运动的数据实在太少了。

2.需要冗长的语义标签,以及目标物体的样本数据

可以把Image Animation 看成一个迁移的问题,这个缺陷也是主要针对这类方法说的,迁移问题是一个域转化到另一个域,只不过两个域训练样本数目不一样,但仍然是需要样本的,也就是说这类方法必须对每一个你要操控的物体进行单独的训练,同时还要那个物体几个小时的视频数据,这一点显然是不友好的。而本文的方法呢,在训练好之后,测试或部署截断,只需要输入源影像和驱动视频就够了,要求只是他们属于和你训练数据的同一类别。

作者贡献

动机只是说的这一类方法的好处,与之属于同一类别的还有X2Face, MonkeyNet,不需要类别先验知识,不需要操控对象的大量样本数据,这两篇也是作者在本文中主要对比的工作。

本文究竟干了啥呢,如题所述,一阶运动模型,MonkeyNet是零阶的,我对阶数的理解是这样的(如有错误,欢迎指正),这类方法将要动的物体划分为K个刚体,对应K个关键点,零阶认为刚体内部所有像素与关键点的运动是一致的,而一阶的运动模型认为还需要考虑像素到关键点的距离,也就是刚体内部的不同像素可以有不同的运动(由于是图像变形,并不影响三维刚体的概念)。围绕这一点,在训练时需额外输出关键点处局部仿射变换矩阵的导数信息,这一点是其他关键点探测方法所不具备的。

另外作者还使用了掩膜,以指示生成网络生成的图像哪些部分应该通过图像变形(Image Wrapping)得到,哪些部分通过图像修补(Image Inpainting)得到。这个掩膜是源影像物体的子集,源影像可以分为背景和要驱动的物体,物体动了之后,原来物体占据的部分就空了出来,需要结合背景进行图像修补,再考虑动了之后其实还是有和之前部分重叠的,这一部分不需要修补,所以掩膜就是源影像物体减去(源影像物体和驱动帧物体的交集),也就是源影像物体减去驱动帧物体。

流程概述

这是一个半监督的网络,训练时的输入是一个个视频,但实际上还是要拆分成一对对的帧,代价函数是驱动帧和生成帧的差值,再加上一个运动恒等变换的约束。网络分成两个部分(仍然是端到端的),运动模块和生成模块。运动模块又可分为两个部分,关键点探测器和密集运动场,关键点探测器除了要探测关键点位置,还要计算局部的仿射变换矩阵加上这个矩阵的一阶导数(Jacobi),要同时估计源影像和驱动帧的关键点变换参数,参数都是相对于虚拟的参考帧(为什么引入,容后再讲)。关键点探测部分是一个U-Net.然后把关键点的参数给密集运动场以生成每一个像素的运动(就是图像的光流场)。同时密集运动场还要输出上面提到的那个掩膜,最后生成模块将密集运动场的输出和源影像结合生成一个新影像。

用局部仿射变换描述运动

先讲一下为什么要引入参考帧,因为源影像和驱动帧在外观上来看可能非常不同,而且这样可以分开处理两张影像。引入之后,D到S的变换还是要求的,因此要求变换是双射的也就是可逆的。

再讲一下为什么是 Ts<--d 而不是Td<--s,显然从源影像到驱动帧更好理解,论文里的说法是,Ts<--d是后向的光流,这样就可以用后向的变形,基于双线性插值的差分方式,更高效(有引文)。

然后上公式吧:

这个X就是S或D,一阶泰勒展开,很好理解,展开处的值加上导数×距离加上余项。描述关键点所对应刚体内的任一像素点的仿射变换矩阵和关键点处仿射变换矩阵的关系

引入参考帧,D到S的变换还是要求的,因此要求变换是双射的也就是可逆的。

经过一番推导变成这个样子,变成这样应该更好算吧,可能要看附录才能理解。

这个是热图(heatmap)的计算公式,主要用于关键点探测,应该是要看前置论文才能理解。

这个公式我理解,Mk是指的掩膜,第k个关键点对应的刚体,M0是指的背景,这个公式的意义就是说像素点只受所在掩膜对应关键点的局部仿射变换影响(私以为,这里是一个改进点,可以考虑蒙皮动画的形式,一个像素可受多个关键点影响,将有利于关节接边处的视觉效果)。这里的掩膜应该也和接下来要输出的整体的掩膜从计算上有点关系。

考虑遮挡的图像生成

 这里主要考虑源影像和驱动帧像素之间不是一一对应的关系,这个问题可以通过特征变形的方式解决,两个下采样卷积层得到一个特征图,然后将这个特征图按照仿射变换矩阵进行变形,具体的估计还得看引文和代码。

代价函数

第一项重建损失:驱动帧和生成影像特征图的差值

这里是特征图的差值(由VGG-19输出,I是特征通道数),推荐使用下采样形成金字塔再做差值,一共有四种分辨率,20个误差项(意思是,输出有五个特征通道?)

第二项恒等约束,是一个正则项

从参考影像到Y再到X和直接从参考影像到X变换应该是一样的,但实际上不一样,所以要约束。不仅要约束零阶的值相等,还要考虑导数的相等(毕竟有了导数,不用白不用)

约束的实际形式就是考虑等式两边变成一个L1 loss。只不过对于导数恒等式而言,由于数值计算的问题,不能直接使用L1,需要变形为下面的形式,将右边和单位阵做L1 loss.

测试阶段:相对运动迁移

预测的时候输入是原始影像和驱动视频,而具体计算是将驱动视频变成若干帧,这里有两种策略,第一种是绝对的,直接计算,以生成影像St,就按照前面的公式;另一种是相对的,借助D1(驱动视频第一帧)做过渡,按照下式

虽然要求驱动视频的第一帧和原始影像位姿基本一致,但带来的好处也是显而易见的,这样可以只传播驱动视频的运动信息,而不包含物体属性信息(因为第一帧位姿已经基本对齐了,要不然每次都要受关键点位置偏差的影响)。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值