TruFor笔记和代码复现

TruFor 笔记和代码复现

最近有个新闻很火,说谷歌 AI 技术曾判定美国登月任务的照片存在虚假内容大佬找到了出处,使用的是 google 的论文arxiv,代码开源在GitHub

笔记

这篇论文介绍了一个名为 TruFor 的图像伪造检测和定位框架。该框架可以应用于各种图像处理方法,包括基于深度学习的伪造方法。TruFor 利用了 RGB 图像和一个学习的噪音敏感指纹来提取高级和低级痕迹,最终输出像素级别的定位图和整个图像的完整性分数,以及一个可靠性映射,用于减少误报。

image.png

它包括以下几个关键组件:

  1. Noiseprint++ 提取器:该提取器从 RGB 图像中获取一个学习的噪声敏感指纹。
  2. 编码器:编码器使用 RGB 输入和 Noiseprint++共同计算将被异常解码器和置信度解码器使用的特征。
  3. 异常解码器和置信度解码器:这两个解码器分别用于像素级别的伪造定位和置信度估计。
  4. 伪造检测器:该检测器利用定位图和置信度图进行图像级别的决策。

这些组件通过三个训练阶段进行学习:

  1. 首先,使用大量原始图像数据集训练 Noiseprint++提取器。
  2. 然后,使用相同的数据集训练异常定位网络的编码器和解码器。
  3. 最后,使用相同的数据集训练置信度图解码器和伪造检测器。

通过这些组件和训练阶段,TruFor 框架能够在各种图像伪造方法中实现可靠的检测和定位。

模型输出包括以下三个部分:

  1. 全局完整性得分(Global Integrity Score):该得分表示图像的整体真实性,用于自动图像伪造检测。
  2. 异常定位图(Anomaly Localization Map):该图表示图像中可能存在伪造的区域。通过分析异常定位图,用户可以识别被篡改的区域。
  3. 置信度图(Confidence Map):该图突出显示了异常定位图中可能存在误报的区域。通过分析置信度图,用户可以区分异常定位图中的真实伪造区域预测和随机异常。 这三个输出为用户提供了有关图像真实性和可能篡改区域的全面信息,有助于进行进一步的分析

代码复现

作者在 github 上给出了一个复现方法,git clone 之后bash docker_build.shbash docker_run.sh。使用 docker 固然容易复现,但是这个项目并没有什么奇怪的依赖,所以我们可以大胆直接跑。(如果你想用 docker 跑我劝你不要,因为代码有 bug 需要修)

首先 clone 项目

1
git clone https://github.com/grip-unina/TruFor

然后下载依赖,作者没有给 requirements.txt,我从 Dockerfile 找到了下载依赖的部分

1
pip install tqdm yacs>=0.1.8 timm>=0.5.4 numpy==1.21.5

接下来 cd 到test_docker文件夹,下载模型

1
2
3
cd test_docker
wget -q -c https://www.grip.unina.it/download/prog/TruFor/TruFor_weights.zip
unzip -q -n TruFor_weights.zip && rm TruFor_weights.zip

有同学反馈说下载不了,我把文件放到了这里

你的test_docker 文件夹下应该有一个weights文件下,下面有一个文件trufor.pth.tar

接下来,运行下面的命令复现测试

1
2
cd src
python trufor_test.py

你注意一下,如果爆显存了就运行,这样会使用 cpu 推理

1
python trufor_test.py --gpu -1

运行结束后你在test_docker/output 目录下应该能看到这样的四个文件image.png

你也可以指定推理的图片和保存位置,参考python trufor_test.py -h,可以传一个文件或者文件夹

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
usage: trufor_test.py [-h] [-gpu GPU] [-in INPUT] [-out OUTPUT] [-save_np] ...

Test TruFor

positional arguments:
opts other options

options:
-h, --help show this help message and exit
-gpu GPU, --gpu GPU device, use -1 for cpu
-in INPUT, --input INPUT
can be a single file, a directory or a glob statement
-out OUTPUT, --output OUTPUT
output folder
-save_np, --save_np whether to save the Noiseprint++ or not

接下来让我们可视化异常检测图,回到test_docker文件夹,

很重要!! 请看visualize.py 他的第 32 行是不是

1
fig.suptitle('score: %.3f' % result['score_sigmoid'])

这是个错误!请将他改成下面的代码

1
fig.suptitle('score: %.3f' % result['score'])

运行下面的命令,记得把/path/to改成你的真实路径

1
2
cd ..
python visualize.py --image /path/to/TruFor/test_docker/images/pristine1.jpg --output /path/to/TruFor/test_docker/output/pristine1.jpg.npz

我们可以得到推理结果 image.png

ok,让我们来看看宇航员的图片吧,先下载两张图

1
2
wget https://history.nasa.gov/alsj/a15/AS15-92-12407HR.jpg
wget https://history.nasa.gov/alsj/a15/AS15-92-12424HR.jpg

我直接给出运行结果 image.png image.png


TruFor笔记和代码复现
https://studyinglover.com/2023/11/28/TruFor笔记和代码复现/
作者
StudyingLover
发布于
2023年11月28日
许可协议