TSN(Temporal Segment Networks)代码实验

本文详细介绍Temporal Segment Networks (TSN),一种用于视频行为识别的技术,在ECCV2016上提出。文中分享了TSN的配置步骤、常见问题解决办法,并报告了在UCF101数据集上的实验结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言:Temporal Segment Networks (TSN)是在 ECCV 2016 上提出的,作者是Limin Wang, Yuanjun Xiong, Zhe Wang, Yu Qiao, Dahua Lin, Xiaoou Tang, and Luc Van Gool,是一个用于视频中人的行为识别的框架。论文中数据集表现:HMDB51(69.4%)、UCF101(94.2%),在 AcitivityNet challenge 2016 “untrimmed video classification”项目上取得了第一名。

TSN 项目主页:http://yjxiong.me/others/tsn/
TSN 代码 & 模型:https://github.com/yjxiong/temporal-segment-networks


配置问题及解决方案

  1. 运行 build_all.sh 文件,首先输出报错“E: Unable to correct problems, you have held broken packages”
    解决方案:

    apt-get upgrade
    apt-get update

    参考自:解决 E: Unable to correct problems, you have held broken packages. 问题 - Wasdns - 博客园

  2. 运行 build_all.sh 文件编译 caffe 时出现“This file was generated by a newer version of protoc which is incompatible with your Protocol Buffer headers. Please update your headers. fatal error: google/protobuf/arena.h: 没有那个文件或目录”
    解决方案:
    降低 protobuf 版本到 2.6.1,若计算机中有高版本,需要先卸载,再手动安装:

    wget https://github.com/google/protobuf/releases/download/v2.6.1/protobuf-2.6.1.tar.gz --no-check-certificate #下载
    tar -zxvf protobuf-2.6.1.tar.gz # 解压
    sudo apt-get install build-essential # 不装会报错
    cd protobuf-2.6.1/ # 进入目录
    ./configure # 配置安装文件
    make # 编译
    make check # 检测编译安装的环境
    sudo make install # 安装
    protoc --version #检查是否安装成功

    参考自:
    Ubuntu14.04下安装protobuf 2.6.1 - CSDN博客
    编译pycaffe错误 –#error This file was generated by a newer version of protoc - CSDN博客

  3. 测试时遇到:“ImportError: No module named _caffe”,但之前运行 build_all.sh 文件已经提示“Caffe Built.”
    解决方案:
    build caffe 时需要 boost version ≥ 1.55,但对于一些 Ubuntu 环境,需要先卸载 libboost-all-dev:

    sudo apt-get remove libboost-all-dev

    再安装 libboost1.55-all-dev:

    sudo apt-get install libboost1.55-all-dev

    参考自:
    No module named _caffe · Issue #66 · yjxiong/temporal-segment-networks

  4. 测试时遇到:“ImportError: No module named google.protobuf.internal”
    解决方案:
    由于计算机中含有多个 Python 环境,可能出现运行时环境未装 protobuf 的情况,故需要确保运行环境下已安装好 protobuf 2.6.1

    pip install protobuf==2.6.1

    参考自:
    python - Importing caffe results in ImportError: “No module named google.protobuf.internal” (import enum_type_wrapper) - Stack Overflow

  5. 测试时遇到:“KeyError: ‘v_ApplyEyeMakeup_g01_c01’”
    解决方案:
    检查测试语句中 FRAME_PATH 路径
    参考自:
    Get a Key error when testing accuracy on UCF101 · Issue #102 · yjxiong/temporal-segment-networks

实验结果

在UCF101数据集split1上对TSN进行测试。

仅RGB图像

运行命令:

python tools/eval_net.py ucf101 1 rgb output/optical_flow/ models/ucf101/tsn_bn_inception_rgb_deploy.prototxt models/ucf101_split_1_tsn_rgb_reference_bn_inception.caffemodel --num_worker 1 --save_scores output/score_file.txt

结果:86.02%


仅RGB结果

仅光流

运行命令:

python tools/eval_net.py ucf101 1 flow output/optical_flow/ models/ucf101/tsn_bn_inception_flow_deploy.prototxt models/ucf101_split_1_tsn_flow_reference_bn_inception.caffemodel --num_worker 1 --save_scores output/flow_score_file

结果:87.66%


仅optical flow结果

融合RGB和光流结果

运行命令:

python tools/eval_scores.py output/rgb_score_file.npz output/flow_score_file.npz --score_weights 1 1.5

结果:93.51%


融合RGB和光流结果

### Temporal Segment Network (TSN) 的概念 Temporal Segment Network 是一种用于视频分析的深度学习框架,旨在通过时间片段建模来捕捉视频中的动态信息。该模型的核心思想是将整个视频划分为多个时间段,并分别提取这些时间段内的特征[^1]。 TSN 主要由三个部分组成: 1. **Segment Sampling**: 将输入视频均匀分割成若干个片段(segments)。这种采样方式有助于减少计算复杂度并提高效率。 2. **Consensus Function**: 对不同片段的预测结果进行聚合操作,通常采用平均池化或最大池化等方式。 3. **Convolutional Neural Networks (CNNs)**: 使用预训练好的 CNN 提取每一段图像帧的空间特征。 这种方法能够有效处理大规模视频分类任务,在保持较高精度的同时降低资源消耗。 ### 实现方法 以下是基于 PyTorch 的 TSN 基本实现: ```python import torch from torchvision import models, transforms from PIL import Image class TSN(torch.nn.Module): def __init__(self, num_classes=101, num_segments=3, base_model='resnet50'): super(TSN, self).__init__() self.num_segments = num_segments # 加载基础模型 if base_model == 'resnet50': self.base_model = models.resnet50(pretrained=True) feature_dim = self.base_model.fc.in_features self.base_model.fc = torch.nn.Identity() # 移除全连接层 self.consensus_func = torch.mean # 可替换为其他共识函数如 max pooling # 添加新的分类头 self.classifier = torch.nn.Linear(feature_dim, num_classes) def forward(self, x): batch_size, segments, channels, height, width = x.size() # 展平批次和片段维度以便送入网络 x = x.view(batch_size * segments, channels, height, width) features = self.base_model(x) # 获取空间特征 # 还原形状并将片段特征沿时间轴堆叠 features = features.view(batch_size, segments, -1).transpose(1, 2) # 应用共识函数 output = self.consensus_func(features, dim=-1) # 分类器 result = self.classifier(output) return result # 初始化模型实例 model = TSN(num_classes=101, num_segments=3, base_model='resnet50') print(model) ``` 上述代码定义了一个简单的 TSN 架构,其中 `num_segments` 表示视频被划分的时间段数量,而 `base_model` 则指定了用来提取空间特征的基础卷积神经网络。 ### 数据增强与预处理 为了提升性能,可以引入特定的数据增强技术以及标准化流程。例如,使用随机裁剪、翻转等手段增加样本多样性;同时利用均值减法和归一化确保数值范围一致。 ```python data_transforms = { 'train': transforms.Compose([ transforms.RandomResizedCrop(224), transforms.RandomHorizontalFlip(), transforms.ToTensor(), transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225]) ]), 'val': transforms.Compose([ transforms.Resize(256), transforms.CenterCrop(224), transforms.ToTensor(), transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225]) ]) } ``` 此部分展示了如何构建适合 TSN 输入的数据管道,包括训练集和验证集中不同的转换策略。 ---
评论 52
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值