论文介绍
题目:MIE-Net: Motion Information Enhancement Network for Fine-Grained Action Recognition Using RGB Sensors
论文地址:MIE-Net: Motion Information Enhancement Network for Fine-Grained Action Recognition Using RGB Sensors | IEEE Journals & Magazine | IEEE Xplore
QQ深度学习交流群:994264161
扫描下方二维码,加入深度学习论文指南星球!
加入即可获得,模块缝合、制作、写作技巧,学会“结构”创新、“创新点”创新,从三区到顶会,小论文大论文,毕业一站式服务
创新点
提出了一种新型网络架构MIE-Net:提出了一种运动信息增强网络(MIE-Net),结合RGB特征和运动增强特征,能够在端到端框架中进行细粒度动作识别。包含两个创新模块:自适应融合模块(AFM)和双池化时序注意模块(DPTAM)。
自适应融合模块(AFM):通过选择性提取RGB特征与运动增强特征之间的关系,强化不同特征之间的信息交互,提升了融合特征的时空表示能力。
双池化时序注意模块(DPTAM):在通道维度实现时序建模,提取细微特征,并可灵活嵌入现有的2D CNN骨干网络,如ResNet-50,而无需显著改变网络拓扑。
构建了一个新的数据集SLJD:收集了包含超过1000段视频的站立跳远数据集,具有背景无偏性强的特点,用于评估模型的鲁棒性和有效性。
实验验证和性能提升:在SLJD、Something-Something v2和Diving48等数据集上,MIE-Net的准确率超越了大多数现有的最先进方法。提供了更高的识别准确率,同时保持了较低的计算开销(FLOPs)。
数据集提供了细粒度动作标注,如起跳、腾空等阶段,为细粒度动作分析提供了理想的验证平台。
方法
整体架构
MIE-Net 模型是一种端到端的细粒度动作识别框架,通过视频帧采样生成 RGB 特征和运动增强特征,利用自适应融合模块(AFM)对两者进行交互式融合,再通过双池化时序注意模块(DPTAM)在时序和通道维度进行建模,增强时空特征表达。融合后的特征输入到以 ResNet-50 为主干网络的架构中,最终通过全连接层输出分类结果,实现高效且精准的动作识别。
1. 输入处理与视频分段
输入视频序列
被分为V V 个等长的段,每段从连续的四帧中随机选取一帧生成 RGB特征T T 。X RGB X_{\text{RGB}} 使用 持续显著性模块(PA Module) 处理每段的四帧,生成 运动增强特征
,捕获相邻帧之间的细微动作变化和边界信息。X MIE X_{\text{MIE}}
2. 特征融合模块:自适应融合模块(AFM)
功能:融合RGB特征和运动增强特征,增强特征之间的交互关系。
具体过程:
首先将
和X RGB X_{\text{RGB}} 进行逐元素相加,生成初步融合特征X MIE X_{\text{MIE}} 。X NEW X_{\text{NEW}} 使用通道注意机制生成通道权重
,通过空间维度压缩特征以提取全局信息。M M 对RGB特征和运动增强特征分别施加注意权重,得到加权的
和X ^ RGB \hat{X}_{\text{RGB}} 。X ^ MIE \hat{X}_{\text{MIE}} 最后将两者按照权重进行加权连接,得到融合后的特征
。X ^ ADP \hat{X}_{\text{ADP}}
3. 特征提取与时序建模:双池化时序注意模块(DPTAM)
功能:增强模型对时序和通道维度信息的建模能力。
具体过程:
输入的4D张量
通过维度置换生成X 0 X_0 ,对其空间信息进行全局描述。X 1 X_1 使用1D卷积在时序维度上增强通道依赖性,并通过注意机制生成时序-通道的权重
和F 1 F_1 。F 2 F_2 结合时序权重和通道权重,进一步优化特征表示。
通过反置换操作恢复原始张量的形状,使其与后续网络兼容。
4. 主干网络:ResNet-50
模型的主干网络为 ResNet-50,并在其Bottleneck模块中嵌入DPTAM(阶段2到阶段5)。
DPTAM通过局部和全局操作增强特征提取能力,在不显著改变网络拓扑的情况下提升了网络性能。
5. 分类与输出
最终,融合后的特征通过全连接层进行分类,输出每个视频的动作类别分数。
即插即用模块作用
DPTAM 作为一个即插即用模块:
细粒度动作识别任务:
时空特征建模任务:
对效率有要求的模型部署场景:
视频分类和事件检测任务:
在需要捕获动作的细微变化(如肢体小幅度动作或复杂运动模式)的场景中,DPTAM 可以帮助模型提取局部和全局的时空特征。适用于诸如 SLJD(站立跳远数据集)和 Diving48(跳水数据集)等对动作细节敏感的数据集。
适用于视频分析任务中需要建模时间维度信息的场景,例如动作分类、时序动作检测和视频理解任务。可用于动态视频中同时需要捕获空间结构(如人体姿态)和时间变化(如动作连续性)的任务。
由于其计算成本相对较低(比复杂的 NonLocal 模块更高效),DPTAM 适合资源受限的设备(如嵌入式系统或边缘设备)上的模型优化和部署。
在长时间或短时间跨度的视频中捕获时间依赖性,例如事件边界检测或视频摘要生成。
消融实验结果
内容:比较了在 ResNet-50 的残差块中,不同位置插入 DPTAM 对模型性能的影响(DPTAM-1、DPTAM-2、DPTAM-3)。
说明:
在 SLJD 数据集中,DPTAM 插入到第一个
卷积后(DPTAM-1)性能最佳。1 × 1 1 \times 1 在 Diving48 数据集中,插入到最后一个
卷积后(DPTAM-3)效果更好。1 × 1 1 \times 1 结果体现了不同任务对时序和通道建模的需求不同。
内容:评估了五种特征融合策略,包括简单的逐元素加法、通道维度平均池化、加权连接等。
说明:
AFM 的融合策略(MIE&RGB_AS_CAT)在 SLJD 和 Diving48 数据集上均表现最佳。
该结果表明 AFM 能有效增强 RGB 和运动增强特征之间的交互。
内容:比较了 Squeeze-and-Excitation(SE)模块和 NonLocal(NL)模块的效果。
说明:
DPTAM 的性能优于 SE 和 NL 模块,同时保持了较低的计算开销。
表明 DPTAM 在时空特征建模上具有更高的效率和精确性。
即插即用模块
import torch
import torch.nn as nn
import torch.nn.functional as F
import torchvision
class DPTAM(nn.Module):
def __init__(self,
in_channels,
n_segment,
kernel_size=3,
stride=1,
padding=1):
super(DPTAM, self).__init__()
self.in_channels = in_channels
self.n_segment = n_segment
self.kernel_size = kernel_size
self.stride = stride
self.padding = padding
print('DPTAM with kernel_size {}.'.format(kernel_size))
self.conv_mask = nn.Conv2d(in_channels, 1, kernel_size=3)#context Modeling
self.softmax = nn.Softmax(dim=2)
self.p1_conv1= nn.Conv1d(in_channels , in_channels, 1, bias=False)
self.dptam = nn.Sequential(
nn.Conv1d(in_channels,
in_channels // 4,
kernel_size,
stride=1,
padding=kernel_size // 2,
bias=False), nn.BatchNorm1d(in_channels // 4),
nn.ReLU(inplace=True),
nn.Conv1d(in_channels // 4, in_channels, 1, bias=False),
nn.Sigmoid())
def forward(self, x):
nt, c, h, w = x.size()
t = self.n_segment
n_batch = nt // t
new_x = x.view(n_batch, t, c, h, w).permute(0, 2, 1, 3,4).contiguous()
out = F.adaptive_avg_pool2d(new_x.view(n_batch * c, t, h, w), (1, 1))
x_22=out.view(-1,c,t)
x22_c_t = self.p1_conv1(x_22)
x22 =x_22.mean(2,keepdim=True)
x22 = self.p1_conv1(x22)
x22 = x22_c_t * x22
x22= x_22+x22
local_activation = self.dptam(x22).view(n_batch, c, t, 1, 1)
new_x = new_x * local_activation
out = new_x.view(n_batch, c, t, h, w) #光local
out = out.permute(0, 2, 1, 3, 4).contiguous().view(nt, c, h, w)
return out
if __name__ == '__main__':
n_segment = 16
block = DPTAM(in_channels=4, n_segment=n_segment)
input = torch.rand(16, 4, 16, 16)
output = block(input)
print(input.size())
print(output.size())
便捷下载方式
浏览打开网址:https://github.com/ai-dawang/PlugNPlay-Modules
更多分析可见原文