天池伪造图像检测与模型二三

天池伪造图像检测

转自公共号【AI约读社】天池伪造图像的篡改检测比赛TOP3分享

背景介绍

1.1 赛题背景

本次比赛的背景是由于随着各种P图工具的普及,篡改伪造出视觉无痕迹的假图门槛大幅降低,于是我们看到大量的假图用于散播谣言、编造虚假新闻、非法获取经济利益,更有甚者,还可能会被用来恶意地充当法庭证据。因此需要设计出能够准确检测出图像篡改区域的算法,避免假图造成的危害。

1.2 题目描述

比赛的任务是通过提供的训练集学习出有效的检测算法,对测试集的伪造图像进行篡改定位。比赛的难点在于其分割区域是不能依靠边缘轮廓,因为篡改特征是偏向于弱信号特征(不可视的,跟内容特征弱相关),而且相对要分割出来的区域可能面积偏小。

1.3 数据分析

  • 数据集数量偏小:数据包括训练集和测试集,训练集有1500张JPEG图像及对应mask,测试集有1500张JPEG图像。训练集的数量偏小,训练epoch过多和复杂的网络容易出现过拟合情况。

  • 图片大小不均匀:篡改数据集图片大小层次不齐,并且图片尺寸分布为[500,1400],大部分图片为正方形,但是有部分图片宽不等于高。

  • 篡改区域分布不均匀:不论是官方提供的mask还是经过crop之后的mask中篡改区域的大小不均匀,在这样的数据集进行训练得到的效果并不会很好。
    数据分布不一致:测试集中有部分篡改特征为splcing,但是在比赛提供的训练集中并没有含有此类特征的图像,所以在含有此类特征测试集中预测所得mask为全黑,即模型没有检测这类特征的能力。

  • 存在noisy label:分析图像中的篡改类型,我们同样发现在某些篡改为将字体中的黑色(0)直接篡改为了白色(255),这类篡改不论对于人眼还是模型都是难以检测的。
    子类过多问题:我们可以看到赛道一的数据中已经有篡改区域,即一次篡改,赛道二的数据是在一次篡改之后进行二次篡改得到的,所以在一张图片里面包含的篡改类型中包含多个子类(splicing, copy-move, remove,以及赛道一选手进行的篡改)

1.4 评估指标

在测试集的1500张图像中选手需要进行篡改定位,生成对应的二值化mask图像。根据提交的mask与基准mask计算F1值与IOU值。
F1 指标计算:

\[F 1=\frac{2 \times \text { Precision } \times \text { Recall }}{\text { Precision }+\text { Recall }} \]

IOU 指标计算:

\[IOU=\frac{\text { A } \cap \text { B }}{\text { A } \cup \text { B }} \]

总成绩: Score = Score_iou+ Score_f1

Score 计算代码:单张图片

def metric(groundtruth,premask):
    premask = premask.cpu().detach().numpy()
    groundtruth = groundtruth.cpu().detach().numpy()
    premask[premask>=0.5] = 1
    premask[premask<0.5] = 0
    groundtruth[groundtruth>0] = 1
    groundtruth[groundtruth<=0] = 0
    seg_inv, gt_inv = np.logical_not(premask), np.logical_not(groundtruth)
    true_pos = float(np.logical_and(premask, groundtruth).sum())  # float for division
    true_neg = np.logical_and(seg_inv, gt_inv).sum()
    false_pos = np.logical_and(premask, gt_inv).sum()
    false_neg = np.logical_and(seg_inv, groundtruth).sum()
    f1 = 2 * true_pos / (2 * true_pos + false_pos + false_neg + 1e-6)
    cross = np.logical_and(premask, groundtruth)
    union = np.logical_or(premask, groundtruth)
    iou = np.sum(cross) / (np.sum(union) + 1e-6)
    if np.sum(cross) + np.sum(union) == 0:
        iou = 1
    return f1, iou

F1、IoU其它方式实现

# 该代码适用于pytorch框架,函数的输入都是tensor类型的
from sklearn.metrics import roc_auc_score,jaccard_score
import numpy as np

def auc_on_batch(masks, pred):
    '''Computes the mean Area Under ROC Curve over a batch during training'''
    aucs = []
    for i in range(pred.shape[1]):
        pred_tmp = pred[i][0].cpu().detach().numpy()
        mask = masks[i].cpu().detach().numpy()
        pred_tmp[pred_tmp>=0.5] = 1
        pred_tmp[pred_tmp<0.5] = 0
        mask_tmp[mask_tmp>0] = 1
        mask_tmp[mask_tmp<=0] = 0
        aucs.append(roc_auc_score(mask.reshape(-1), pred_tmp.reshape(-1)))
    return np.mean(aucs)

# iou
def iou_on_batch(masks, pred):
    '''Computes the mean Area Under ROC Curve over a batch during training'''
    ious = []

    for i in range(pred.shape[0]):
        pred_tmp = pred[i][0].cpu().detach().numpy()
        mask_tmp = masks[i].cpu().detach().numpy()
        pred_tmp[pred_tmp>=0.5] = 1
        pred_tmp[pred_tmp<0.5] = 0
        mask_tmp[mask_tmp>0] = 1
        mask_tmp[mask_tmp<=0] = 0
        ious.append(jaccard_score(mask_tmp.reshape(-1), pred_tmp.reshape(-1)))
    return np.mean(ious)


def dice_coef(y_true, y_pred):
    smooth = 1e-5
    y_true_f = y_true.flatten()
    y_pred_f = y_pred.flatten()
    intersection = np.sum(y_true_f * y_pred_f)
    return (2. * intersection + smooth) / (np.sum(y_true_f) + np.sum(y_pred_f) + smooth)

# f1 score
def dice_on_batch(masks, pred):
    '''Computes the mean Area Under ROC Curve over a batch during training'''
    dices = []

    for i in range(pred.shape[0]):
        pred_tmp = pred[i][0].cpu().detach().numpy()
        mask_tmp = masks[i].cpu().detach().numpy()
        pred_tmp[pred_tmp>=0.5] = 1
        pred_tmp[pred_tmp<0.5] = 0
        mask_tmp[mask_tmp>0] = 1
        mask_tmp[mask_tmp<=0] = 0
        dices.append(dice_coef(mask_tmp, pred_tmp))
    return np.mean(dices)

Rank Top1解决方案

ZOLOZ队的算法方案:

  1. 在数据生成过程中使用了自制的Auto_ps算法进行数据增广。
  2. 利用ELA, DCT, MantraNet和Noiseprint四种算法分别提取每个数据的篡改概率图,再对原图和每一个概率图都训练一个分割模型,然后融合5个分割模型的结果。
  3. 通过马赛克检测和同源比对来进一步挖掘篡改区域。
  4. 最后融合所有步骤的结果,得到最终的mask。

2.1 Baseline:BiseNet

论文链接:https://arxiv.org/abs/1808.00897

BiseNet(Bilateral Segmentation Network) 是一个双向分割网络,BiseNet 通过双路网络提取特征分别Spatial Path 和 Context Path,最后经过特征融合模块整合这两路网络的特征,其中 Spatial Path 实现保留原输入图像的空间尺度,并编码丰富的空间信息,而 Context Path 充分利用轻量级模型与全局平均池化以提供大感受野。具体的细节大家可以去看原文。

2.2 数据增广:Auto_ps

在数据生成过程中使用了自制的Auto_ps算法进行数据增广。ZOLOZ队在对赛道2的数据进行数据分析后,将它们其分为两类,文档和书本。其中,赛道2的文档数据基本都来源于赛道1。考虑到这一点,他们使用Auto_ps算法的赛道1文档数据集生成更多的"类赛道2"的文档数据。

Autops的操作步骤

观察赛道2 的数据,发现大部分图片的ps方式多为remove、splicing和copy-move等,generated并不常见。但由于文档之间没有匹配信息可供使用,splicing便无从做起。如果自行对文档进行结构化解析过于费时,故放弃生成splicing。同时,基本上赛道2的图片里篡改操作单位均为line级别,于是最终采用Auto_ps下的 line_copy_move模式和line_remove模式。
步骤如下:
1.对图片进行文字行检测
2.随机挑选若干文字框作为待篡改区域
3.进行line级别的remove
4.对这些区域的原本文字区域进行resize(缩放)+shake(随机抖动),然后复制过去。

2.3 分割模型

ZOLOZ队将此问题视为图像分割问题,类别为两类,非PS区域和PS区域。相比较将本问题设为目标检测问题的好处是,可以更好地解决印章等不规则区域。网络上,他们采用了轻量化的BiseNet以进行更快的迭代,方便多次提交进行分析。
BiseNet的效果中仍有少量孤立的区域和一些误识别。换言之,他们的模型总是检测过多的区域。他们考虑使用模型融合的交集法,如果一个像素被每个模型都击中了,才认为是正确的结果。

模型融合中他们使用的多个模型,仍采用BiseNet作为基本网络结构,但输入改为训练图片的概率图。这些概率图来自于其他常见的PS检测方法,简要介绍如下:

1.Mantranet

链接:https://ieeexplore.ieee.org/document/8953774
代码:https://github.com/ISICV/ManTraNet

  • Mantranet是一个使用了385种篡改类型进行异常检测的自监督学习网络,其特色是将篡改定位问题当做一个局部异常点检测问题。具体介绍可以看我们这篇图像篡改检测:ManTra-Net

2.Noiseprint

链接:https://arxiv.org/abs/1808.08396
代码:https://github.com/grip-unina/noiseprint

  • 每一个独立的设备对其所有照片上留有一个独特的模式,也就是光响应不均匀性(PRNU,Photo Response Non-Uniformity)。这是由于设备加工过程中的缺陷导致的。由于PRNU的唯一性和稳定性,其被用于设备指纹(device fingerprint),并被用于图片伪造检测任务中。

3.DCT

  • 离散余弦变换(DCT for Discrete Cosine Transform)常用于数据的有损数据压缩,大名鼎鼎的图片格式JPEG就采用了DCT算法。利用DCT算法多次压缩之后出现的double quantization特性,可以分辨jpeg图片的篡改痕迹。

4.ELA

  • 将图像经过一个固定质量压缩保存后,两个不同区域表现不同,据此来得到篡改区域的位置。

最后,他们对上述概率图在同一网络中进行训练,对输出结果取交集,即可得到分割模型的最终结果。

2.4 马赛克检测

他们借鉴了一个轻量的马赛克检测算法:(https://github.com/summer4an/mosaic_detector.git),针对性地做了一些优化调整,然后对测试数据进行了马赛克区域的提取。效果图如下:

2.5 同源比对

他们发现测试数据和训练数据存在同源性,即不同篡改图片来自同一张种子图片。
于是他们想到可以通过比对同源图片之间的差异来定为篡改区域。整个方法分为下面3个步骤:

  1. 同源匹配,为每一个图片找到同源图。基本流程如下:

    • 提取sift特征
    • 利用sift特征,对所有图片进行两两暴力匹配,根据匹配程度确定是否同源。
    • 对2的结果中置信度较低的情况,额外采用像素匹配的暴力搜索方法来进一步确认同源性
  2. 同源图片差异区域提取。他们按同源程度开发了3种提取算法:

    • 高度同源:图片没有经过resize,直接做像素匹配然后比较两个图片的diff。

    • 中度同源:图片经过resize,需要resize到相同大小,然后利用1的方法来比对差异。

    • 轻度同源:同一物体,但来自于不同角度、不同背景的拍摄,需要对两个图片先做一些亮度校准,再利用sift特征进行透视变换,将两个物体拉伸成基本一致的形状。

  3. 篡改区域识别

    在找到一对同源图片的差异区域之后,怎么判断这个区域哪张图是经过了篡改,哪张图没经过篡改呢?他们采用了几个技巧:

    • a. 通过如果其中一张图来自于训练集,则可以利用这个图的ground truth来帮助判断。

    • b. 如果两个图都没有ground truth,则通过提取ELA、Mantranet等概率图,利用这个区域的概率均值来辅助判断。

最后他们将前面几个方法得到的mask结果进行融合。通过试验不同的融合方案,得到了一个最终的结果。

Rank Top2解决方案

3.1 Baseline:RRU-Net


RRU-Net是基于U-Net 提出了一种环状残差网络 RRU-Net 用于图像拼接伪造检测。RRU-Net 的核心思想是加强 CNN 的学习方式,并由CNN中残差的传播和反馈过程实现。残余传播调用输入的特征信息以解决更深层网络中的梯度退化问题;残差反馈合并输入特征信息,使未篡改区域和篡改区域之间的图像属性差异更加明显。具体介绍可以看这里。

3.2 数据预处理

  • 滑窗crop,将图像尺寸crop到一致,这样降低了显存占用,并且也能提升训练时的batch size,选择的窗口大小为512*512。

  • 在crop的时候设置了一个阈值,将不符合阈值的数据丢弃。因为数据经过crop之后,数量增多,去除一些极端数据,例如全白的区域。

  • 训练集引入了含有splcing特征的外部数据集 cassia 2.0。

  • 将训练集分为一次篡改和二次篡改的两部分,这个区分该队是根据官方提供赛道一和赛道二数据集的规律,赛道一的数据都是只有发生一次篡改的图片,赛道二的数据部分数据是发生篡改后再篡改的图片。

3.3 孪生网络

参考孪生网络的思想,在网络的输入部分实例化两个结构相同但是参数不共享的encoder分别编码一次篡改和二次篡改的图像,将得到特征图进行相加,最终经过decoder输出mask,模型结构如下:

最终结果如下,可以从图中看出,mask中绿色部分为模型检测明显篡改区域(easy sample)得到,图中红色方框中为模型利用辅助信息进行检测特征较弱区域(hard sample)得到。
该模型不仅能检测到图像中大部分的篡改区域,也就是easy sample,而且还能利用一次篡改图中的辅助信息,帮助模型对于部分hard sample进行检测。

Output:图中红色框内为hard sample,绿色框内为easy sample。

Rank Top3解决方案

代码链接:

https://github.com/HighwayWu/Tianchi-FFT2

4.1 Baseline:UNet

111
Unet 是非常经典的图像分割算法,具体介绍可以看快速回顾U-Net Family

4.2 数据预处理

  1. 数据扩增
  • 由于原始训练集数据较少,且大量重复,所以重新制作了一批数据用于训练。扩增方式:
    • 按照赛道一的图像处理方法对赛道一的图片进行篡改。(放置于…/s2_data/expand_data/s1_fake_w/)
      • 从网络下载了一批证书类文件并按照赛道一的图像处理方法进行篡改。(放置于…/s2_data/expand_data/online_*/)
      • 将原始训练集中所拍摄的书籍封面类(以下简称书籍类)图片进行PS/拼接篡改。(放置于…/s2_data/expand_data/book_*/)
      • 在训练的过程中随机对训练集图像进行缩放(90%~110%)、旋转、翻转、噪声,以及最后在随机位置裁剪出512x512的小图像。具体请看…/code/main.py中Dataset类的aug函数。
  1. 训练集、验证集划分:
  • 由于原始训练集大量数据来源相同,若简单使用随机划分训练集、验证集则容易导致过拟合,所以按照不同源将训练集进行简单划分为四个fold。

4.2 模型方案

  1. Se-Resnet50作为编码器

该队将Se-Resnet50作为编码器,Se-Resnet50 就是将在 ResNet50网络中引入SE模块,我们先介绍SE模块:

SE模块是在ImageNet冠军模型SE-Net中提出的block,SE模块看成是channel-wise的attention,可以嵌入到含有skip-connections的模块中,ResNet,VGG,Inception等等,SE结构如下图:

通过上图可以理解他的实现过程,通过对卷积的到的feature map进行处理,得到一个和通道数一样的一维向量作为每个通道的评价分数,然后将改分数分别施加到对应的通道上,得到其结果,就在原有的基础上只添加了一个模块。

  • Se-Resnet:

    1. U-Net 引入 scSE感知模块

      该队参考了FCN 加入SE模块的方法https://arxiv.org/abs/1808.08127,构建了三种新的模块cSE、sSE、scSE,最终将scSE感知模块加入到U-Net中,这一改进十分有效主要是因为其进行的"感知"操作能够很好的让模型对篡改区域的特征进行re-weighting。

      简单来说cSE和sSE分别是根据通道和feature map cell的重要性来校准采样。scSE则是同时进行两种不同采样校准,并将它们的结果结合起来使用。

      • scSE代码如下:

        class SCSEModule(nn.Module):
            def __init__(self, ch, re=16):
                super().__init__()
                self.cSE = nn.Sequential(nn.AdaptiveAvgPool2d(1),
                                         nn.Conv2d(ch,ch//re,1),
                                         nn.ReLU(inplace=True),
                                         nn.Conv2d(ch//re,ch,1),
                                         nn.Sigmoid())
                self.sSE = nn.Sequential(nn.Conv2d(ch,ch,1),
                                         nn.Sigmoid())
            def forward(self, x):
                return x * self.cSE(x) + x * self.sSE(x)
        

图像篡改检测模型一二

转自公共号【AI约读社】图像篡改检测方法总结

背景介绍

篡改技术中,拼接(splicing),复制移动 (copy-move) 和擦除填充 (removal) 是最常见的操作。

  • 图像拼接是指真实图像中复制区域并将其粘贴到其他图像;
  • 复制移动是指复制并粘贴到同一图像中的区域;
  • 擦除填充操作是指会从真实图像中消除区域,然后进行修补。

人类在识别复制移动方面可能比检测剪切粘贴和擦除填充更好。这是因为在复制移动图像中,人眼可以感觉到类似物体的重复。对于剪切粘贴和擦除填充图像,人类在很大程度上依靠寻找明显的边缘不连续和照明不一致来确定是否发生了篡改。

因此,当在经过良好篡改的图像中视觉上看不到不一致之处时,人类将无法检测到篡改。之前传统的图像处理方法提出了探索边缘不连续和照明不一致性的算法,以协助并超越人类在篡改检测任务中的能力。

近年来,随着深度学习技术的不断发展,它们也在图像篡改检测领域实现突破,准确率大幅提升。当前深度学习的图像篡改区域定位方法主要有以下三种方向:

  1. 将篡改区域定位认为是像素级的二分类,采用图像分割的算法来定位篡改区域。
  2. 将篡改区域定位当作是目标检测任务,采用目标检测算法来定位篡改区域。
  3. 将篡改区域定位当作是局部异常检测,采用CNN + LSTM网络检测图像中的局部异常。

接下来为大家带来近年来这三个方向具有代表性的图像篡改区域定位方法。

RRU-Net

RRU-Net: The Ringed Residual U-Net for Image Splicing Forgery Detection
发表在:CVPRW 2019
论文:https://ieeexplore.ieee.org/document/9025485
代码:https://github.com/yelusaleng/RRU-Net
类型:拼接
方法:作者基于 U-Net 提出了一种环状残差网络 RRU-Net 用于图像拼接伪造检测。RRU-Net 是一个端到端的图像本质属性分割网络,无需任何预处理和后处理即可完成伪造区域检测。RRU-Net 的核心思想是加强 CNN 的学习方式,并由CNN中残差的传播和反馈过程实现。残差传播调用输入的特征信息以解决更深层网络中的梯度退化问题;残差反馈合并输入特征信息,使未篡改区域和篡改区域之间的图像属性差异更加明显。

实验结果:RRU-NET 在 CASIA1.0 和 COLUMB 两个伪造图像数据集上的实验结果,CASIA 1.0 包括的篡改方式有拼接和复制粘贴攻击方式,但是本文只选取了其中的拼接攻击方式的数据集。COLUMB 是只包含拼接攻击的数据集。

简评:

  • RRU-Net的主要创新体现在 Ringed Residual Structure,与其它方法不同是 RRU-Net 不直接设置检测伪造图像痕迹的特征,而是通过 residual feedback 机制让 CNN 自己去学习图片属性的差异特征,属于一种强化 CNN 学习的方法,并且经过实验证明了这种利用残差反馈方式自动学习图片属性差异的特征是有效的。

ManTra-Net

ManTra-Net: Manipulation Tracing Network For Detection And Localization of Image Forgeries With Anomalous Features

发表在CVPR2019

论文:https://openaccess.thecvf.com/content_CVPR_2019/html/Wu_ManTra-Net_Manipulation_Tracing_Network_for_Detection_and_Localization_of_Image_CVPR_2019_paper.html

代码:https://github.com/ISICV/ManTraNet

类型:拼接、移除、复制粘贴

方法:作者提出了一个不需要额外的预处理和后处理的篡改检测网络ManTra-Net。此网络是一个全卷积网络,可以处理任意尺寸的图像和多种篡改类型。主要的贡献在于用一个自监督学习的方式从385篡改类型中学习特征。并且将篡改定位问题当做一个局部异常点检测问题来解决。使用Z-score特征表示局部异常,使用long short-term memory solution进行评估。

实验结果:CASIA 2.0作为训练集 CASIA1.0作为测试集。

简评:

  • ManTra-Net 的创新之处在于设计了一个简单而有效的自我监督学习任务,以通过对385种图像操作类型进行分类来学习强大的图像操作轨迹。此外,我们将伪造定位问题公式化为局部异常检测问题,设计Z分数功能以捕获局部异常。ManTra-Net的优点主要在于它对于绝大多数的篡改攻击方式的有效果,因为它利用了自监督学习篡改的类型,因此有效的检测多种篡改方式,并且具有不错的鲁棒性,可以说是每个方式都有优势,但单独一种方式下不一定是最优的方法。

RGB-N

Learning Rich Features for Image Manipulation Detection

发表在:CVPR 2018

论文:https://arxiv.org/abs/1805.04953

代码:https://github.com/LarryJiang134/Image_manipulation_detection

类型:拼接、移除

方法:提出了一种双流的Faster R-CNN网络,给定manipulated image,对其进行端到端的训练,以便检测被篡改的区域。双流分别为RGB stream、noise stream。其中,RGB stream主要目的是从RGB图像输入中提取特征,从而发现篡改区域强烈对比差异,非自然的篡改边界等之类的tampering artifacts。Noise stream 主要利用噪声特征去发现在真实区域和篡改区域之间的噪声不一致性,噪声特征是从steganalysis rich model filter layer中提取的。之后,通过bilinear pooling layer融合两个流的特征,以便进一步结合这两种模态的空间信息。

实验结果:CASIA 2.0作为训练集 CASIA1.0作为测试集。

简评:

  • 该方法利用篡改区域与原图噪声不一致的线索,提出了双流Fast RCNN,这种方法的优势在于其具有很好的鲁棒性,这是由于当篡改者利用JEPG压缩或者resize隐藏时,噪声不一致的线索会更加突显出来,因此其具有很好的鲁棒性和抗干扰的能力。作者在文中分享了这一方法的局限也就是在复制移动的篡改方式下表现不太好,其原因有两个方面,首先,复制的区域来自同一张图像,这产生了相似的噪声分布,从而混淆了的噪声流。并且,两个区域通常具有相同的对比度。

精读

简介

网络包含RGB流和噪声流,其中RGB流用于提取RGB图像的特征,以发现篡改的伪像,例如强烈的对比度差异,不自然的篡改边界等,另一个是噪声流,它利用从富隐写分析模型分析的滤波器层(SRM)提取的噪声特征来发现真实区域和篡改区域之间的噪声不一致。然后,通过双线性池化层融合来自两个流的特征根据丰富的特征,根据RGB特征和噪声特征来检测图像篡改区域和篡改的方式。

噪声流的线索依据.

为什么要再加入一个噪声流,这是因为采用了局部噪声特征的方法。由于RGB通道不足以解决所有不同的篡改攻击方式,尤其是,经过精心后处理以隐藏拼接边界并减少对比度差异的篡改图像,这种情况对于仅用RGB流而言是较为困难的。当从一个图像(源)中删除一个对象并将其粘贴到另一个图像(目标)中时,源和目标图像之间的噪声特征不匹配。那么如何实现给图像增加噪声呢?作者希望通过Steganalysis Rich Model获得噪声图片。

Steganalysis Rich Model 最早是应用在隐写术(是一种将消息嵌入到数字载体的技术如图像、视频等),SRM功能从30个基本滤波器开始,滤波后在输出附近使用最大值和最小值等非线性操作, 从该过程中获得的特征可以被视为局部噪声描述符。作者在实验中发现,仅使用 SRM 其中的3个滤波器就可以实现不错的性能,而应用所有30个内核并不能显着提高性能,因此使用下面3个滤波器获取像素值与相邻像素的差值估计来实现图片添加噪声的功能。

下图是分别经过拼接,复制移动和擦除填充后的篡改图像,以及通过SRM层的噪声图,从图中可以清晰的看出加入噪声后篡改区域的噪声与真实区域的较大区别。

网络结构

作者采用了一个双流的FasterRCNN 的结构, 分别包括RGB流和噪声流。RGB流输入RGB图像, 噪声流中输入SRM图像。两部分共享相同的 ROI 层,同时执行分类和边界框回归两个操作。作者通过双线性池融合两个流的特征进行分类,RPN利用RGB流的特征进行边界框的回归。

  • RGB Stream

    RGB流采用的是单个Faster RCNN 网络提取RGB图像特征并用分类和边界框回归,主干使用的是 ResNet 101 网络提取图像特征,ResNet的最后一个卷积层的输出 feature map用于分类篡改类型。RGB流中的RPN网络利用这些特征为边界框回归提供 propose RoI,Loss function 如下:

    \[\begin{array}{r} L_{R P N}\left(g_{i}, f_{i}\right)=\frac{1}{N_{c l s}} \sum_{i} L_{c l s}\left(g_{i}, g_{i}^{\star}\right) +\lambda \frac{1}{N_{r e g}} \sum_{i} g_{i}^{\star} L_{r e g}\left(f_{i}, f_{i}^{\star}\right) \end{array} \]

\(g_{i}\) 表示 anchor i 在一个 batch 中是潜在的被篡改区域的概率, \(g_{i}^{\star}\) 表示对于 anchor i 的 ground-truth 是 positive,\(f_{i}\)\(f_{i}^{\star}\)分别是anchor i 和 ground-truth 的四维边界框坐标。\(L_{cls}\)表示RPN网络的交叉熵,\(L_{reg}\)表示用于平滑提议边界框回归的L1损失。\(N_{cls}\)表示在RPN中 batch 的 大小,\(L_{reg}\)是anchor location的数目。λ用来平衡这个两个损失。

  • Noise Stream

    噪声流和RGB流的结构采用一样的主干结构 ResNet 101 网络。原图经过SRM层变成噪声图片输入噪声流当中,ResNet 101 网络提取噪声特征。噪声流与 RGB 流共享相同的 ROI 层,提取出的特征仅用于分类。需要注意的是对于边界框回归,作者只使用 RGB 通道,因为作者经过实验,发现RGB 特征在 RPN 网络中的性能优于噪声特征。

  • Bilinear Pooling

    作者采用双线性池(BilinearPooling)的方法将 RGB 流与噪声流结合起来进行篡改检测。Bilinear Pooling 双线性池 可以很好的结合了双流 cnn 网络中的特征,同时保留空间信息,以提高检测置信度。下面是双线性池的结构。

    直观上理解,所谓bilinear pooling,就是先把在同一位置上的两个特征双线性融合(相乘)后得到矩阵 ,对所有位置进行sum pooling(也可以是max pooling,但一般采用sum pooling以方便进行矩阵运算)得到矩阵,最后把矩阵展开成一个向量,记为bilinear vector。对进行sqrt操作和L2归一化操作后,就得到融合后的特征。将RGB特征和噪声特征经过双线性池融合的特征用于分类,经过全连接层和 softmax 层获得 RoI regions 的篡改类型。总的损失函数如下:

    \[L_{\text {total }}=L_{R P N}+L_{\text {tamper }}\left(f_{R G B}, f_{N}\right)+L_{b b o x}\left(f_{R G B}\right) \]

\(L_{R P N}\)是RPN网络中的loss。\(L_{tamper}\)表示最后的交叉熵分类损失;\(L_{b b o x}\)表示最后的边界框回归损失;\(f_{R G B}\)\(f_{N}\)表示来自RGB和noise stream的RoI features。

MFCN

Image Splicing Localization using a Multi-task Fully Convolutional Network (MFCN)

发表在Journal of Visual Communication and Image Representation ,影响因子:2.45

论文:https://arxiv.org/pdf/1709.02016.pdf

类型:拼接攻击

方法:作者提出了一种利用完全卷积网络(FCN)定位图像拼接攻击的技术。采用 Multi-task FCN,该方法有两个分支,一个用于学习像素是否发生篡改的标签信息,另一个用于学习篡改区域边界信息。最后学习出篡改区域和篡改边界,通过将篡改边界围成的区域进行填充,将填充后的区域和检测的篡改区域取交集就是最终的结果了。

实验结果:

MFCN 将CASIA V2.0作为训练集然后在 CASIA V1.0 和 Columbia 数据集上测试,指标:F1-Score

简评:

  • MFCN 采用了多任务全卷积的方式,创新之处在于提出学习同时学习篡改区域和篡改边界,增加篡改区域的准确性,作者在文中也提出这个方法的问题,那就是篡改图像JEPG压缩后篡改的边缘特征会被影响,因此该方法不能很好的抵抗JEPG压缩攻击,还有一个缺点就是没有代码,复现难度较高。其突出点是 MFCN 在 CASIA v1.0 取得了相当高的成绩 0.5410。

D-Unet

论文:D-Unet: A Dual-encoder U-Net for Image Splicing Forgery Detection and Localization

链家:https://arxiv.org/abs/2012.01821

摘要

当前大多数基于卷积神经网络(CNN)的检测方法来进行图像拼接伪造(篡改)检测的方法都集中在局部补丁或局部对象上。实际上,图像拼接伪造检测是一项利用图像指纹识别篡改和未篡改区域的全局二值分类任务。然而,基于CNN 的检测网络很难保留一些具体的图像内容,但是如果包含其中,将会提高网络的检测精度。为了解决这些问题,作者提出了一种新的双编码器D-Unet用于图像拼接伪造检测,该网络采用了不固定的编码器和固定的编码器。不固定的编码器能够自主学习区分篡改和未篡改区域的图像指纹,而固定的编码器提供方向信息,以帮助网络的学习和检测。该双编码器采用了空间金字塔全局特征提取模块(SPGFE),扩展了D-Unet的全局洞察力,可以更准确地分类被篡改和未被篡改的区域。在对D-Unet和最新方法的实验比较研究中,D-Unet在图像级和像素级检测方面优于其他方法,且不需要对大量伪造图像进行预训练或训练。同时,该算法对各种攻击具有稳定的鲁棒性。

网络结构

用于图像拼接伪造检测的双编码器D-Unet的结构如下图所示,D-Unet的不固定编码器自主学习区分篡改和未篡改区域的图像指纹。固定编码器提取图像中像素的方向信息,并在检测网络的学习和决策过程中与非固定编码器配合使用。接下来,通过空间金字塔全局特征提取模块(SPGFE)扩展D-Unet的全局感受野,该SPGFE可以获取具有全局特征的低分辨率特征图。最终,解码器从低分辨率特征图学习映射,并对篡改区域进行逐像素预测,接下来我们介绍D-Unet的不固定编码器,固定编码器和SPGFE模块。作者进行了充足的实验证明每个模块的有效性,本文受篇幅限制主要介绍方法,有兴趣的小伙伴可以阅读原文了解实验细节。

2.1 不固定编码器

D-Unet的不固定编码器用于学习区分篡改和未篡改区域的图像指纹,作者采用了U-Net作为D-Unet的基本架构,其中不固定编码器的结构与U-Net编码器结构相同。由于图像指纹通常具有基本的图像属性,而不是高级语义特征。较深层网络学习高级语义信息,并失去基本的图像属性。相反,较浅层网络的学习特征不足以探索篡改和非篡改区域的不同图像指纹,因此选择合适的下采样层数很重要。同时检测网络中的下采样方式也很重要,需要保持甚至增强图像指纹。

作者改变了UNet的深度和下采样方式进行了对比实验,实验中用UNET-N-M,UNET-N-C表示不同的U-NET,其中中间的数字N代表下采样的深度,最后一个字母M和C分别代表maxpooling and stride-2 convolution的下采样方式,实验结果如下表所示UNET-4-C效果最好,就是采用stride-2 convolution的下采样方式并且层数为4。

2.2 固定编码器

不固定的编码器负责学习在篡改区域和非篡改区域之间进行区分的图像指纹,而固定编码器则负责学习特定的图像指纹, 图像中普遍存在的特定图像指纹被认为可以直接提高检测网络的学习效率。作者测试了两种不同方式的编码器学习特定的图像指纹分别:1. SRM(富隐写模型) 2. DWT(三级小波分解)。

固定SRM编码器

SRM最早是在LSN中使用在图像篡改检测领域,主要是基于图像篡改区域噪声不一致性,RGB图像的三个通道通过具有三个SRM内核的SRM层可以获取噪声特征图,然后将噪声图通过三个卷积层,每个卷积层的内核大小为5×5,卷积跨度为2。最后,对固定SRM编码器的输出特征进行下采样,并与不固定的输出特征简单地融合在一起,结构如下图所示:

固定DWT编码器

离散小波变换(DWT)能够保留像素的方向信息,有利于检测篡改边缘。作者在输入RGB图像的每个颜色通道上执行三级Haar离散小波变换(DWT),如下图所示。三级小波分解(每级12(3×4)个特征图)。固定DWT编码器的输出特征与非固定编码器的输出特征图通过简单融合方法(SF)融合。

固定编码器和不固定编码器的融合

作者尝试了两种融合方法:(1)输出特征图简单融合方法(SF)融合(如下图a),(2)固定和非固定编码器之间的分层融合(HF)方法(如下图b)

作者对固定SRM编码器和固定DWT编码器以及使用简单(SF)融合方法和分层融合(HF)方法进行了测试,实验结果如下表所示,采用固定DWT编码器和分层融合(HF)方法取得了最好效果,证实了在解码过程中将像素的方向信息提供给Unet-4-C的有效性,并且HF改善了在Unet-4-C中提供像素方向信息的有效性。

2.3 空间金字塔全局特征提取模块(SPGFE)

为了进一步扩展检测网络的全局视野,作者在双编码器之后设计了一个空间金字塔全局特征提取模块(SPGFE)。SPGFE受到人类视觉决策的启发。为了观察物体的局部,人类会接近该物体。为了获得全局视图,它们会离开对象。提出的SPGFE模块下图所示。固定和非固定编码器生成的局部特征图会通过三个分支,这些分支会生成不同比例的全局特征图。小型,中型和大型全局特征图通过1×1卷积层进行连接和操作,并输出最终的多尺度全局特征图。具有不同大小的三个卷积核等效于距对象的不同观察距离。

实验结果

D-UNET在通用的图像篡改数据集CASIA、COLUMB、NIST16上表现SOTA,性能优于FusionNet、C2RNet和RRU-Net等网络。

接着作者对D-UNET的抗攻击能力也做了测试,实验结果表明D-UNET对各种攻击具有稳定的鲁棒性。

总结

这篇文章提出了一种新的双编码器D-Unet用于图像拼接伪造检测,该网络采用了不固定的编码器和固定的编码器,实验证明D-Unet在图像级和像素级检测方面优于其他方法,且不需要对大量伪造图像进行预训练或训练。同时,该算法对各种攻击具有稳定的鲁棒性。

posted @ 2021-09-26 08:40  梁君牧  阅读(3535)  评论(0编辑  收藏  举报