反P图技术 水记(用光流还原出原图)
《Detecting Photoshopped Faces by Scripting Photoshop》
https://arxiv.org/abs/1906.05856
想看这篇主要是想看看,他是如何用神经网络对图像进行变形的
Detecting Photoshopped Faces by Scripting Photoshop方法部分理解_飞鸡110的博客-优快云博客
Detecting Photoshopped Faces by Scripting Photoshop笔记_Delia_ing的博客-优快云博客
似乎是用了一个检测网络和一个修正网络
修正网络用的是光流!!!
在检测到一张脸是否被修改过之后,观众自然会问图像是如何被编辑的,图像的哪些部分被扭曲了,图像在被修改之前是什么样子的?
要做到这一点,我们预测一个光学流场 U ^ ∈ R H × W × 2 \hat{U} \in \mathbb{R}^{H \times W \times 2} U^∈RH×W×2 从原始图像 X orig ∈ R H × W × 3 X_{\text {orig }} \in \mathbb{R}^{H \times W \times 3} Xorig ∈RH×W×3 到扭曲图像 X X X ,然后使用它来尝试“反向”操作和恢复原始图像。
光流预测模型的损失函数
损失分为三部分
光流场损失:
L epe ( F ) = ∥ M ⊙ ( F ( X ) − U ) ∥ 2 \mathcal{L}_{\text {epe }}(\mathcal{F})=\|M \odot(\mathcal{F}(X)-U)\|_{2} Lepe (F)=∥M⊙(F(X)−U)∥2
X X X 是输入的编辑后的图像
U U U 是 ground truth 的光流
M M M 是一个二值 mask,用于去除错误的光流。
抛弃在 forward-backward consistency test 中失败的像素,就得到 M ∈ R H × W × 1 M \in \mathbb{R}^{H \times W \times 1} M∈RH×W×1
光流场变化损失:
通过最小化光流场梯度的多尺度损失,来提高光流场的光滑程度
L m s ( F ) = ∑ s ∈ S ∑ t ∈ { x , y } ∥ M ⊙ ( ∇ t s ( F ( X ) ) − ∇ t s ( U ) ) ∥ 2 \mathcal{L}_{m s}(\mathcal{F})=\sum_{s \in S} \sum_{t \in\{x, y\}}\left\|M \odot\left(\nabla_{t}^{s}(\mathcal{F}(X))-\nabla_{t}^{s}(U)\right)\right\|_{2} Lms(F)=s∈S∑t∈{x,y}∑∥M⊙(∇ts(F(X))−∇ts(U))∥2
其中 ∇ x s , ∇ y s \nabla_{x}^{s},\nabla_{y}^{s} ∇xs,∇ys 表示水平和竖直方向上光流场的梯度,decimated by stride s ∈ { 2 , 8 , 32 , 64 } s \in \{2,8,32,64\} s∈{2,8,32,64}
就是说 ∇ x s \nabla_{x}^{s} ∇xs 中的 t t t 表示不同方向, s s s 表示不同尺度(步长)
这个式子就是用来减小 不同方向 不同尺度 的 预测光流场 的 梯度 与 真实光流场 的 梯度 的差别
重建损失:
L r e c ( F ) = ∥ T ( X ; F ( X ) ) − X orig ∥ 1 \mathcal{L}_{r e c}(\mathcal{F})=\left\|\mathcal{T}(X ; \mathcal{F}(X))-X_{\text {orig }}\right\|_{1} Lrec(F)=∥T(X;F(X))−Xorig ∥1
只应用重构损失会导致 low-texture regions 的歧义,这往往会导致伪影
组合三种损失:
L total = λ e L epe + λ m L m s + λ r L rec \mathcal{L}_{\text {total }}=\lambda_{e} \mathcal{L}_{\text {epe }}+\lambda_{m} \mathcal{L}_{m s}+\lambda_{r} \mathcal{L}_{\text {rec }} Ltotal =λeLepe +λmLms+λrLrec
其中, λ e = 1.5 , λ m = 15 , λ r = 1 \lambda_e=1.5,\ \lambda_m=15,\ \lambda_r=1 λe=1.5, λm=15, λr=1
模型架构
作者使用 DRN-C-26 [39],在ImageNet[32]数据集上预先训练,作为用于局部预测的基础网络。
DRN架构最初是为语义分割而设计的,作者发现它在翘曲预测任务中工作得很好。
作者发现,直接训练光流回归网络的性能很差。
作者首先将问题重构为回归问题中常用的多叉分类(如着色[22,40]、表面法线预测[36]和生成式建模[27]),然后用回归损失进行微调。
作者使用 PWC-Net [33] 计算 ground truth 光流。
训练程序的细节见附录A6。
训练,分为两阶段
(专门去看了附录)
光流估计模型的训练分为两个阶段,
先在离散化的光流场上预训练,再在真正的光流场上微调
阶段一:
先训练一个逐像素的 121 类分类器,用于预测离散化的形变场
形变场每个像素的向量被离散化为 { u , v } \{u,v\} {u,v}
其中 u , v ∈ { − 5 , − 4 , ⋯ , 0 , ⋯ , 4 , 5 } u,v\in \{-5,-4,\cdots,0,\cdots,4,5\} u,v∈{−5,−4,⋯,0,⋯,4,5} (绝对值超过 5 的被截断),正好是 121 种组合
这种策略与 Zhang et al. [40] 一致(这个是做图片上色的),先做离散化的多分类任务,再微调,会比直接训练有更好的效果
阶段二:
用预训练的模型初始化光流估计模型的基础网络,剩余部分用高斯分布随机初始化
两个阶段都是用的 Adam 优化器
Experiments
评估一种用的是人工ps的,一种用的是脚本ps的
首先研究验证集上修改的图像是否可以由全局分类器检测到。 通过扰动图像来测试分类器的鲁棒性,并测量其对专业艺术家操作的泛化能力