TimeSformer实战:从零搭建视频理解模型训练环境
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个动作类别足够验证模型有效性。处理数据集时有几个关键点:
- 视频文件命名不能有中文或特殊字符
- 确保所有视频能被ffmpeg正常解码
- 建议统一转为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 路径配置陷阱
配置文件中所有路径都要用绝对路径,且注意:
- Windows路径要把\改成/或\
- CSV文件路径要精确到文件名
- 输出目录要有写入权限
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"
训练初期要特别关注这两个指标:
- train_loss是否稳定下降
- val_acc是否随训练提升 如果出现明显背离,可能是过拟合或学习率设置不当
更多推荐
所有评论(0)