《Multiple-Operation Image Anti-Forensics with WGAN-GP Framework 》代码复现

这是什么

因为一个比赛,我们去看文献,然后恰好读到这篇论文,名字叫《Multiple-Operation Image Anti-Forensics with WGAN-GP Framework 》,简单来说就是对于一张篡改图片,我们使用多种后处理方法隐藏篡改痕迹,然后再使用WGAN网络隐藏痕迹,让篡改真正做到无迹可寻(实际的欺骗率大概在50%左右)。

网络结构

《Multiple-Operation Image Anti-Forensics with WGAN-GP Framework 》代码复现
这就是论文中给出的图片结构,还是比较清晰的。

损失函数

损失函数分为两个:生成器和判别器。
首先是生成器的损失函数
L G = E x ‘ [ α L G p i x e l + β L G v g g + γ L G a d v ] L_G = E_{x^`}[αL_{G}^{pixel}+βL_{G}^{vgg}+γL_{G}^{adv}] LG=Ex[αLGpixel+βLGvgg+γLGadv]
其中有
L G p i x e l = 1 N ∑ i = 1 N ∣ x i − G ( x i ‘ ) ∣ L_{G}^{pixel}= \frac{1} {N} \sum_{i=1}^N \mid x_i-G(x_{i}^`) \mid LGpixel=N1i=1NxiG(xi)
L G v g g = 1 N ∑ i = 1 N ∥ θ ( x ) i − θ ( G ( X ‘ ) i ) ∥ 2 2 L_{G}^{vgg}=\frac{1}{N} \sum{i=1}^N \parallel \theta(x)_i-\theta(G(X^`)_i) \parallel_{2}^{2} LGvgg=N1i=1Nθ(x)iθ(G(X)i)22
其中 θ ( x ) \theta(x) θ(x)表示用ImageNet训练的VGG-19网络的第12层卷积层输出的特征图
L G a d v = − C ( G ( X ‘ ) ) L_{G}^{adv}=-C(G(X^`)) LGadv=C(G(X))

接着是判别器的损失函数,其损失函数表达式如下
L C = E x [ C ( x ) ] − E x ‘ [ C ( G ( x ‘ ) ) ] + λ E x ^ [ ( ∥ ▽ x ^ C ( x ^ ) ∥ 2 ) − 1 ) 2 ] L_C=E_x[C(x)]-E_{x^`}[C(G(x^`))]+\lambda E_{\widehat{x}}[({\parallel \triangledown_{\widehat{x}}C(\widehat{x}) \parallel}_2)-1)^2] LC=Ex[C(x)]Ex[C(G(x))]+λEx [(x C(x )2)1)2]
其中 x ^ = ϵ x + ( 1 − ϵ ) G ( x ‘ ) \widehat{x}=\epsilon x+(1-\epsilon)G(x^`) x =ϵx+(1ϵ)G(x)并且 λ = 10 \lambda=10 λ=10

我们复现的时候将VGG19变成了VGG16,输入是128*128的图片,经过VGG16网络后得到512*4*4的特征图。

代码

代码都上传码云了,数据集用的是篡改数据集,一共900多张图片,设置batchsize为16,用GTX1080大概跑了4个小时。
训练结果如下
《Multiple-Operation Image Anti-Forensics with WGAN-GP Framework 》代码复现
生成器的效果如下
《Multiple-Operation Image Anti-Forensics with WGAN-GP Framework 》代码复现
码云仓库传送门