如何用PyTorch对可变帧数的视频坐标数据进行分类?
我有一组从视频中提取的每秒一帧的物体坐标数据,存储在结构如下的CSV表格中:video_name | frame_num | x | y | z | target
尝试用PyTorch的LSTM模型做分类时,遇到了各视频帧数不一致的问题,示例数据维度如下:
(frames_num, number_of_points_for_ech_frame, coordinates) (137, 20, 3) (6, 20, 3) (22, 20, 3) (71, 20, 3) (6, 20, 3) (183, 20, 3)
注:无原始视频文件。想问有没有无需统一帧数,就能用PyTorch对这类可变帧数视频数据做分类的方法?比如相关模型或数据预处理技术?
用PyTorch的
PackedSequence处理变长序列
这是LSTM处理变长输入的标准操作,不用统一帧数。步骤如下:- 先把所有视频数据按帧数从长到短排序
- 用
torch.nn.utils.rnn.pad_sequence把所有序列补到当前最长的帧数(仅形式对齐,计算时会忽略填充部分) - 用
torch.nn.utils.rnn.pack_padded_sequence把补全后的序列转换成PackedSequence,直接传入LSTM - LSTM处理后,要么用
torch.nn.utils.rnn.pad_packed_sequence还原序列,要么直接取每个视频最后一个有效帧的隐藏状态做分类(PackedSequence会自动跟踪每个序列的实际长度)
关键是要保留每个视频的原始帧数,用来生成合法的PackedSequence。
全局时间池化
不管序列长度,对时间维度(帧数维度)做池化操作,把变长序列转成固定维度的特征向量,再喂给分类器。比如对每个视频的(T,20,3)数据,直接对T维度做均值池化(torch.mean(dim=0))或最大池化(torch.max(dim=0)),得到(20,3)的特征,展平后接全连接层即可。这种方法简单直接,不需要复杂的序列处理逻辑。注意力机制
给每个帧的特征分配可学习的权重,通过加权求和得到固定维度的全局特征,天然适配变长序列。比如可以在LSTM输出后加一个注意力层,让模型自动学习每个帧对最终分类的贡献,不管序列多长,最后都能输出固定维度的特征用于分类。使用支持变长输入的模型
比如Transformer,它的自注意力机制本身就支持变长序列输入,只需要用注意力掩码标记填充位置,让模型忽略这些无效部分即可。另外GRU和LSTM逻辑类似,也可以用PackedSequence处理变长输入。
内容的提问来源于stack exchange,提问作者miroshkaDX

