张芷铭的个人博客

3D 卷积在高度、宽度、深度三个维度上滑动提取特征,适用于视频分析和医学影像等三维数据。

基本概念

数学定义

$$\text{Output}(x, y, z) = \sum_{i,j,k} W(i, j, k) \cdot X(x+i, y+j, z+k)$$

  • 输入 $X$:$(C_{\text{in}}, H, W, D)$
  • 卷积核 $W$:$(C_{\text{out}}, C_{\text{in}}, K_H, K_W, K_D)$
  • 输出:三维特征图,保留空间和时间信息

应用场景

场景应用
视频分析动作识别、视频分割、运动检测
医学影像MRI/CT 分析、3D 分割、病变检测
3D 物体识别点云处理、自动驾驶 LiDAR 数据

2D vs 3D 卷积

对比项2D 卷积3D 卷积
适用数据单张图片视频、医学影像
输入形状$(C, H, W)$$(C, H, W, D)$
计算复杂度
特征提取空间信息空间+时间信息

输出尺寸计算

$$\text{Output Size} = \frac{\text{Input Size} - \text{Kernel Size} + 2 \times \text{Padding}}{\text{Stride}} + 1$$

示例:输入 $(3, 32, 32, 16)$,卷积核 $(64, 3, 3, 3, 3)$,stride=1,padding=1

  • 空间输出:$(32-3+2)/1+1 = 32$
  • 时间输出:$(16-3+2)/1+1 = 16$
  • 最终输出:$(64, 32, 32, 16)$

PyTorch 实现

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
import torch.nn as nn

class Simple3DConvNet(nn.Module):
    def __init__(self, in_channels=3, out_channels=64):
        super().__init__()
        self.conv3d = nn.Conv3d(in_channels, out_channels, 3, padding=1)
        self.pool3d = nn.MaxPool3d(2, stride=2)

    def forward(self, x):
        return self.pool3d(self.conv3d(x).relu())

# 输入: [batch, channels, depth, height, width]
x = torch.randn(1, 3, 16, 32, 32)
model = Simple3DConvNet()
output = model(x)  # [1, 64, 8, 16, 16]

改进版本

方法说明
(2+1)D 卷积分解为 2D 空间 + 1D 时间卷积,减少计算
3D 深度可分离卷积减少参数,提高效率
注意力结合SE3D、CBAM3D 增强特征提取

Comments