目前(2023)的人脸伪造视频检测并不能达到很好的效果(
C3D
,LSTM
).而利用VIT
的检测方法虽然能达到很好的检测效果,但是缺乏可解释性。因此,作者提出了Interpretable Spatial-Temporal Video Transformer (ISTVT) architecture
。作者在文章中系统分析了不同时空自住意力的变体,并提出decomposed spatial-temporal self-attention mechanism
和self-subtract mechanism
机制
模型包含了
Xception
(特征提取),video transformer network with decomposed spatial-temporal self-attention
以及一个分类网络MLP
文章的关键点就在于如何将
VIT
中的时空特征进行解耦,
在通过Xception
模型提取到特征图(T\times C \times H \times W )信息后,首先将特征图分为 1\times 1 大小的token,每个向量都有 C 个特征维度(T\times H W \times C ),将该向量直接作为输入向量。在每个 1\times 1 大小的token 即空间表示向量上加入一个空间分类向量(T\times 1 \times C )→(T\times (H W + 1) \times C ),同时也在时间维度上加入一个时间分类向量(1 \times (H W+1) \times C )→ ((T+1)\times (H W + 1) \times C ),最后加入可学习的位置信息作为VIT
的输入。
x = self.to_patch_embedding(x)
b, t, n, _ = x.shape
cls_space_tokens = repeat(self.space_token, '() n d -> b t n d', b = b, t = t)
x = torch.cat((cls_space_tokens, x), dim=2)
x += self.pos_embedding[:, :, :(n + 1)]
cls_temporal_tokens = repeat(self.temporal_token, 't () d -> b t n d', b = b, n = n + 1)
在解耦的时空注意力中,在经过多头注意力机制后,由原本的((T+1)\times (H W + 1) \times C → ((T+1)\times (H W + 1) \times N \times D ,分别对时间和空间的token进行自注意力计算,以空间注意力为例,每个空间token大小为:((T+1)\times 1 \times D , 一共有$(H W + 1) \times N$个,分别计算\text{softmax}(\frac{Q K}{\sqrt{D}} \cdot) V
⭐ 在实际的代码开发中,作者通过Rerange
直接调换了时空坐标的位置,方便后续的计算
b, n, _, h = *x.shape, self.heads
qkv = self.to_qkv(x).chunk(3, dim = -1)
q, k, v = map(lambda t: rearrange(t, 'b (t hw) (h d) -> b h t hw d', h = h, hw = 19 * 19 + 1), qkv)
🟢 最终block
代码:
class STTransformer(nn.Module):
def __init__(self, dim, depth, heads, dim_head, mlp_dim, dropout = 0.):
super().__init__()
self.layers = nn.ModuleList([])
self.norm = nn.LayerNorm(dim)
for _ in range(depth):
self.layers.append(nn.ModuleList([
PreNorm(dim, TemporalResidualAttention(dim, heads = heads, dim_head = dim_head, dropout = dropout)),
PreNorm(dim, SpatialOnlyAttention(dim, heads = heads, dim_head = dim_head, dropout = dropout)),
PreNorm(dim, FeedForward(dim, mlp_dim, dropout = dropout))
]))
def forward(self, x):
for attn_t, attn_s, ff in self.layers:
x = attn_s(attn_t(x)) + x
x = ff(x) + x
return self.norm(x)
为了更好的捕捉帧间的异常,作者提出在输入向量映射为QKV时插入
Self-Subtract Mechanism
机制. 该操作生成特征残差来取代原有特征,可以帮助网络忽略冗余信息,专注于判别性不一致的时间特征
具体来说,就是在每个相邻时间维度上做一个残差,具体实现代码,其中残差时序信息只作为QK, V还是原来的向量
b, n, _, h = *x.shape, self.heads
x_rearrange = rearrange(x, 'b (t hw) d -> b t hw d', hw = 19 * 19 + 1)
residual = torch.cat((x_rearrange[:,0:2,:,:],x_rearrange[:,2:,:,:] - x_rearrange[:,1:-1,:,:]), dim = 1)
residual = rearrange(residual, 'b t hw d -> b (t hw) d')
qk = self.to_qk(residual).chunk(2, dim = -1)
v = self.to_v(x)
q, k = map(lambda t: rearrange(t, 'b (t hw) (h d) -> b h hw t d', h = h, hw = 19 * 19 + 1), qk)
v = rearrange(v, 'b (t hw) (h d) -> b h hw t d', h = h, hw = 19 * 19 + 1)
🟢 人脸提取:采用MTCNN方法,在每个视频中截取270帧,每6帧为一个样本,此外对于每一帧,我们使用鼻尖作为边界框的中心,并使用人脸的最大高度和宽度的1.25倍作为框的高度和宽度。最后resize为($300 \times 300$)
🟢 超参数:block块为12, 注意力头数为8, 优化器为SGD, 学习率初始值为0.0005,训练100轮
🟢 跨数据集的实验结果:
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。