双流融合与稀疏采样:视频行为识别的高效深度网络解析

发布时间:2026/9/18 16:18:10
双流融合与稀疏采样:视频行为识别的高效深度网络解析 简介《基于卷积神经网络的人体行为识别方法》是一篇面向深度学习与计算机视觉研究者的学术论文聚焦视频中的人体行为识别任务针对长时间视频密集采样导致计算成本过高的问题提出深度残差网络与BN-Inception网络相组合的空间时间网络。空间网络采用ResNet提取视频帧外观特征时间网络采用BN-Inception提取光流运动特征并利用稀疏采样与得分融合提升识别精度在UCF-101和HMDB-51数据集上分别取得94.5%和70.1%的准确率。资源包为一个PDF文件共1.09MB内含论文正文、网络结构图、公式推导与实验数据读者可系统了解ResNet快捷连接如何缓解梯度消失、BN-Inception如何建模光流以及双流融合的完整思路适合行为识别、视频理解方向的学生和工程师深入参考。论文所提方案对视频监控、人机交互、无人驾驶等实际任务亦有借鉴意义目前已有752人学习是相关领域值得收藏的文献。1. 从密集采样到稀疏双流行为识别计算成本的解法视频行为识别是计算机视觉的长期热点视频监控、人机交互、无人驾驶都依赖它把“画面里发生了什么”转成结构化判断。但连续帧外观高度相似逐帧卷积会让计算成本随视频长度线性膨胀。2019年杭州电子科技大学这篇论文给的解法很务实用101层深度残差网络ResNet构建空间网络提取静态外观用BN-Inception构建时间网络学习光流运动按时间把视频切成3段稀疏采样最后将两路Softmax得分平均融合在UCF-101上达到94.5%、HMDB-51上70.1%优于同期iDTs、C3D和TSN。适合正在做视频分类、行为识别或双流网络调参的工程师。2. ResNet空间流与BN-Inception时间流双分支选型的内在逻辑2.1 空间流为什么从BN-Inception换成ResNet论文在设计空间网络时先考虑了BN-Inception这是TSN等经典方案常用的空间流主干批归一化让训练稳定ImageNet分类表现也不差。但在对比实验中ResNet在ImageNet上的分类准确率高于BN-Inception而且ResNet可以做得更深。行为识别里外观信息高度依赖语义层次浅层特征看到边缘和纹理深层特征才能看到“人举着手臂”这类动作相关的语义更深的主干意味着更强的语义提取能力。直接用BN-Inception堆深行不通。网络加深后梯度消失会先出现即使通过初始化和中间归一化缓解梯度爆炸更深网络的训练误差也会饱和甚至上升这就是退化问题。ResNet通过快捷连接改变学习目标不再直接学习期望映射H(x)而是学习残差F(x)H(x)-x当残差趋于0时网络退化为恒等映射深层结构至少不会比浅层差梯度也可以跳过中间层直达浅层。提示退化问题和过拟合表现不同。过拟合是训练误差低、测试误差高退化是训练误差和测试误差一起升高。看到“网络变深反而变差”时优先查有没有shortcut机制而不是急着加Dropout。2.2 残差学习单元的两种形态与101层结构ResNet的残差单元按网络深度有两种设计。较浅网络用两层结构两个3×3卷积直接串联结构简单、参数量小。较深网络改用三层bottleneck结构先用1×1卷积把通道数压低再经过3×3卷积最后用1×1卷积把通道数恢复甚至升高。论文中空间流采用101层ResNet全部使用三层残差单元这是深层网络控制计算量的标准做法。101层ResNet的结构可以按Stage拆解论文中的流水线关键参数整理如下网络层残差单元数内部通道配置输出尺寸conv1-7×7, 64通道, 步长2112×112max pool-3×3, 步长256×56res2364→64→25656×56res34128→128→51228×28res423256→256→102414×14res53512→512→20487×7avg pool fc-softmax1×1表中的“内部通道配置”对应bottleneck的三个卷积降维、3×3卷积、升维。res4有23个残差单元是整网最深的部分承担了绝大部分语义抽象。最终经过平均池化和全连接层用Softmax输出每个动作类别的概率。bottleneck单元的计算逻辑用伪代码可以这样表达def bottleneck(x, in_ch, mid_ch, out_ch, stride1): # 1x1 卷积降维压缩 3x3 卷积的输入通道 y conv_bn_relu(x, mid_ch, 1, stridestride) # 3x3 卷积提取空间特征通道数保持不变 y conv_bn_relu(y, mid_ch, 3, stride1) # 1x1 卷积升维得到本阶段输出通道数 y conv_bn(y, out_ch, 1, stride1) # 维度不一致时shortcut 路径上用 1x1 卷积做线性映射 if in_ch ! out_ch or stride ! 1: x conv_bn(x, out_ch, 1, stridestride) return relu(y x)参数in_ch、mid_ch、out_ch对应表格中Stage的输入通道、瓶颈通道和输出通道。当特征图尺寸变化stride2或通道数变化时x必须经过1×1卷积调整形状否则y和x形状不一致无法相加。注意shortcut路径上的卷积不接ReLU只做线性映射加BN这是ResNet原论文的实现要点。2.3 时间流保留BN-Inception的原因空间流换成了ResNet时间流没有跟着换而是继续用BN-Inception。原因有两层。第一时间网络的输入是光流场堆叠输入通道数远高于RGB图像的3通道。典型配置下堆叠L组光流的x和y分量输入通道数是2L。光流信息本身噪声较大网络前几层更多在做运动模式的局部匹配不需要像空间流那样追求极深的语义层次。第二BN-Inception的批归一化在训练稳定性上有优势。论文中时间网络的初始学习率设为0.005是空间网络的5倍能承受这么大的学习率靠的就是BN层对每层激活值分布的归一化。2.4 光流输入与时间网络的结构对应时间网络输入的是连续帧之间堆叠的光流位移场。光流描述了每个像素从上一帧到下一帧的水平位移dx和垂直位移dy本质上是在显式表达运动。论文中光流场按通道堆叠后送入BN-Inception网络从底层开始学习运动模式的组合。空间网络和时间网络虽然结构不同但都输出每个动作类别的得分只是在信息源上做了分工。2.5 稀疏采样3段视频与分段共识函数如果对视频每一帧都推理计算量无法接受。论文的做法是将视频按时间均匀划分成3段每段随机采样一个序列短片段包含一帧图像和对应的光流序列。每个短片段单独送入网络得到分类得分3个得分通过分段共识函数合成视频级预测。论文中的分段共识函数采用平均形式即3个片段的得分取均值。稀疏采样的核心思想是行为动作的时间结构通常在秒级尺度采样3个有代表性的瞬间足以覆盖动作的起承转合不需要逐帧枚举。采样逻辑可以这样实现import random def sparse_sample(video_len, num_segments3): # video_len: 视频总帧数 # num_segments: 论文设为 3对应分段共识函数中的片段数 seg_size video_len // num_segments indices [] for seg in range(num_segments): # 每段内随机取一个起点避免采样到动作边界 start random.randint(seg * seg_size, (seg 1) * seg_size - 1) indices.append(start) return indices参数说明seg_size是每段的帧数区间random.randint保证每段内的采样位置随机。同一个视频在多次训练迭代中采样到的片段不同实际上形成了一种时间维度上的数据增强。推理阶段可以固定取每段中点减少随机性带来的波动。3. 光流预处理、交叉模态预训练与双流训练实现3.1 光流提取与输入张量的组织实现时第一步是从原始视频中提取光流。常见做法有两种OpenCV自带的Farneback稠密光流以及TV-L1变分光流。Farneback速度快、参数好调适合快速验证TV-L1对运动边界的保持更好但计算速度慢。论文实验环境是Ubuntu 16.04加GTX Titan X数据预处理在CPU上做工程上Farneback是更常用的起点。光流提取后需要按照时间网络要求的通道数组织张量。论文输入尺寸为256×340训练时再从{168,192,224,256}中随机选择裁剪区域最终调整成224×224。对光流序列常见做法是取连续10帧计算9组光流将每组光流的dx和dy按通道堆叠得到18通道输入。输入通道数直接对应网络第一层卷积的输入维度。提取并堆叠光流的示例import cv2 import numpy as np def extract_flow_stack(prev, frames, max_flow20): # prev: 起始帧灰度图, frames: 后续帧列表 # 返回堆叠后的光流张量, 通道数 2 * len(frames) flows [] cur prev for f in frames: # 逐对计算光流 g cv2.cvtColor(f, cv2.COLOR_BGR2GRAY) flow cv2.calcOpticalFlowFarneback( cur, g, None, 0.5, 3, 15, 3, 5, 1.2, 0) # 将 dx, dy 分别裁剪到 [-max_flow, max_flow] flows.append(np.clip(flow[..., 0], -max_flow, max_flow)) flows.append(np.clip(flow[..., 1], -max_flow, max_flow)) cur g return np.stack(flows, axis-1) # (H, W, 2*N)参数说明calcOpticalFlowFarneback的9个参数依次是金字塔尺度比例0.5、金字塔层数3、窗口大小15、迭代次数3、邻域大小5、高斯标准差1.2和flags。这些参数在视频分辨率256×340附近表现稳定分辨率更高时建议把窗口适当加大到21。裁剪到±20像素是为了后续线性变换到[0,255]时不被个别离群光流点拉偏分布。3.2 把光流塞进ImageNet预训练网络交叉模态预训练行为识别数据集规模有限UCF-101共13320个视频片段、101类HMDB-51只有6766个片段、51类。拿这样的数据量从头训练101层ResNet必然过拟合。空间网络直接用ImageNet预训练权值初始化输入是RGB帧不存在模态差异。时间网络的情况特殊光流的第一层输入通道数是2L与ImageNet预训练模型的3通道RGB不一致。论文采用交叉模态预训练先用线性变换把浮点光流场映射到[0,255]然后用RGB预训练权值初始化光流分支的第一层卷积。具体做法常见有两种。第一种是权重复制把预训练模型的RGB三通道权值在通道方向求平均得到单通道模板再复制2L份填满光流的输入通道。第二种是把3个通道的权值直接拼接到2L通道上多出来的通道用较小的随机值初始化。第一种更常用因为保留了预训练模型学到的边缘和纹理滤波器后续微调只需要适应光流特有的运动模式。def replicate_rgb_weight(pretrained_weight, num_flow_ch): # pretrained_weight: 预训练第一层卷积权重 (3, 3, k, k) # num_flow_ch: 光流输入通道数例如 18 或 20 # 对 RGB 通道求平均压缩成单通道模板 single pretrained_weight.mean(axis0, keepdimsTrue) # 复制输出通道覆盖光流堆叠的每个输入通道 new_weight np.repeat(single, num_flow_ch, axis0) return new_weight这段代码的语义是把(3, 3, k, k)的RGB权重压缩成(1, 3, k, k)再复制num_flow_ch次。mean加keepdimsTrue才能保留通道维度。复制后得到的权重对所有光流输入通道共享同一套滤波器初始化训练早期会快速分化实际收敛速度比随机初始化快很多。3.3 训练超参数配置与Caffe Solver配置论文实验基于Caffe框架使用SGD优化。两个数据集、两个网络的超参数不同整理成表数据集网络批量大小初始学习率学习率调度最大迭代UCF-101空间ResNet80.001每1000次×0.83500UCF-101时间BN-Inception320.00512000/18000次×0.120000HMDB-51空间ResNet80.001每1000次×0.82500HMDB-51时间BN-Inception320.0054000/6000次×0.17000时间网络学习率是空间的5倍批量也更大。原因在于光流输入的单样本计算量小于深度ResNet更大的batch可以让BN统计量更稳定支撑更大的学习率。对应的Caffe solver配置UCF-101空间网络是经典step策略net: resnet_101_ucf101_train.prototxt type: SGD base_lr: 0.001 momentum: 0.9 weight_decay: 0.0005 lr_policy: step stepsize: 1000 gamma: 0.8 max_iter: 3500 solver_mode: GPU时间网络使用multistep策略在两个迭代点各降低10倍学习率net: bn_inception_ucf101_flow_train.prototxt type: SGD base_lr: 0.005 momentum: 0.9 weight_decay: 0.0005 lr_policy: multistep stepvalue: 12000 stepvalue: 18000 gamma: 0.1 max_iter: 20000 solver_mode: GPU配置说明momentum和weight_decay是Caffe SGD的标准默认值stepsize1000配合gamma0.8表示每1000次迭代学习率乘以0.8是较温和的衰减曲线。multistep在指定迭代点一次性缩小10倍衰减更剧烈适合训练中后期快速收敛。3.4 数据增强尺度抖动与水平翻转论文使用两种数据增强尺度抖动和多尺度裁剪。输入图像或光流场固定为256×340训练时从{168,192,224,256}中随机选择裁剪区的高度和宽度裁剪后调整为224×224。这个策略的直观效果是模拟目标在不同距离和尺度下的表现让空间网络对动作主体的尺度变化不敏感。水平翻转是行为识别里为数不多可以安全使用的翻转方式。垂直翻转会把站立动作变成倒立破坏动作语义论文没有使用。测试阶段不做随机裁剪直接取固定中心区域。4. 得分融合策略、实验对比与计算成本控制4.1 Softmax得分平均融合空间网络和时间网络各自独立训练测试时分别对视频片段输出行为类别的Softmax概率。两个网络看到的信息不同空间网络看到静态帧时间网络看到光流运动。融合时最常见的做法是对两路得分做加权平均论文实验取的是等权平均即两路权重各0.5。表1说明中也明确是通过取空间网络和时间网络识别准确率的平均值来评估融合性能。融合脚本用Python几行就能完成import numpy as np def fuse_and_predict(spatial_scores, temporal_scores): # spatial_scores: (N, C) 空间网络 Softmax 输出 # temporal_scores: (N, C) 时间网络 Softmax 输出 # N: 视频片段数, C: 行为类别数UCF-101 为 101, HMDB-51 为 51 fused (spatial_scores temporal_scores) / 2.0 predictions np.argmax(fused, axis1) return fused, predictions参数说明输入必须先经过Softmax得到概率分布而不是直接对网络末层的logits做平均。两个网络的输出尺度不同ResNet的logits分布与BN-Inception的分布未必对齐直接在logits上平均会让数值更大的网络主导结果。等权平均不是唯一选择如果想进一步调优可以在验证集上网格搜索融合权重但论文实验显示等权平均已经足够稳定。4.2 与iDTs、C3D、TSN等方法的对比论文在UCF-101和HMDB-51上报告了3个分割方案的平均准确率。对比方法覆盖了传统手工特征和主流深度学习方法识别方法UCF-101HMDB-51iDTs85.957.2MIFS88.563.8C3D85.2-LTC91.764.8AdaScan93.266.9TSN94.269.4ResNetBN-Inception双流94.570.1注意C3D在HMDB-51上的准确率论文原表为空。对比能看出几个趋势传统手工特征iDTs在UCF-101上明显低于深度方法说明深度学习对行为特征的表征能力更强C3D用3D卷积直接建模时空UCF-101只有85.2%低于双流TSN的94.2%说明在数据量有限时分开建模空间和时间再融合比端到端3D卷积更容易训练。论文方法在UCF-101上比TSN高0.3个百分点HMDB-51高0.7个百分点。HMDB-51上的提升更明显说明ResNet替换TSN的空间主干后对复杂背景下的外观语义提取更有效——HMDB-51的视频大多来自真实电影场景背景杂、视角多对外观特征的鲁棒性要求更高。4.3 3D卷积层上的轨迹提取实验论文在实验过程中尝试过在多个3D卷积层提取运动轨迹期望捕获更丰富的运动信息。但实验发现最终识别效果没有明显提升反而增加了计算成本最终只在第一个3D卷积层提取运动轨迹。这个结果在工程上很有价值。深层卷积特征语义抽象程度高但空间分辨率低逐层做轨迹匹配的代价高、收益小。行为识别里运动信息本质上是一种中低层线索底层光流和浅层特征已经能表达“手臂挥动”“身体移动”这类基本运动高层特征再做轨迹匹配属于重复劳动。提示如果在自己设计的双流或3D网络里尝试多尺度运动建模先用可视化工具确认深层特征是否真的包含额外的运动信息再决定是否增加相应的计算模块避免无效计算。4.4 双流互补的类别分析论文对识别结果做了逐类分析发现两个网络的错误模式高度互补。UCF-101里的击剑动作在时间网络上识别准确率很低因为击剑移动幅度小、光流信号弱但空间网络能充分借助外观信息——击剑服、剑的形态、对峙姿势——获得很好的识别结果。反过来FrontCrawl、HandstandWalking、Highjump这类动作空间网络容易混淆因为静态帧里看不出运动趋势但时间网络借助光流提取的运动信息能准确建模动作过程。这类互补关系解释了为什么等权平均融合能稳定涨点当某个动作在一个网络上得分低时另一个网络通常有较高的正确得分平均后的排名仍然靠前。这也是双流架构在行为识别中长期占据主流地位的原因。5. 光流输入规范、三分割验证与显存占用控制5.1 光流线性变换的输入规范交叉模态预训练的前提是光流输入和RGB图像处于同一数值区间。RGB图像输入网络前归一化到[0,255]浮点光流的量纲是像素位移位移量可能从0到几十不等。论文的做法是先用线性变换把流场映射到[0,255]再送入时间网络。实践上常用的线性变换实现是裁剪加归一化先设定一个最大位移阈值把超出阈值的位移截断然后线性映射到[0,255]。阈值的选择会直接影响识别效果——阈值太大小幅度运动的细节被压缩阈值太小大幅度运动被截断后损失信息。在UCF-101这类运动幅度较大的数据集上阈值取20像素是常见的起点具体数据集上建议在验证集上做一次小网格搜索。5.2 三分割方案验证报告平均值比单次结果可信UCF-101和HMDB-51各自提供了3个官方训练/测试划分。论文在这3个划分上都做了实验报告平均准确率。这是行为识别论文的标准做法但复现时经常被忽略。单次划分的准确率受随机性影响较大数据集只有一万多个视频片段时训练/测试分布稍有不同结果可能波动1到2个百分点。3个划分的平均值能更真实地反映方法的泛化能力。复现时建议把3个划分的训练都跑一遍对比表1中的分方案结果空间网络在UCF-101上3个方案的准确率分别是85.0、85.7、85.5时间网络是87.6、90.2、91.3。如果单方案结果和这些数字差距超过2个百分点优先检查数据预处理的分割方式是否正确。5.3 显存占用控制双流分开训练、推理时再融合ResNet-101空间网络的单卡显存占用在12GB的GTX Titan X上批量大小设为8已经接近上限。如果显存不足优先降低batch而不是减少输入分辨率因为输入尺寸从224×224降到192×192会损失外观细节对空间网络的精度影响更直接。双流网络实际训练时先训练空间网络再训练时间网络两者完全独立不是联合训练。推理时再把两个模型的预测结果加载到内存中融合。这意味着显存不够时可以先后加载两个模型分别推理保存各自的Softmax输出到磁盘最后用融合脚本合并避开同时加载两个模型的显存压力。监控训练曲线时重点看时间网络的loss是否在12000次迭代后明显下降那是multistep学习率衰减生效的标志如果衰减点之后loss没有变化说明学习率衰减过猛可以把gamma从0.1放宽到0.2再试。本文还有配套的精品资源点击获取