Exposing Fake Images with Forensic Similarity Graphs
一、简介
这篇文章是LEARNED FORENSIC SOURCE SIMILARITY FOR UNKNOWN CAMERA MODELS的进一步改进,在上一篇文章中对于篡改定位的抉择是需要在已知未改变区域中选择一个参考patch块,故对于这个patch块的选择很敏感,于是作者在本文中提出了另一种基于图论的社区结构检测图像篡改定位
二、取证相似图
在这种社区结构里面,我们将每个patch块视作图中的一个顶点,顶点之间的边缘则有两个patch块的相似性度量(参考简介论文的网络B)为权重,社区检测的最终目的是将已篡改和未篡改的patch块分为不同的社区集群进行划分。简单来说就是篡改区域内的边缘具有高权重密集连接,与篡改外区域断开连接(或具有很低的权重),过程大致如下:
- 从图像中抽取n个patch
- 根据以前做的工作计算出所有采样两两之间的取证相似性
- 根据上述计算结果,将patch转为图的表示形式
- 通过分析取证相似图中的社区结构进行伪造检测或定位
采样
整个采样过程使用了规则间隔和重叠的方形patch,通常使用了128x128或256x256的patch,并且在x和y轴方向有50%到75%的重叠以提高空间分辨率
加权邻接矩阵(边权矩阵)
顶点之间边的权重主要取决于两个顶点patch之间的取证相似度,假设相似性大于阈值,则边的权值等于两个patch的取证相似度,否则为0。
W
(
i
,
j
)
=
{
S
(
X
i
,
X
j
)
S
(
X
i
,
X
j
)
≥
t
0
S
(
X
i
,
X
j
)
<
t
W(i,j)=\begin{cases}S(X_i,X_j) & S(X_i,X_j)≥t \\0 & S(X_i,X_j)<t\end{cases}
W(i,j)={S(Xi,Xj)0S(Xi,Xj)≥tS(Xi,Xj)<t
其中
S
(
X
i
,
X
j
)
S(X_i,X_j)
S(Xi,Xj)表示取证相似度,X为patch块,取证相似度越靠近1表示两者之间高度相似,t为经验阈值
三、社区检测
在社区检测中,既可以经过社区的划分实现伪造检测,又能根据社区检测进一步的实现伪造定位,文中主要介绍了两种社区检测的划分方法,分别为光谱聚类和模块化优化。值得一提的是,划分社区这种行为可以从一堆patch中分割出被篡改区域,但不能识别出分割出的哪块是被篡改区域,故每个顶点其实最终会映射到一个二维的社区标识符上{1,2}
谱聚类
这是一种将图划分为簇的技术,利用拉普拉斯矩阵的性质来确定群落结构
图的拉普拉斯矩阵L定义为
L
=
D
−
W
L=D-W
L=D−W
其中W为元素
W
i
,
j
=
S
(
X
i
,
X
j
)
W_{i,j}=S(X_i,X_j)
Wi,j=S(Xi,Xj)的取证相似矩阵,D的值为
D
i
i
=
∑
j
W
i
,
j
D_{ii}=\sum_{j}W_{i,j}
Dii=∑jWi,j,所以D其实为一个对角线非0,其余元素全零的对角阵
此外还定义了图的拉普拉斯算子
L
n
o
r
m
=
D
−
1
/
2
L
D
−
1
/
2
L_{norm}=D^{-1/2}LD^{-1/2}
Lnorm=D−1/2LD−1/2,可以使矩阵正则化,下面简述一下拉普拉斯算子的性质
它的特征值至少有一个为0,且特征值为0的多重性等于图中断开群落的数量,进一步来讲,0的特征空间是由特征向量A给出的,其中A的每个元素
A
i
A_i
Ai表示第i个元素对于的patch属于哪个社区。
伪造检测
使用特征值=0的多重性等于图中断开的社区数量来确定图像是否被伪造,在伪造检测中只需要注意是否存在多个社区(即是否图像被篡改)即可。在文中的方法里面,计算了拉普拉斯算子矩阵的第二最小的特征值 λ 2 \lambda_2 λ2,如果这个值很低,则表明至少存在两个群落甚至更多,如果这个值很高则表明只有一个社区存在,故伪造检测的决策规则为Spectral Gap(G) = { 未修改 λ 2 ≥ τ 修改 λ 2 < τ =\begin{cases}未修改 & \lambda_2≥\tau \\修改 & \lambda_2<\tau\end{cases} ={未修改修改λ2≥τλ2<τ其中G是图像的取证相似图, τ \tau τ是经验决定的阈值。
伪造定位
考虑二维社区标识符{1,2},在文中作者给出的方法为计算
λ
2
\lambda2
λ2对应的特征向量
μ
2
\mu_2
μ2
L
μ
2
=
λ
2
μ
2
L\mu_2=\lambda_2\mu_2
Lμ2=λ2μ2
接下来根据
μ
2
\mu_2
μ2的每个分量的符号来决定每个顶点patch属于哪个社区,在实际算法运行的时候
μ
2
\mu_2
μ2的值呈现正负分布,与篡改区域的patch对应的值都大于0,与未改变区域的补丁都小于0
c
i
=
{
1
μ
i
,
2
≥
0
2
μ
i
,
2
<
0
c_i=\begin{cases}1 & \mu_{i,2}≥0 \\2 & \mu_{i,2}<0\end{cases}
ci={12μi,2≥0μi,2<0
其中
c
i
c_i
ci表示对应的patch属于哪个社区,故社区1表示篡改的区域,这是伪造定位的patch级块表示。
文中还给出了篡改区域的像素级定位方法,大致是计算每个像素属于多少个patch块,并预测它属于哪个社区,并且考虑边缘像素被较少色斑覆盖的问题,使用归一化像素图进行表示,最后使用高斯模糊平滑归一像素图,最后将模糊后的归一化像素图的每个像素点与经验阈值进行对比以确定篡改区域。
模块化优化
该方法在论文中比重不大,故未书写
实验结论
首先整个实验结果显示,考虑了社区这种特殊结构与其他朴素方法相比,在大部分场景下都有着更好的算法运行效果。且作者在此基础上进一步研究了伪造块大小对于算法检测的影响,实验表明所提出的方法对篡改区域的大小有着强烈依赖性,当伪造大小等于或大于分析patch块大小时,谱聚类方法表现良好。
最后给出其他博主的github实现:代码实现