1. 环境准备:从零搭建TimeSformer训练基地

第一次接触TimeSformer代码时,我盯着满屏的依赖项和配置文件直发懵。后来发现,环境搭建就像盖房子,地基打稳了后面才不容易塌。这里分享我反复测试过的环境配置方案,帮你避开90%的坑。

1.1 虚拟环境搭建

用conda创建独立环境是避免依赖冲突的关键。实测Python 3.7最稳定,3.8以上版本可能会遇到奇怪的包兼容问题:

conda create -n TimeSformer python=3.7 -y
conda activate TimeSformer

安装PyTorch时要特别注意版本匹配。官方推荐1.9.0,但经过测试1.9.1更稳定。千万别直接pip install torch,这样会装最新版导致后续报错:

pip install torch==1.9.1+cu111 torchvision==0.10.1+cu111 -f https://download.pytorch.org/whl/torch_stable.html

1.2 核心依赖安装

官方requirements.txt往往不够全面,这是我整理的增强版安装清单:

# 基础视觉处理包
pip install opencv-python pillow matplotlib

# 视频处理三件套
conda install av -c conda-forge
pip install decord moviepy

# 模型训练必备
pip install fvcore simplejson einops timm psutil scikit-learn tensorboard

# 特别提醒:安装pyav时如果报错,先运行
conda install -c conda-forge ffmpeg

遇到过最坑的是fvcore安装问题。如果直接pip install失败,可以改用源码安装:

git clone https://github.com/facebookresearch/fvcore
cd fvcore
pip install -e .

2. 数据集处理:让模型学会"看视频"

刚开始用Kinetics-400数据集时,135G的下载量让我电脑抗议了三天。后来发现用UCF101或自制小数据集调试更高效,等模型跑通再上大规模数据。

2.1 小型数据集准备

推荐先用UCF50试水,它的101个动作类别足够验证模型有效性。处理数据集时有几个关键点:

  1. 视频文件命名不能有中文或特殊字符
  2. 确保所有视频能被ffmpeg正常解码
  3. 建议统一转为MP4格式,分辨率不低于224x224

这个Python脚本可以自动完成视频格式检查和转换:

import os
import subprocess
from tqdm import tqdm

def check_videos(folder):
    broken_files = []
    for root, _, files in os.walk(folder):
        for file in tqdm(files):
            if file.endswith(('.avi', '.mp4', '.mov')):
                path = os.path.join(root, file)
                try:
                    subprocess.run(
                        ["ffprobe", "-v", "error", path],
                        check=True,
                        stderr=subprocess.PIPE
                    )
                except:
                    broken_files.append(path)
    return broken_files

2.2 数据集目录结构

TimeSformer要求特定的目录格式,这里分享一个自动生成结构的脚本:

import os
import csv
from sklearn.model_selection import train_test_split

def prepare_ucf_dataset(input_dir, output_dir):
    # 创建标准目录
    splits = ['train', 'val', 'test']
    for split in splits:
        os.makedirs(os.path.join(output_dir, split), exist_ok=True)
    
    # 生成CSV标签文件
    with open(os.path.join(output_dir, 'labels.csv'), 'w') as f:
        writer = csv.writer(f)
        for label in sorted(os.listdir(input_dir)):
            writer.writerow([label, len(os.listdir(os.path.join(input_dir, label)))])
    
    # 分割数据集
    for class_name in os.listdir(input_dir):
        videos = [os.path.join(class_name, v) for v in os.listdir(os.path.join(input_dir, class_name))]
        train, test = train_test_split(videos, test_size=0.2)
        train, val = train_test_split(train, test_size=0.25)
        
        for split, videos in zip(splits, [train, val, test]):
            with open(os.path.join(output_dir, f'{split}.csv'), 'a') as f:
                for video in videos:
                    f.write(f"{video},{class_name}\n")

3. 参数调优:模型性能的关键杠杆

第一次跑TimeSformer时,默认参数让我的GPU直接OOM。经过多次实验,总结出这些黄金配置:

3.1 内存优化参数

在configs/Kinetics/TimeSformer_divST_8x32_224.yaml中,这些参数最影响显存:

DATA:
  NUM_FRAMES: 8  # 减少帧数可大幅降低显存
  SAMPLING_RATE: 32  # 采样间隔越大显存需求越小
  TRAIN_CROP_SIZE: 224  # 分辨率降低到160可节省30%显存

MODEL:
  DROPOUT_RATE: 0.3  # 小数据集建议调低防过拟合

注意:NUM_FRAMES和SAMPLING_RATE需要配合调整。建议先用NUM_FRAMES=4,SAMPLING_RATE=64测试

3.2 学习率策略

小数据集训练容易震荡,这个warmup策略更稳定:

SOLVER:
  BASE_LR: 0.001  # 初始学习率
  WARMUP_EPOCHS: 5  # 渐进式热身
  LR_POLICY: cosine  # 余弦退火
  MAX_EPOCH: 30  # 小数据集需要更多epoch

实测发现,当验证集准确率连续3个epoch不提升时,手动将学习率减半效果比自动调度更好。

4. 实战训练:从报错到收敛的完整过程

第一次运行python tools/run_net.py时,我遇到了5种不同的报错。下面是最常见的三种解决方案:

4.1 路径配置陷阱

配置文件中所有路径都要用绝对路径,且注意:

  1. Windows路径要把\改成/或\
  2. CSV文件路径要精确到文件名
  3. 输出目录要有写入权限
DATA:
  PATH_TO_DATA_DIR: "/home/user/TimeSformer/data/ucf101/csv/"  # 最后要有/
  PATH_PREFIX: "/home/user/TimeSformer/data/ucf101/videos/" 

OUTPUT_DIR: "./output/experiment_1"  # 每次实验换新目录

4.2 多GPU训练技巧

当使用多卡时,需要修改两个地方:

# 启动命令前加
export CUDA_VISIBLE_DEVICES=0,1  # 指定使用的GPU
python -m torch.distributed.launch --nproc_per_node=2 tools/run_net.py

然后在配置文件中设置:

NUM_GPUS: 2
SOLVER:
  BATCH_SIZE: 8  # 每卡batch_size=4

4.3 训练过程监控

推荐使用tensorboard和wandb结合监控:

tensorboard --logdir=output/ --port=6006

在config中添加wandb配置:

WANDB:
  ENABLE: True
  PROJECT: "timesformer_exp"
  ENTITY: "your_team"

训练初期要特别关注这两个指标:

  1. train_loss是否稳定下降
  2. val_acc是否随训练提升 如果出现明显背离,可能是过拟合或学习率设置不当
Logo

邀请您加入社区

更多推荐