0. 一句话
PSCC-Net 做两件事:① 检测——判断一张图是不是被 P 过(真假二分类);② 定位——把被 P 的区域一个像素一个像素地圈出来(输出一张黑白 mask)。它的核心创新是「由粗到细渐进式生成 mask」+「空间 + 通道双重相关性注意力模块 SCCM」。
1. 背景:这是什么任务(IMDL)
IMDL = Image Manipulation Detection and Localization(图像篡改检测与定位)。
篡改分两大类:
| 类别 | 说明 | 例子 |
|---|---|---|
| 内容相关(content-dependent) | 动了图像内容,制造假信息 | splicing 拼接(从别的图搬一块贴过来)、copy-move 复制移动(同图内复制一块)、removal 移除(抠掉物体再用修复算法填上) |
| 内容无关(content-independent) | 全局后处理,不制造假信息但会掩盖痕迹 | 亮度/对比度、模糊、加噪、JPEG 压缩 |
关键难点:内容相关的篡改会"顺着语义"来(把车贴在马路上、把脸换掉),肉眼几乎看不出破绽。但它会在"图像指纹"层面留下不一致——比如拼接进来的区域,其相机噪声、JPEG 压缩痕迹和原图其他区域对不上。
检测(这张图假不假)和定位(哪里假)是两个层次:检测给机器/系统用,定位给人看。
2. 论文要解决的三个难题(读论文时抓住这三点)
作者说之前的方法有 3 个没解决好的问题:
- A. 尺度变化(Scale Variation):被 P 的区域有大有小。传统的 encoder-decoder 和 no-pooling 结构都是"串行"提取特征,没法同时用好局部细节和全局上下文,只能应付有限的尺度。
- B. 图像相关性(Image Correlation):判断一块区域是不是篡改,最好的办法是把它和正常区域对比。但以前的方法大多直接学"图 → mask"的映射,容易过拟合到某一种攻击类型;忽略了空间相关性,泛化差。
- C. 检测(Detection):检测和定位本来是相关的(有区域响应高 = 假,全低 = 真),但以前的方法默认所有输入都是篡改图,导致对干净图大量误报。
→ PSCC-Net 就是针对这三个问题设计的。
3. 网络结构:两条路径(图 2 是灵魂,务必看懂)
3.1 Top-Down Path(自上而下,提取特征)——骨干 HRNetV2p-W18
用 HRNet(论文里的 [27],High-Resolution Net) 当骨干。特点:
- 4 个 stage,每个 stage 输出一个尺度的特征 F1、F2、F3、F4(F1 是原始分辨率,F4 是最小分辨率,依次下采样)。
- 多尺度是并行算的,且各尺度之间有密集连接——这跟传统 encoder-decoder(串行、先降后升)完全不同。
为什么选它?因为每个尺度的特征都同时融合了局部和全局信息,正好对应"尺度变化"问题。而且每个尺度都能独立预测一个 mask,正好配合后面的渐进机制。
3.2 Bottom-Up Path(自下而上,生成 mask)——渐进式(核心创新之一)
从最粗的 M4 开始,一步一步做到最细的 M1:
M4 = f4(F4) ← 最粗,先粗略圈出"疑似篡改区域"
M3 = f3( upsample(M4) · F3 ) ← 用上一级的 mask 调制当前特征
M2 = f2( upsample(M3) · F2 )
M1 = f1( upsample(M2) · F1 ) ← 最终输出,全分辨率定位图
公式 M_{n-1} = f_{n-1}( τ(M_n) · F_{n-1} ),其中 τ 是上采样,· 是调制(把上一级 mask 乘到特征上,让网络"重点看"那些疑似区域)。
为什么要这样做? 这是"像人一样由粗到细":先模糊地圈出大概范围,再在精细尺度上细化边界。直接一步生成最细 mask 太难;分步来,每步都有上一级的先验,越做越准。
注意:4 个尺度的 mask 都有监督(都对 ground-truth 算 loss),否则中间 mask 不会乖乖按"粗到细"来。
好处:因为可以提前终止(M3 就够好了就停),推理能加速约 37%。
3.3 SCCM:Spatio-Channel Correlation Module(核心创新之二)
定位 = 像素级二分类。理想情况下,篡改区域的特征彼此相似、和正常区域的特征不同——那做个聚类就能分出 mask。SCCM 就是把这种"相似性"显式建模。
SCCM 对特征 X(H×W×C)同时做两种注意力:
- 空间注意力(Spatial Attention, SA):算"哪两个位置的特征相似"。相似度高 → 可能是同一类(都是篡改,或都是正常),从而聚合全局上下文。公式
softmax(Xθ · Xφᵀ) · Xg(这就是 Non-local / 自注意力的套路)。 - 通道注意力(Channel Attention, CA):算"哪两个通道的特征图相关"。因为不同通道的响应可能对应同一个类(篡改 or 正常),把相关的通道聚合起来能增强篡改区域的表达。公式
Xg · softmax(Xθᵀ · Xφ)。
两个注意力用同一套线性嵌入(feature sharing),互相促进、省计算。
关键工程细节:空间相关矩阵是 HW×HW(256×256 时是 65536×65536,内存爆炸)。所以先用一个 reshape 函数 h 做降维(down-scaling ratio r,比如 r=4,变成 4096×4096),不丢信息,只是把特征图摊平成向量。这样 SCCM 既能用在低层特征也能用在高层特征。
最后输出:Z = X + αs·ωs(Ys) + αc·ωc(Yc)(残差连接,αs、αc 是两个可学习权重,初始都是 1),再接 Conv-ReLU-Conv-Sigmoid 压成 1 通道 mask。
3.4 Detection Head(分类头)——针对"问题 C"
不靠 mask 的响应去猜真假,而是单独一个分类头,输入学到的特征,输出 forged/authentic 的二分类分数。这样对干净图不会误报。
4. 损失函数
L = L_bce(s_d, l_d) + 1/4 · Σ_{m=1..4} L_bce(M_m, G_m)
↑ 检测(真假) ↑ 4 个尺度 mask 的平均定位损失
都是二值交叉熵(BCE)。检测标签 l_d:0=真 1=假;每个 mask 的 GT 由原始 GT mask 下采样到对应尺度得到。
5. 训练数据(自合成,值得注意)
没有标准 IMDL 训练集,作者自己合成 0.38M 张:
- splicing 116,583(MS COCO 抠块 + 变换贴到别图)
- copy-move 100,000(用 BusterNet 的数据集)
- removal 78,246(抠掉 COCO 区域,用当时 SOTA 修复算法填)
- pristine 81,910(COCO 原图)
强调:这比 ManTra-Net / SPAN 用 125 万张预训练还少得多,但效果更好——说明方法本身更高效(不用海量数据)。
6. 效果(能背下来的数字)
- 速度:处理一张 1080P 图只需 0.019s(50+ FPS);ManTra-Net 要 0.208s、SPAN 要 0.161s。
- 精度:检测和定位都达到当时的 SOTA,超过 ManTra-Net、SPAN 等。
- 鲁棒性:对缩放/模糊/噪声/JPEG 压缩都比 ManTra-Net 和 SPAN 更稳(尤其对缩放,因为特征会重采样到固定尺寸)。
7. 三个贡献(论文自己总结的)
- 提出 PSCC-Net,检测表现好,定位用"由粗到细"渐进式提升;
- 设计 SCCM 模块,同时抓空间和通道相关性、泛化更好,且不需要海量标注数据预训练;
- 检测和定位双双 SOTA。
8. 和代码怎么对应(跑过一遍会记得特别牢)
| 论文概念 | 代码文件 |
|---|---|
| Top-down 骨干 HRNet | models/seg_hrnet.py(get_seg_model)、models/seg_hrnet_config.py |
| Bottom-up 渐进式 + SCCM(4 个 mask) | models/NLCDetection.py(NLCDetection.forward 返回 mask1..mask4) |
| Detection head(真假分类) | models/detection_head.py(DetectionHead,输出 [B,2] logit) |
| 测试入口 | test.py(pred_mask = SegNet(feat)[0] 取 mask1 作最终定位图) |
| 权重 | checkpoint/HRNet_checkpoint/HRNet.pth、NLCDetection_checkpoint/NLCDetection.pth、DetectionHead_checkpoint/DetectionHead.pth |
小提醒:
NLCDetection里的 “NLC” = Non-Local + Channel,本质就是 SCCM 的空间(Non-Local)+通道(Channel)相关性,名字不同而已。
9. Q&A
- Q:为什么用 HRNet,不用 U-Net? → U-Net 是 encoder-decoder 串行,先降采样丢细节再升;HRNet 多尺度并行 + 密集连接,每个尺度都保留高分辨率细节 + 全局上下文,更适合多尺度篡改。
- Q:渐进式 mask 和直接输出一个 mask 差在哪? → 直接输出一步到位难、边界糊;渐进式每步有上一级先验,由粗到细,且每个尺度都有监督,边界更准,还能提前终止省时间。
- Q:SCCM 和普通 attention 有什么不一样? → 普通方法空间、通道注意力分开做、还要额外融合,且受内存限制只能用于小尺寸高层特征;SCCM 用同一套嵌入同时做两种注意力、互相促进,还用降维 reshape 让它可以用于任意尺寸特征。
- Q:检测和定位为什么要分开? → 以前从 mask 响应推检测,默认输入都有篡改 → 干净图误报;独立分类头直接从特征出真假分数,更可靠。