A deep learning approach to detection of splicing and copy-move forgeries in images

2023-11-19

https://github.com/kPsarakis/Image-Forgery-Detection-CNNhttps://github.com/kPsarakis/Image-Forgery-Detection-CNN

        代码是结合代尔夫特理工大学的deep learning这门课的大作业来讲的。整体上一个分类的框架,但是用了srm噪声提取器,这个后来被RGBN作为双流fasterrcnn中的噪声流支路引用,srm在篡改检测中是比较常见的人工设计的算子。这篇文章的代码我跑过,本身还是有效果的,其中它里面数据预训练的分patch操作也在后续中被引进,但说实话,这种简单的网络设计其实跑不过不做任何设计的分类模型,比如res2net。篡改检测常用的基本都是自然场景数据集,比如CASIA1/2,中科院出的数据集,还有BHSig60,COVERAGE,NC16等,这些数据集的篡改手段包括了resize,压缩啊这些操作,其实和常规的文档类的数据集的ps还是有差别的,我们常说自然场景和文档篡改的差别挺大的,文档主要还是以ps这种操作为主。

上面这张图是网络设计,核心是第一组蓝色的cnn操作,这里面融合例如srm滤波器。srm滤波器最早出自于Rich models for steganalysis of digital images中,是Steganalysis Rich Model的缩写,富隐写分析模型,篡改操作会带来十分尖锐的边缘,尤其是拼接操作,会被高通滤波器很明显的体现出来。文章在cnn的结构里对第一层卷积的权重使用30个在srm中九三残差图的基本高通滤波器进行初始化,这些基础的滤波器对应了7个srm残差类别,分布如下:

个数 滤波器类别
8 1st
4 2nd
8 3rd
1 SQUARE3x3
4 EDGE3x3
1 SQUARE5x5
4 EDGE3x3
from typing import Dict

import numpy as np
from torch import Tensor, stack


def get_filters():
    """
    Function that return the required high pass SRM filters for the first convolutional layer of our implementation
    :return: A pytorch Tensor containing the 30x3x5x5 filter tensor with type
    [number_of_filters, input_channels, height, width]
    """
    filters: Dict[str, Tensor] = {}

    # 1st Order
    filters["1O1"] = Tensor(np.array([[0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, -1, 1, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0]]))
    filters["1O2"] = Tensor(np.rot90(filters["1O1"]).copy())
    filters["1O3"] = Tensor(np.rot90(filters["1O2"]).copy())
    filters["1O4"] = Tensor(np.rot90(filters["1O3"]).copy())
    filters["1O5"] = Tensor(np.array([[0, 0, 0, 0, 0], [0, 0, 0, 1, 0], [0, 0, -1, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0]]))
    filters["1O6"] = Tensor(np.rot90(filters["1O5"]).copy())
    filters["1O7"] = Tensor(np.rot90(filters["1O6"]).copy())
    filters["1O8"] = Tensor(np.rot90(filters["1O7"]).copy())

    # 2nd Order
    filters["2O1"] = Tensor(np.array([[0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 1, -2, 1, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0]]))
    filters["2O2"] = Tensor(np.rot90(filters["2O1"]).copy())
    filters["2O3"] = Tensor(np.array([[0, 0, 0, 0, 0], [0, 1, 0, 0, 0], [0, 0, -2, 0, 0], [0, 0, 0, 1, 0], [0, 0, 0, 0, 0]]))
    filters["2O4"] = Tensor(np.rot90(filters["2O3"]).copy())

    # 3rd Order
    filters["3O1"] = Tensor(np.array([[0, 0, 0, 0, 0], [0, 0, 1, 0, 0], [0, 1, -3, 1, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0]]))
    filters["3O2"] = Tensor(np.rot90(filters["3O1"]).copy())
    filters["3O3"] = Tensor(np.rot90(filters["3O2"]).copy())
    filters["3O4"] = Tensor(np.rot90(filters["3O3"]).copy())
    filters["3O5"] = Tensor(np.array([[0, 0, 0, 0, 0], [0, 1, 0, 1, 0], [0, 0, -3, 0, 0], [0, 1, 0, 0, 0], [0, 0, 0, 0, 0]]))
    filters["3O6"] = Tensor(np.rot90(filters["3O5"]).copy())
    filters["3O7"] = Tensor(np.rot90(filters["3O6"]).copy())
    filters["3O8"] = Tensor(np.rot90(filters["3O7"]).copy())

    # 3x3 SQUARE
    filters["3x3S"] = Tensor(np.array([[0, 0, 0, 0, 0], [0, -1, 2, -1, 0], [0, 2, -4, 2, 0], [0, -1, 2, -1, 0], [0, 0, 0, 0, 0]]))

    # 3x3 EDGE
    filters["3x3E1"] = Tensor(np.array([[0, 0, 0, 0, 0], [0, -1, 2, -1, 0], [0, 2, -4, 2, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0]]))
    filters["3x3E2"] = Tensor(np.rot90(filters["3x3E1"]).copy())
    filters["3x3E3"] = Tensor(np.rot90(filters["3x3E2"]).copy())
    filters["3x3E4"] = Tensor(np.rot90(filters["3x3E3"]).copy())

    # 5X5 EDGE
    filters["5x5E1"] = Tensor(np.array([[-1, 2, -2, 2, -1], [2, -6, 8, -6, 2], [-2, 8, -12, 8, -2], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0]]))
    filters["5x5E2"] = Tensor(np.rot90(filters["5x5E1"]).copy())
    filters["5x5E3"] = Tensor(np.rot90(filters["5x5E2"]).copy())
    filters["5x5E4"] = Tensor(np.rot90(filters["5x5E3"]).copy())

    # 5x5 SQUARE
    filters["5x5S"] = Tensor(np.array([[-1, 2, -2, 2, -1], [2, -6, 8, -6, 2], [-2, 8, -12, 8, -2], [2, -6, 8, -6, 2], [-1, 2, -2, 2, -1]]))

    return vectorize_filters(filters)


def vectorize_filters(filters: dict):
    """
    Function that takes as input the 30x5x5 different SRM high pass filters and creates the 30x3x5x5 tensor with the
    following permutations 									
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

A deep learning approach to detection of splicing and copy-move forgeries in images 的相关文章

随机推荐

  • PLC控制电动机的顺序启动逆序停止

    一 PLC控制电动机延迟启动正转和反转 实验要求 当按下电动机的正转启动按钮时 电动机需要延迟30秒后 电动机才会正转启动工作 当按下反转按钮时 电动机需要延迟20秒后 电动机才会反转启动工作 当按下停止按钮时电动机立刻停止工作 PLC I
  • 浅谈系列之DevSecOps(一)目标及优点

    一 DevOps目标 说到DevSecOps就不得不提DevOps 后者的目标是提升整个研发效能 进行更便捷 更快捷 更可靠的交付 从而提高产品竞争优势 DevOps模糊了以往研发模式中开发 测速 运维等岗位和角色的界限 加强了他们之间的协
  • 如何通过Charles+BurpSuite的配合在PC端抓到手机包

    渗透测试工作记录 文章目录 渗透测试工作记录 前言 一 Charles是什么 二 实现步骤 以Mac端抓包IOS微信小程序为例 1 在Charles下设置代理的端口 2 分别在PC端和手机端安装证书 3 关闭macOS代理 打开外部代理 4
  • ESP32-CAM配置开发环境并烧录程序运行

    环境准备 ESP32 CAM开发板 烧录器 摄像头和一根USB线束连接电脑即可 Arduino下载完成后打开 不同版本的菜单栏可能稍微不同 仔细找即可 选择下面的选项 联网自动下载ESP32 CAM的 环境 端口和当前的一致即可 正常连接应
  • QT项目实战之翻金币小游戏

    目录 一 实现效果 二 实现过程 1 创建项目 添加项目资源 2 创建主场景 mainscene cpp h 3 自定义开始按钮 mypushbutton cpp h 4 创建选择关卡场景 chooselevelscene cpp h 5
  • js-年月日时分秒字符串切割,只显示年月日

    substring 方法用于提取字符串中介于两个指定下标之间的字符 var date 2020 01 01 00 00 00 date substring 0 10 console log date 2020 01 01
  • 怎么创建llvm的编译环境

    1 安装环境 首先 本人在下面操作使用的是ubuntu16的版本 具体如下图所示 2 安装环境参考网址 https source android com setup build initializing 3 下载llvm代码 官网下载9 0
  • Swift语法学习--字符&字符串

    Swift语法学习 字符 字符串
  • 疯壳AI语音及人脸识别3-4AI人脸系统架构

    详情地址 https fengke club GeekMart views offline ai 购买链接 https fengke club GeekMart su fKw7Nb7oC jsp 视频地址 https fengke club
  • sql修改一列或所有列的表类型和注释

    一列 ALTER TABLE cspg mp db mp device electric consumption statistics 1d MODIFY COLUMN electric double 20 2 NULL COMMENT 电
  • 链表面试题(一):反转链表的算法实现

    关于链表的考察 链表是面试里面经常涉及到的考点 因为链表的结构相比于Hashmap Hashtable Concurrenthashmap或者图等数据结构简单许多 对于后者更多面试的侧重点在于其底层实现 比如Hashmap中Entry
  • Python基础语法:数据分析利器

    欢迎来到我的博客 作者 秋无之地 简介 CSDN爬虫 后端 大数据领域创作者 目前从事python爬虫 后端和大数据等相关工作 主要擅长领域有 爬虫 后端 大数据开发 数据分析等 欢迎小伙伴们点赞 收藏 留言 上一篇文章已经跟大家介绍过 数
  • Jquery ligerui下拉框复选,使下拉框中相应值对勾选中

    othertypeCombox ligerGetComboBoxManager selectValue 1 2 3 4 othertypeCombox ligerGetComboBoxManager bulidContent 必须加上后一行
  • python创意实用案例-9个 Python 实用案例分享

    1 整理字符串输入 整理用户输入的问题在编程过程中极为常见 通常情况下 将字符转换为小写或大写就够了 有时你可以使用正则表达式模块 Regex 完成这项工作 但是如果问题很复杂 可能有更好的方法来解决 user input This str
  • 让你不得不学Python 的十大重要理由

    简单易学 Python是一种代表简单主义思想的语言 阅读一个良好的Python程序就感觉像是在读英语一样 它使你能够专注于解决问题而不是去搞明白语言本身 Python极其容易上手 因为Python有极其简单的说明文档 速度快 Python
  • 模拟实现 队列 - JAVA(使用链表,数组)

    以链表实现 以数组实现 以链表实现 class Node public int val public Node next public Node int val this val val public class MyQueue publi
  • Java堆的自动垂直缩放

    多年以来 java一直是贪婪的应用程序的同义词 这种类型的应用程序在晚上打开冰箱并吞噬所有可用资源 直到崩溃 该行为的主要原因是缺乏一种有效的方式来将操作系统在Java堆中分配且不再使用的内存交还给操作系统 However with the
  • Ansible Ad-Hoc与常用模块

    ansible 执行结果信息 各颜色说明 ansible Ad Hoc 说明 ansible 如何查看帮助文档与常用模块详解 主机规划 主机名称 操作系统版本 内网IP 外网IP 模拟 安装软件 ansi manager CentOS7 5
  • 【Python】自动化构建项目结构样式

    引言 在使用Python或者其它编程语言的项目时候 编写README md 往往是不可或缺的 而在README md 中 关于项目结构的样式展示 这个是可选的 不展示也无伤大雅 但有展示的话 有以下优点 提供清晰的项目导航 包含项目结构的文
  • A deep learning approach to detection of splicing and copy-move forgeries in images

    https github com kPsarakis Image Forgery Detection CNNhttps github com kPsarakis Image Forgery Detection CNN 代码是结合代尔夫特理工
Powered by Hwhale