作业 (o′┏▽┓`o)

# 图像篡改的类型

实践中,图像篡改至少有以下几种类型:

  1. 图像内容的修改(Tampering),比如通过 PS 实现换脸或者修改合同文字。其中大部分都可以归类到截取、复制、删除。

  2. 能够间接表达第一类篡改嫌疑的操作(Manipulation)。比如为了遮掩第一类篡改痕迹而做的中值滤波、高斯模糊、高斯噪音以及再次保存图像而产生的二次 JPEG 压缩。

一般而言,图像篡改的最终目的是识别第一类篡改,但是难度很大,需要很深厚的司法、摄影和图像专业知识,比如在传统的图像篡改识别领域,需要使用噪声一致性、几何一致性、光照一致性等方式来进行判断。在实际操作时,需要遍历可疑区域,且每一个可疑区域都需要遍历各种方法进行检验,所以非常地费时费力。

如果使用机器学习的方法,可以利用图像分割的方式直接将篡改区域分割出来,然而实际训练没有这么简单。

因为如果使用算法随意地进行图像拼接。这种方式可以生成无限多的数据,但用这些粗糙的训练数据训练出的模型往往无法应对经过精细 PS 的图像,若用同样粗糙的数据做检测,即便获得了好的结果也不能验证模型的有效性。而假如我们一张一张人工 PS,效率太低,完全无法满足训练模型的需要,因此我们的工作主要在识别第二类篡改。

实验中,我们首先需要通过原始图片生成经过第二类篡改的图片,再生成这些数据对应的标签(已篡改 / 未篡改),然后投入卷积神经网络进行有监督的学习,并在每一轮 epoch 后对当前模型做检测,输出测试的精准度。

# 卷积神经网络(CNN)

# 为什么使用卷积神经网络

  1. CNN 和深度神经网络(DNN)

    这里的 DNN 指的是直接用全连接的深度神经网络。

    对于图像而言,如果直接采用全连接的方法,巨大的参数量会造成很多问题,比如巨大的资源消耗、过拟合、局部最优,

    因为图片基本是 1000×1000 像素,再加上 RGB 颜色信息的 3 个参数,就会出现三百万的参数量,这是全连接神经网络绝对无法处理的,所以需要用 CNN 减少参数量级。

    CNN 用卷积层提取图像中的局部特征,用池化层大幅降低参数量级(降维)

    卷积层:

    卷积层

    用卷积核来过滤图像的各个小区域,从而得到这些小区域的特征值

    池化层:

    image2

    即使做完了卷积,图像仍然很大(因为卷积核比较小),所以为了降低数据维度,就进行下采样,

    如上图,20×20 的原始图片,采样窗口为 10×10,最终池化结果为一张 2×2 的特征图

  2. CNN 和基于特征提取的传统篡改检测

    传统篡改检测方法基于图像统计信息和物理特征检测图像篡改操作,主要针对对复制黏贴和拼接组合两种篡改手段,

    特征提取的方法多种多样,不再赘述,其计算过程大多过于繁琐,运用的函数复杂性远高于 CNN。

    而且对于大数据量的处理,CNN 更有优势:

    CNN

    # 对第二类图像篡改的检测

    # 实验数据

    使用的原始数据集括训练集的 40 张图片和测试集的 20 张图片,均来自以往使用手机拍摄得到(无美颜)。

    首先,我们制作训练数据,用 python 的 cv2 库和 numpy 库实现高斯模糊、高斯噪声、中值模糊、二次 JPEG 压缩、亮度对比度修改等操作,然后篡改原始图片,保存原始图片和篡改后的图片,并保留各自的标签(1/0)。

    训练使用的图像块大小为 28×28,所以训练集截取了约 20 万个图像块,测试集截取了约 10 万个图像块。

    然后定义模型,完成训练后测试数据的准确率。

    我们总共选取了 60 张由手机拍摄的照片,其中 40 张作为训练集,20 张作为测试集。照片的选取需要遵从一定的标准,首先务必保证照片拍摄时没有开启美颜等模式,这会导致模型的训练和测试出现偏差(因为美颜本身也可以视作一种图片篡改);其次拍摄模糊、歪斜的照片也需要出现在数据集中,这是为了保证数据集的多样性,让我们训练出来的模型面对多样的图片的时候能保持更高的准确性。

    然后我们需要对原始图片进行篡改,生成篡改后的数据集。我们一共实现了高斯模糊、高斯噪声、中值模糊、二次 JPEG 压缩、亮度 / 对比度修改 5 种篡改方法。其中,我们特意加入了亮度 / 对比度修改这种篡改方法,我们认为卷积神经网络在应对这种篡改方面无能为力,但需要经过实验验证。高斯模糊、中值模糊分别通过 cv2 库的 GaussianBlur () 和 medianBlur () 函数实现,其余篡改方法均通过自编写的函数实现。

    最后将篡改后的数据集和原始数据集进行乱序的合并,同时对应的标签(已篡改 / 未篡改)也要一一对应地合并。

    超参数如下:

    • 网络结构:6 层卷积,简单的 VGG 风格,每 2 层一个 pooling
    • 优化器:Adam
    • epoch 数量:10
    • 学习率:前 5 个 epoch 学习率 1e-4,后 5 个是 1e-5
    • batch_size:一次抓取 50 个样本训练

    image44

    # 实验结果

    高斯模糊、高斯噪声、中值模糊、二次 JPEG 压缩的检测结果都很不错,经过 10 轮 epoch 后,最终的精准度均稳定在 90% 以上。其中高斯噪声达到了 99%,我们认为应该是篡改图本身与原图对比明显的原因,通过对大量篡改图的学习,模型能很轻易地抽象出篡改的特征,从而进行更加精准的判断。

    亮度 / 对比度的精准度只有 50% 左右,这个结果表明,卷积神经网络对图像进行亮度 / 对比度的篡改检测无能为力。我们猜测这也许是因为这种篡改后的图片与原始图片没有本质上的区别,卷积神经网络抽象出的特征是类似于原图的,但这种想法的正确性还有待验证。

    高斯模糊:

    2

    高斯噪声:

    image-20230614193251237

    中值模糊:

    image-20230614205309782

    二次 JPEG 压缩:

    image-20230614222506299

    亮度修改:

    image-20230615001847275

    对比度修改:

    image-20230615083039860