Tampering Detection and Localization through Clusteringof Camera-Based CNN Features 论文读后总结
简介:
- 这篇论文主要是提出了一种对于图像拼接操作的取证算法,由于相机成像过程中包括但不限于去马赛克算法、相机畸变等原因使得同一模型的相机拍摄出的照片具有类似指纹的特性,文章以一个CNN卷积神经网络为预处理,以patch的方式提取单张图片的多个局部相机特征,并以k均值聚类算法将提取特征进行分类,从而进行取证。
论文使用的CNN:
作者所使用的CNN由参考文献的另一篇文章给出:文章地址
这里简单讲解一下该CNN的结构,首先输入大小为64x64x3的规格,原文是排除了过明或过暗的patch块,并根据平均值等筛选条件选择了k个输入patch块。在这篇取证论文中,作者引入了一个置信度函数Q(i,j),并将整张图以64x64的大小进行划分,最终选择置信度最高的32块patch作为CNN输入。具体网络结构如下:
- 第一个卷积层有32个大小为4x4x3的过滤器,步长为1,然后接着一个最大池化层,内核大小为2x2,步长为2.
- 第二个卷积层有48个大小为5x5x32的过滤器,步长为1,然后接着一个最大池化层,内核大小为2x2,步长为2.
- 第三个卷积层有64个大小为5x5x48的过滤器,步长为1,然后接着一个最大池化层,内核大小为2x2,步长为2
- 第四个卷积层有128个大小为5x5x64的过滤器,步长为1,到这里输出一个128个元素的向量
- 接下来将这个向量使用ReLu函数进行激活
- 最后将这含有128个元素的特征向量进入Softmax层,输出结果作为后续分类的输入
实现流程
特征提取
整个特征提取,首先是将图片分为64x64的patch块,通过CNN网络的学习,可以从每个patch中提取出一个包含相机模型信息的特征向量。其中P(i,j)表示一个patch块的输入,f(i,j)是每个patch块对应CNN输出。i、j分别为图片宽度W和图片高度H除以64的结果,也就是说i∈[1,W/64],j∈[1,H/64]。在理想情况下,f(i,j)应该在某个元素位置呈现非常接近1的最大值,表示该patch块是来自某个相机模型。而如果是由于噪声、或训练CNN时未知的相机模型,则f(i,j)可能呈现出不同的情况。
这里特别指出CNN网络训练的一些参数设置 动量为0.9,权值衰减设为7.5*10^-3,学习率从0.01开始呈指数衰减。
信心计算(置信度函数Q(i,j))
作者给出了这样的一个函数用于计算置信度
Q
(
i
,
j
)
=
1
3
∑
c
∈
[
R
,
G
,
B
]
[
α
∗
β
(
μ
c
−
μ
c
2
)
+
(
1
−
α
)
(
1
−
e
γ
σ
c
)
]
Q(i,j)=\frac{1}{3}\sum_{c∈[R,G,B]}[\alpha*\beta(\mu_{c}-\mu_c^2)+(1-\alpha)(1-e^{\gamma\sigma_c})]
Q(i,j)=31∑c∈[R,G,B][α∗β(μc−μc2)+(1−α)(1−eγσc)]
其中α=0.7 β=4 γ=ln(0.01) μ和σ则分别是当前patch块的RGB在范围是[0,1]之间的平均值和标准差,Q(i,j)的值∈[0,1],该值越低代表CNN对于该patch块的信心就越低。
篡改掩码估计
根据已经获得的P(i,j)和Q(i,j)以及特征向量f(i,j)可以进行掩码的生成,首先初始化一个二进制矩阵M(i,j),其中M(i,j)=0表示该patch块是原始的,M(i,j)=1表示该patch块是有异常的。在进行M(i,j)的初始化时,做出这样一个假设,即大部分特征向量f(i,j)应该是来自单个相机,只有异常拼接区域的才是来自不同相机模型。这里使用了k-means算法进行聚类,算法原理及实现参考:(k-means算法原理与tensorflow实现)在分类以后,如果f(i,j)属于基数最高的集群,则将对应的M(i,j)=0,相反其他的M(i,j)=1。
在掩码初始化以后,还需要对其进行细化与迭代,具体方式如下:
- 1、计算M(i,j)=0的所有特征向量的质心
- f ‾ = a v e r a g e ( f ( i , j ) ( i , j ) ∣ M ‾ = 0 ) \overline{f}=average({f(i,j)_{(i,j)|\overline{M}=0}}) f=average(f(i,j)(i,j)∣M=0)
- 2、计算所有M(i,j)=1的特征向量与质心
f
‾
\overline{f}
f之间的Bray-Curtis距离,其中
f
(
i
,
j
)
k
f(i,j)_k
f(i,j)k表示该特征向量的第k个元素,且由f(i,j)和的值不难推出d(i,j)∈[0,1]
- d ( i , j ) = ∑ k = 1 N c a m s ∣ f ‾ ( i , j ) k − f ( i , j ) k ∣ ∑ k = 1 N c a m s ( f ‾ ( i , j ) k + f ( i , j ) k ) d(i,j)=\frac{\sum_{k=1}^{N_{cams}}|\overline{f}(i,j)_k-f(i,j)_k|}{\sum_{k=1}^{N_{cams}}(\overline{f}(i,j)_k+f(i,j)_k)} d(i,j)=∑k=1Ncams(f(i,j)k+f(i,j)k)∑k=1Ncams∣f(i,j)k−f(i,j)k∣
- 3、如果d(i,j)的值小于给定阈值,则将其视为原始区域 M(i,j)=0 if d(i,j) < τ d i s t \tau_{dist} τdist
- 对整个M(i,j)使用2x2的核进行腐蚀和膨胀操作来改造估计
M
‾
\overline{M}
M
以上述过程进行迭代直到所有M(i,j)=0或者 M ‾ \overline{M} M相对于前一次迭代没有变化
在进行最后一次迭代后还要考虑每个补丁的置信度问题,即 M ‾ \overline{M} M(i,j)=0 if Q(i,j) < τ c o n f \tau_{conf} τconf τ c o n f \tau_{conf} τconf的值在[0,1]之间 即0表示不考虑置信度,1表示将所有补丁视为原始图像
篡改检测
当
M
‾
\overline{M}
M被估计出来以后,便可以根据估计的伪造像素的数量来决定图像是否是原始的,在形式上如下所示:
{
是原图
μ
M
‾
≤
τ
d
e
t
不是原图
μ
M
‾
>
τ
d
e
t
\begin{cases} 是原图 & \mu_{\overline{M}}≤\tau_{det} \\不是原图 & \mu_{\overline{M}}>\tau_{det} \ \end{cases}
{是原图不是原图μM≤τdetμM>τdet
其中
μ
M
\mu_{M}
μM是M的平均值,
τ
d
e
t
\tau_{det}
τdet是人工设置的阈值代表有多少像素是伪造的决定整个图像是伪造的
总结
使用了三个阈值分别为 τ d i s t \tau_{dist} τdist、 τ c o n f \tau_{conf} τconf、 τ d e t \tau_{det} τdet,经过作者的实际测试 上述阈值将 τ c o n f \tau_{conf} τconf设置为0能得到最好的结果0.91,并且上述算法在面对未知相机模型的图片时也有一定的鲁棒性,其准确率依然在0.8以上。