2D卷積核處理3D(時序)數據
- 一、Make A Video的處理方法(PseudoConv3d)
- 二、Tune A Video的處理方法(InflatedConv3d)
- 比較與分析
- 相似點
- 不同點
- 結論
Conv2D一般用于處理image,dim一般是4,(batch,channel,high,width)。對于多幀問題,例如時間序列,會多一個frame,也就是dim=5,(batch,frame,channel,high,width)。
此時需要做一些處理來適應Conv2D,同時提取時序特征。
一、Make A Video的處理方法(PseudoConv3d)
PseudoConv3d 選擇通過分離空間卷積和時間卷積的方式來處理視頻數據。先進行二維空間卷積,再通過一維時間卷積處理時間維度。
class PseudoConv3d(nn.Module):def __init__(self,dim,dim_out = None,kernel_size = 3,*,temporal_kernel_size = None,**kwargs):super().__init__()dim_out = default(dim_out, dim)temporal_kernel_size = default(temporal_kernel_size, kernel_size)# 在2d卷積后,再加1d卷積來處理時間序列。self.spatial_conv = nn.Conv2d(dim, dim_out, kernel_size = kernel_size, padding = kernel_size // 2)self.temporal_conv = nn.Conv1d(dim_out, dim_out, kernel_size = temporal_kernel_size, padding = temporal_kernel_size // 2) if kernel_size > 1 else Noneif exists(self.temporal_conv):nn.init.dirac_(self.temporal_conv.weight.data) # initialized to be identitynn.init.zeros_(self.temporal_conv.bias.data)def forward(self,x,enable_time = True):b, c, *_, h, w = x.shapeis_video = x.ndim == 5enable_time &= is_videoif is_video:x = rearrange(x, 'b c f h w -> (b f) c h w')x = self.spatial_conv(x)if is_video:x = rearrange(x, '(b f) c h w -> b c f h w', b = b)if not enable_time or not exists(self.temporal_conv):return xx = rearrange(x, 'b c f h w -> (b h w) c f')x = self.temporal_conv(x)x = rearrange(x, '(b h w) c f -> b c f h w', h = h, w = w)return x
二、Tune A Video的處理方法(InflatedConv3d)
InflatedConv3d 選擇展平法,使二維卷積適用于視頻數據。具體步驟是先將視頻數據展平成二維數據,進行二維卷積操作,然后再恢復回三維數據。
class InflatedConv3d(nn.Conv2d):def forward(self, x):video_length = x.shape[2]# 將輸入的三維張量重排為二維形式以適配 Conv2dx = rearrange(x, "b c f h w -> (b f) c h w")# 調用父類的 forward 方法進行二維卷積操作x = super().forward(x)# 將卷積后的張量重新排列回三維形式x = rearrange(x, "(b f) c h w -> b c f h w", f=video_length)return x
InflatedConv3d源碼鏈接
比較與分析
相似點
- 處理方式:
兩者都使用二維卷積處理空間維度上的特征。
兩者都通過數據形狀重排來適應二維卷積的輸入要求。
不同點
- 時間維度處理:
- InflatedConv3d:不單獨處理時間維度,而是通過二維卷積直接在展平后的數據上進行卷積,這種方式沒有專門的時間卷積操作。
- PseudoConv3d:先進行二維空間卷積,然后通過一維時間卷積處理時間維度。這樣做能夠明確分離空間和時間特征的提取。
- 卷積核初始化:
- InflatedConv3d:直接使用父類 nn.Conv2d 的權重和偏置,沒有特別的初始化。
- PseudoConv3d:時間卷積核初始化為 Dirac 分布,使其初始狀態下相當于恒等映射。
- 等價性
嚴格來說,InflatedConv3d 和 PseudoConv3d 并不完全等價,因為它們處理時間維度的方式不同:
- InflatedConv3d 是通過展平數據和二維卷積來“間接”處理時間維度。
- PseudoConv3d 明確地在空間卷積后,使用一維卷積處理時間維度。
由于 PseudoConv3d 進行了顯式的一維時間卷積,它在時間特征的提取上可能更靈活和強大,而 InflatedConv3d 則更簡潔,但可能在處理復雜時間依賴時不如 PseudoConv3d。
結論
InflatedConv3d 和 PseudoConv3d 在一些情況下可以產生類似的效果,尤其是當時間維度的變化相對簡單時。然而,PseudoConv3d 由于其明確的時間卷積操作,在處理復雜時間動態時可能更有效。因此,它們并不是嚴格等價的,但都在一定程度上解決了將二維卷積擴展到三維視頻數據的問題。