Speed Detect

基于 torchvision R3D-18 的 RGB 视频速度三分类器,输出 slow / normal / fast 分数。仓库包含推理、训练、resume、checkpoint 和一条合成示例视频。

该模型判断的是画面呈现出的运动速度,不是读取播放器倍速,也不输出精确的 0.5x / 2x 倍率。模型来源和限制见 MODEL_CARD.md

仓库内容

3_speed_detect.py                 # 批量推理
3_speed_detect.sh                 # 推理入口
train_rgb_speed3.py               # 训练/验证
train_rgb_speed3_resume.sh        # 训练与resume入口
checkpoints/rgb_speed3_best.pt    # best checkpoint
examples/videos/demo.mp4          # 3秒合成视频
examples/training/                # 单条训练/验证/hard-label示例
environment.yml                   # Conda环境

1. 环境

推荐 Linux、Python 3.10 和 NVIDIA GPU:

cd /mnt/workspace/speed_detect
conda env create -f environment.yml
conda activate speed_detect

锁定版本为 PyTorch 2.4.0、torchvision 0.19.0、CUDA 12.1、NumPy 1.26.0、OpenCV headless 4.11.0.86 和 tqdm 4.67.1。CPU 环境请按 PyTorch 官方安装矩阵将 PyTorch 安装源改为 CPU。

2. 推理

仓库自带一条 smoke-test metadata 和视频:

conda activate speed_detect
sha256sum -c checkpoints/SHA256SUMS
source 3_speed_detect.sh
cat outputs/metadata_speed_detect.jsonl

输出会在原记录中增加:

{"speed_scores":{"slow":0.1,"normal":0.7,"fast":0.2}}

处理真实数据时修改 3_speed_detect.sh

INPUT_METADATA_JSONL="/data/videos/metadata.jsonl"
SPEED_METADATA_JSONL="/data/videos/metadata_speed_detect.jsonl"
OUTPUT_ROOT="/data/videos"
MODEL_CKPT="checkpoints/rgb_speed3_best.pt"

输入 JSONL 最小格式:

{"name":"clip_0001","video_path":"videos/clip_0001.mp4"}

相对 video_pathOUTPUT_ROOT 为根。已有 speed_scores 默认跳过;设 FORCE="1" 可重算。失败记录保存在 ${OUTPUT_ROOT}/speed_detect_logs/

3. 训练

默认训练入口只使用同一个合成视频生成 4 个训练 clip 和 1 个验证 clip,用来检查 decode、forward、backward、optimizer step、评估和保存:

conda activate speed_detect
source train_rgb_speed3_resume.sh
cat outputs/training_smoke/train_log.csv

这是 pipeline smoke test,不是精度评测。首次运行会保存 best/last 两个 checkpoint,合计约 760 MiB;outputs/ 已被忽略。

正式训练时修改:

TRAIN_LIST="/data/speed_train/train.txt"
VAL_LIST="/data/speed_train/val.txt"
HARD_LABELS="/data/speed_train/hard_labels.jsonl"
OUTPUT_DIR="/data/speed_train/outputs"

EPOCHS="30"
SAMPLES_PER_EPOCH="5000"
VAL_SAMPLES="900"
BATCH_SIZE="16"
NUM_WORKERS="2"
HARD_PROB="0.65"

初始化方式:

模式 配置
checkpoint 微调 RESUME_CKPT="checkpoints/rgb_speed3_best.pt"RESUME_OPTIMIZER="0"
完整续训 设置 checkpoint、RESUME_OPTIMIZER="1"EPOCHS 是最终 epoch 编号
Kinetics-400 初始化 RESUME_CKPT=""USE_PRETRAINED="1"
随机初始化 RESUME_CKPT=""USE_PRETRAINED="0"

完整续训会恢复 optimizer/scaler/best/epoch,同时恢复 checkpoint 中的学习率。训练脚本是单卡实现;NUM_WORKERS 建议从 1–2 开始,调试时设为 0

4. 训练数据格式

train.txtval.txt 每行一个视频路径,不需要类别:

/data/source_videos/clip_0001.mp4

训练时在线合成三类速度:

slow:   0.50 / 0.67 / 0.75
normal: 1.00
fast:   1.50 / 2.00 / 2.50

默认配置为 16 FPS、16 帧、112×112。为了覆盖最快的 2.5 rate,重采样后至少需要 40 帧。

可选 hard-label 文件为 JSONL:

{"video_path":"/data/hard/clip.mp4","label":"fast","note":"human confirmed"}

label 只能是 slow / normal / fastHARD_PROB 控制 hard samples 的训练采样概率。仓库只提供一条合成格式示例,不包含原内部训练数据。

训练输出:

rgb_speed3_last.pt
rgb_speed3_best.pt
train_log.csv
hard_eval_best.csv

best 按 (hard_acc, val_acc) 排序。hard labels 可能同时参与训练,因此 hard_acc 不是独立测试指标。

5. 常用参数

推理:

  • WINDOW_STRIDE:时间窗口步长,默认 8
  • BATCH_SIZE:每次 forward 的窗口数,默认 8
  • WORKER_NUM:每张 GPU 的进程数,默认 1
  • SHARD_NUM / SHARD_ID:按样本名稳定分片。
  • MAX_VIDEOS0 表示不限制。
  • DEVICEcudacpu

训练:

  • SAMPLES_PER_EPOCH / VAL_SAMPLES:每轮随机采样数。
  • HARD_PROB:hard-label 采样概率。
  • USE_PRETRAINED:是否使用 Kinetics-400 初始化。
  • RESUME_OPTIMIZER:是否恢复完整训练状态。

6. Checkpoint

文件:checkpoints/rgb_speed3_best.pt
大小:398150602 bytes(约380 MiB)
SHA256:c048c00b6e2ac4d5b23fbf4d4604aa7f79405fd0d907f7d4d939ccd68692aa07
sha256sum -c checkpoints/SHA256SUMS

推理和训练 resume 都使用 torch.load(..., weights_only=True)。checkpoint 通过 Git 托管时需要 Git LFS;通过 Hugging Face、共享盘或 rsync 迁移时无需手动拆分。

Hugging Face:wendell0218/speed_detect

本仓库没有为原内部代码和 checkpoint 新增对外分发许可证;公开再分发前请确认授权范围。

Downloads last month

-

Downloads are not tracked for this model. How to track
Inference Providers NEW
This model isn't deployed by any Inference Provider. 🙋 Ask for provider support