Exposing Deep Fakes Using Inconsistent Head Poses论文详记

Exposing Deep Fakes Using Inconsistent Head Poses论文详记ExposingDeepFakesUsingInconsistentHeadPoses论文详记一、论文简述二、论文内容A、三维头部姿势估计B、DeepFake中头部姿势的不一致性C、基于头部姿势的分类三、论文实验及结果一、论文简述利用3D头部姿势误差检测DeepFake视频,属于基于帧内图像伪影的检测方法,使用低级语义层次特征+SVM分类器,属于浅层分类器方法。二、论文内容作者观察到,在DeepFake产生的过程中,会把生成的虚假人脸拼接到源视频图像中的人脸区域,在这个过程中,将不可避免

大家好,又见面了,我是你们的朋友全栈君。


原文链接:
https://ieeexplore.ieee.org/abstract/document/8683164.

一、论文简述

利用3D头部姿势误差检测DeepFake视频,属于基于帧内图像伪影的检测方法,使用低级语义层次特征+SVM分类器,属于浅层分类器方法。

二、论文内容

作者观察到,在DeepFake产生的过程中,会把生成的虚假人脸拼接到源视频图像中的人脸区域,在这个过程中,将不可避免地引入一种三维头部姿势误差,这种误差是基于深度神经网络人脸合成模型的内在局限性。具体来说,基于神经网络的额算法生成新的虚假人脸,同时在生成人脸中保持源人脸的面部表情,然而,这个过程中无法保证生成人脸和源人脸的面部LandMark(LandMark是人类面部一些重要结构的位置,比如眼镜、嘴角等)相一致。LandMark位置的误差可能不能直接通过肉眼察觉,但可以通过面部中真实部分和伪造部分(中心区域)的二维LandMark估计的头部姿势(即头部方向和位置)的差距来揭示。3D头部姿势误差
如上图所示,图左边是DeepFake的生成流,其中(a)是原始图像,(b)是图像中的人脸区域,(c)是检测出来的2D人脸LandMark,(d)对(a)中的人脸区域做仿射变换(旋转、缩放等),转化成标准化的脸部区域,(e)是深度神经网络合成的脸部区域,并保有(d)中的面部表情,(f)利用(d)中的逆仿射变换,将合成的面部区域匹配回源视频中的面部形状,(g)将合成的脸部融合进源图片中,得到(h)为虚假图片。图右边为本文方法的overview,其中上面一行对应于真实图片,下面一行对应于虚假图片。作者比较了使用整个脸部的LandMark(j和m)以及仅使用脸部中心区域的LandMark(i和l)估计的头部姿势,发现真实图片中两者差距不大,而虚假图片中两者在图像平面的投影方向不一致,由此,作者利用整个脸部的LandMark与中心区域的LandMark估计头部姿态的差异作为特征向量,训练了一个简单的基于SVM的分类器来区分真实视频和DeepFake视频。

A、三维头部姿势估计

三维头部姿势对应于真实坐标到相应相机坐标的旋转和平移。具体地,将[U,V,W]T表示为一个面部LandMark的真实坐标,[X,Y,Z]T表示为其相机坐标,(x,y)T表示为其图像坐标。真实坐标系和相机坐标系之间的转换可以表示为:
[ X Y Z ] = R [ U V W ] + t → (1) {\left[ \begin{array}{ccc} X \\ Y \\ Z \end{array} \right ]} = R { \left[ \begin{array}{ccc} U \\ V \\ W \end{array} \right ]} + \mathop{t}\limits ^{\rightarrow} \tag{1} ⎣⎡​XYZ​⎦⎤​=R⎣⎡​UVW​⎦⎤​+t→​(1)
其中R是3×3的旋转矩阵, t → \mathop{t}\limits ^{\rightarrow} t→​是3×1的偏移矩阵,则摄像机和图像坐标系之间的转化定义为:
s [ x y 1 ] = R [ f x 0 c x 0 f y c y 0 0 1 ] [ X Y Z ] (2) {s\left[ \begin{array}{ccc} x \\ y \\ 1 \end{array} \right ]} = R { \left[ \begin{array}{ccc} f_x & 0 & c_x\\ 0 & f_y & c_y\\ 0 & 0 & 1 \end{array} \right ]} { \left[ \begin{array}{ccc} X\\ Y \\ Z \end{array} \right ]} \tag{2} s⎣⎡​xy1​⎦⎤​=R⎣⎡​fx​00​0fy​0​cx​cy​1​⎦⎤​⎣⎡​XYZ​⎦⎤​(2)
其中 f x f_x fx​和 f y f_y fy​是X、Y方向上的焦距, ( c x , c y ) (c_x,c_y) (cx​,cy​)是光学中心, s s s是一个未知的缩放因子。

在三维头部姿势估计中,我们需要解决的是反向的问题,即使用从标准模型获取的同一组面部LandMark的二维图像坐标 ( x i , y i ) (x_i,y_i) (xi​,yi​)和三维真实坐标 ( U i , V i , W i ) (U_i,V_i,W_i) (Ui​,Vi​,Wi​)来估计 s s s、 R R R和 t → \mathop{t}\limits ^{\rightarrow} t→​。例如:假设相机参数已知(即 f x f_x fx​、 f y f_y fy​、 ( c x , c y ) (c_x,c_y) (cx​,cy​)已知),针对一个3D人脸模型,对于1组共n个面部LandMark,可以表述为以下一个优化问题:
m i n s , R , t → ∑ i = 1 n ∣ ∣ s [ x i y i 1 ] − [ f x 0 c x 0 f y c y 0 0 1 ] ( R [ U i V i W i ] + t → ) ∣ ∣ 2 \underset{s,R,\mathop{t}\limits ^{\rightarrow}}{min} \sum_{i=1}^n|| {s\left[ \begin{array}{ccc} x_i \\ y_i \\ 1 \end{array} \right ]} – { \left[ \begin{array}{ccc} f_x & 0 & c_x\\ 0 & f_y & c_y\\ 0 & 0 & 1 \end{array} \right ]} ( {R\left[ \begin{array}{ccc} U_i \\ V_i \\ W_i \end{array} \right ]} + \mathop{t}\limits ^{\rightarrow} )||^2 s,R,t→​min​i=1∑n​∣∣s⎣⎡​xi​yi​1​⎦⎤​−⎣⎡​fx​00​0fy​0​cx​cy​1​⎦⎤​(R⎣⎡​Ui​Vi​Wi​​⎦⎤​+t→​)∣∣2
上面这个优化公式可以利用Levenberg-Marquardt算法有效地解决,得到估计的R是摄像机姿态,它是摄像机相对于真实世界坐标的旋转,则头部姿态是通过将其反转为RT(因为R是一个正交矩阵)来获得的。

B、DeepFake中头部姿势的不一致性

如上图(c)所示,DeepFake处理会将面部中心区域P0中的LandMark仿射变换为P0_in=MP0,通过生成模型后,其对应的LandMark在合成面部上是Q0_out。由于DeepFake中的生成神经网络不能保证LandMark的匹配,而且不同人有不同的面部结构,这便导致了Q0_out与P0_in具有不同的位置。通过比较795张64×64图像的51个中心区域LandMark,得出生成性神经网络中LandMark从输入到输出的平均偏移量为1.540像素,偏移标准差为0.921像素。经过逆变换后得到Q0=M-1Q0_out,显然虚假人脸中的标志点位置Q0也会不同于原始人脸中的标志点位置P0。

然而由于DeepFake处理中一般只替换面部的中心区域,面部外轮廓上的标志点位置不会改变,这种合成面部中心点和外轮廓点之间的不匹配被进一步揭示为由中心位置LandMark和整个面部LandMark估计的三维头部姿势的不一致。在真实图像中,中心区域和整个人脸区域的头部姿态差异较小,而在虚假图像中,中心区域和整个人脸区域的头部姿态差异较大。

作者进行实验来证实假设,为简单起见,只考虑头部方向向量。设 R a T R_a^T RaT​是由整个脸部LandMark(下图中的红点加蓝点)估计的旋转矩阵,设 R c T R_c^T RcT​是仅由面部中心区域LandMark(下图中的红点)估计的旋转矩阵
在这里插入图片描述
我们可以得到两种方法对应的头部方向的三维单位向量( w → = [ 0 , 0 , 1 ] T \mathop{w}\limits ^{\rightarrow}=[0,0,1]^T w→=[0,0,1]T,是真实坐标轴的W轴方向):
v a → = R a T w → , v c → = R c T w → \mathop{v_a}\limits ^{\rightarrow}=R_a^T\mathop{w}\limits ^{\rightarrow}, \mathop{v_c}\limits ^{\rightarrow}=R_c^T\mathop{w}\limits ^{\rightarrow} va​→​=RaT​w→,vc​→​=RcT​w→
之后我们比较 v a → \mathop{v_a}\limits ^{\rightarrow} va​→​和 v c → \mathop{v_c}\limits ^{\rightarrow} vc​→​之间的余弦距离,即: 1 − v a → ⋅ v c → / ( ∣ ∣ v a → ∣ ∣ ∣ ∣ v c ∣ ∣ ) 1-\mathop{v_a}\limits ^{\rightarrow}·\mathop{v_c}\limits ^{\rightarrow}/(||\mathop{v_a}\limits ^{\rightarrow}||||\mathop{v_c}\limits||) 1−va​→​⋅vc​→​/(∣∣va​→​∣∣∣∣vc​∣∣),易知式子取值[0,2],当为0时, c o s θ = 1 cos{\theta}=1 cosθ=1,即 θ = 0 {\theta}=0 θ=0,此时 v a → \mathop{v_a}\limits ^{\rightarrow} va​→​与 v c → \mathop{v_c}\limits ^{\rightarrow} vc​→​方向一致。下图所示是一组原始图片和DeepFake图片中 v a → \mathop{v_a}\limits ^{\rightarrow} va​→​与 v c → \mathop{v_c}\limits ^{\rightarrow} vc​→​之间的余弦距离的统计直方图比较。
va和va之间的余弦距离的统计直方图
显而易见,真实图像估计的两个头部姿态向量的余弦距离集中在一个显著较小的范围内,最大值可达0.02,而对于DeepFakes,大多数值在0.02到0.08之间。 两个头部姿势向量的余弦距离分布的差异表明,它们可以根据这个线索进行区分。

C、基于头部姿势的分类

作者进一步利用上述分析训练了一个SVM分类。首先使用DLib工具包在每帧的图像中检测人脸并提取68个脸部LandMark,然后借助OpenFace2工具包,分别利用全脸特征点(蓝加红)和中心区域特征点(红)估计出头部姿势(作者将相机焦距近似为图像的宽度和高度,将光学中心近似为图像中心,即忽略了镜头畸变带来的影响),最后将获得的旋转矩阵之间的差距 ( R a − R c ) (R_a-R_c) (Ra​−Rc​)和平移矩阵之间的差距 ( t a → − t c → ) (\mathop{t_a}\limits ^{\rightarrow}-\mathop{t_c}\limits ^{\rightarrow}) (ta​→​−tc​→​)展平成向量,并减去均值,除以标准差达到归一化的效果,最终用于分类。

三、论文实验及结果

实验数据集:①UADFV;② DARPA MediFor GAN Image/Video Challenge
实验效果:以AUROC作为性能度量,分类特征为 ( R a − R c ) & ( t a → − t c → ) (R_a-R_c)\&(\mathop{t_a}\limits ^{\rightarrow}-\mathop{t_c}\limits ^{\rightarrow}) (Ra​−Rc​)&(ta​→​−tc​→​),效果如下图所示:
在这里插入图片描述

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/141502.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • GoogLeNet论文学习笔记

    GoogLeNet论文学习笔记GoogLeNet论文学习笔记Abstract提出一种叫做inception的卷积神经网络结构,基于inception构建的22层的深度网络(GoogLeNet)刷新了ILSVRC14分类和检测任务的stateofart。这种结构的主要特点就是加大了网络的深度和宽度,并且不增加运算量,提高了计算资源的利用效率。为了优化效果,inception结构的设计基于海扁准则和多尺度处理问题的直觉。

    2022年8月14日
  • python win32api教程_解放双手——python win32api 入门「建议收藏」

    python win32api教程_解放双手——python win32api 入门「建议收藏」#_*_coding:UTF-8_*_”’本文在原程序的基础上做了修改补充,更加清晰易懂。get_mouse_point():返回当前鼠标的值(x,y)mouse_move(x,y):移动鼠标mouse_click(x,y):单击mouse_dclick(x,y):双击put(str=”,flag=0):flag默认为0,则表示输入的字符串,为1:字符要表示的是快捷组合按键,快捷键要用空…

    2022年10月11日
  • Spring Cloud面试题(2020最新版)[通俗易懂]

    Spring Cloud面试题(2020最新版)[通俗易懂]文章目录为什么需要学习SpringCloud什么是SpringCloud设计目标与优缺点设计目标优缺点SpringCloud发展前景整体架构主要项目SpringCloudConfigSpringCloudNetflixSpringCloudBusSpringCloudConsulSpringCloudSecuritySpringCloudSleuthSpringCl…

    2022年5月7日
  • outputstreamwriter.write_InputStreamReader

    outputstreamwriter.write_InputStreamReader|–字符流(字符流=字节流+编码表。)|–字符输入流Reader——抽象类intread():一次读取一个字符intread(char[]chs):一次读取一个字…

    2022年9月4日
  • ZigBee协议栈简介和流程「建议收藏」

    ZigBee协议栈简介和流程「建议收藏」ZigBee协议栈实际上就是ZigBee协议的API接口一般步骤为:1.组网:调用协议栈的组网函数、加入网络函数,实现网络的建立与节点的加入2.发送:发送节点调用协议栈的无线数据发送函数,实现无线数据发送3.接收:接收节点调用协议栈的无线数据接收函数,实现无线数据接收大致流程:main()→osal_init_system()→osalInitTasks()→SampleAp

    2022年5月8日
  • phpstorm运行thinkphp_零基础入门编程教程

    phpstorm运行thinkphp_零基础入门编程教程PHPStorm是流行对PHP及前端开发IDE,在开发者初次使用写PHP代码时该怎么用呢~1、CreateNewProject2、选择PHPEmptyProject,并新建一个空目录(目录不要放在C盘!!!)3、项目工程中,中刚刚创建对文件夹图标上,点击右键,选择PHPFile,输入文件名,即可创建4、输入完成php代码,点击空白处,右上角会出现chrome、firefox等浏览器的图…

    2022年10月2日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号