图像取证——基于深度学习的剪贴/裁剪图像的防伪识别方法
——本文大部分内容来源于 A deep learning approach to detection of splicing and copy-move forgeries in images 这篇文章,作者是 Yuan Rao, Jiangqun Ni 两位老师;内容为缩减内容,只取了我 需要了解的一部分intro和算法的详细内容。
目录
B. Architecture of the Proposed CNN
C. The proposed initialization method 初始化方法
Intro:深度学习与图像取证
近年来,深度学习的种种算法展现出十分强劲的信息提取能力,尤其是从高维敏感信息提取信息及学习其结构表达,所以在许多CV问题上都有应用。在数字取证方面,14年的一篇文章使用了CNN,用于中值滤波盲测。然而,在2015年的一篇文章上,说明了CNN并不适合直接用于图像篡改检测,这是因为复杂的图像修改工具会使修改后的图像与原图不仅视觉上相似,甚至在统计上也十分相似。所以,它们将图像的小波特征作为图像输入,受同样思想的启发,Bayar也在他的网络中设计了一个卷积层来学习一个预判错误滤波器,这个滤波器用于发现图片篡改的痕迹。
而此篇文章的主要贡献在于设计了一个新型的图片取证结果,用于自动学习特征表达。主要贡献有以下三点:
- 首先训练了一个有监督的CNN模型通过训练图像中标记后的图像块(pxp大小)用于学习修改操作的结构特征。CNN结构的第一层被作为一个预处理模型,用于控制图像内容,即输入进入网络的图像形态。与随机选取的策略不同,第一层CNN的核权重被初始化为一个高通滤波器用于在空域富模型中进行残差图的计算。这么做能很好的提高模型的泛化能力,并使网络加速拟合。
- 随后,通过一个pxp的滑窗,使用一个预训练的CNN模型在整张图片上进行图像特征的提取。生成的图像表达通过一个简单融合机制进行压缩,如区域池化来得到最终的区分特征。
- 最后的特征会经过一个SVM进行二分类。
在2016年,这个模型在多个数据集上都取得了STOA的结果。
模型介绍
模型的处理过程分为两个主要步骤,一个是特征学习,另一个是特征提取。
在第一步中,算法使用标记好的图形块进行训练(从训练集上截取的),其中正样本是从篡改图片的修改边缘精心截取的,而负样本则是从正确图片中随机截取的。这样,CNN就能注意由篡改造成的局部特征,从而学习篡改图像的结构特征。
在第二步中,预训练好的CNN模型,通过对整张图片的块大小扫描,来提取图片块中的特征。最终,提取的特征将经过融合并通过SVM进行分类。
A. Patch Sampling 块样本提取
由于大量的样本对伪证识别十分有效,本文章的正样本都是由整张图片中提取的,由此原因,越大的图片可以获得越多的正图片块样本。同时,为了解决过拟合的问题,图片也加入了旋转和翻转后的图片块,使数据集扩大了八倍。
B. Architecture of the Proposed CNN
整个的网络结构其实十分直白,是由几个卷积层级联得到的,最后一层为一些全连接层,接softmax进行分类。卷积层的输入和输出为feature maps 其实这个都比较直白了。每个卷积层都是由三部构成:卷积、**函数、池化。
整个CNN部分的结构如图:
如图所示,pooling并不是每层都有,另外,在第一层60个feature map都是使用的是5x5的核。最终,网络输入一层400维的全连接层进行分类,全连接层使用了dropout = 0.5。这里作者提出,多层全连接极易造成overfitting和计算量过大的问题。
这里虽然图片的卷积核由10层,但实际上只有8层,因为卷积与前面的卷积操作只能算一个卷积层。2x2的池化核可以使图像缩小为原来的四分之一,这会使75%的**后的结果被丢弃。选择Max-pooling的原因在于最大池化能有效的保持图片的纹理信息,并且显著的提升网络收敛效果。
此外,为了增加算法的泛化性,结构中对 feature maps 在池化层之前使用了 local response normalization, 使每个网格的中心值都由其周围的像素进行归一化。
C. The proposed initialization method 初始化方法
上文说过,卷积的第一层是一个预处理模型,能够有效的压缩图片信息。这点与图片隐写的富媒体模式十分相近,对残差而不是像素值进行处理的优势是通过残差图像,图片的信息能够被很好的压缩,并且有效的提升图片的信噪比(stego 信号:图片内容),以至于由隐写造成的微小痕迹都会被很好的检测到。这样的方法也被其他学者使用,即将SRM与高通滤波器相结合。这样的方式的有效之处在于篡改操作会带来十分尖锐的边缘,尤其是拼接操作,会被高通滤波后明显的体现出来。
所以文章在CNN的结构里会对第一层卷积的权重使用30个在SRM中用于计算残差图的基本高通滤波器进行初始化。这些基础的滤波器对应了7个SRM残差类别。分布如下:
个数 | 滤波器类别 |
---|---|
8 | 1st |
4 | 2nd |
8 | 3rd |
1 | SQUARE3x3 |
4 | EDGE3x3 |
1 | SQUARE5x5 |
4 | EDGE3x3 |
如果我们将滤波器的序号编号,则有: c1 = [1, ..., 8], c2 = [9, ..., 12], ..., c7 = [27, ..., 30]; c = [c1, ..., c7]
对SRM中,mxn 的滤波器核,我们将它移植到CNN的公式为:
经过实验后发现,当初始化的滤波器能尽量保持相似而不是相同的残差类型会提高CNN的描述效率,所以我们令 代表了第j个feature map的核权重 则对第j个feature map,那么初始化的核权重为
,
初始化在机器学习中犹如一个正则项,可以有效的限制有效参数空间,并改善网络对篡改痕迹识别的鲁棒性。除了第一层外,其他的网络层均使用了Xavier初始化,这种初始化策略可以通过输入和输出的神经元个数来自动调整其他层的参数范围,这种方法会比random initialization更好。
D. Feature Fusion
经过了CNN的处理,会把图片中 pxp大小的图片块转化为一个k维的列向量,这使得CNN的模型变成了一个图片的区域描述器,下图展示了这个过程:
一个大小为mxn的图片经过大小为pxp的描述器以s的步长进行描述后会得到一个Y矩阵,,这里的T显而易见,由步长和图片大小决定,
,[]代表向上取整。
为了获得更精确的结果,s 通常会小于等于 p,为了得到最终的表示,这里对每一行采用mean/max pooling 的策略:
,
如此得到的Y是一个K维的向量,会作为每张图片的输入给SVM,由SVM做最终的判断。
实验与分析
实验这一部分就不细节介绍,通过一张图直接展示。
值得注意的是作者在实验部分的调参,在训练部分,使用的momentum作为优化器,参数为(0.99, 5e-10),学习率的下降加入了decaying, 初始值为0.01, 每十个epoch下降10%。
最后这项结果也是在各个数据集上基本取得了全胜,见下图
本篇文章的介绍就到这里了,可以看出这篇文章使用CNN的方式十分特别,真正结合了图片取证所需要的部分,又发挥了CNN的信息提取功效才能取得如此好的结果。当然,在做数据集的过程中,相信作者也是花费了大量的财力物力的,也能看出预训练牛逼!