PySlowFast
踩了无数个PySlowFast安装和使用的坑🙃,整理了一下希望能帮到同在泥泞中的小伙伴
安装步骤 (建议先浏览一遍)
- 创建conda环境
- conda create -n slowfast python=3.8
- conda activate slowfast
- 安装pytorch
conda install pytorch==1.13.0 torchvision==0.14.0 torchaudio==0.13.0 pytorch-cuda=11.7 -c pytorch -c nvidia
- clone
PySlowFast
仓库- git clone https://github.com/facebookresearch/slowfast
- 方式1-编译安装:
- cd slowfast
- python setup.py build develop
- 方式2-设置环境变量(推荐):
- export PYTHONPATH=/path/to/SlowFast/slowfast:$PYTHONPATH
- 安装fvcore
- pip install -U ‘git+https://github.com/facebookresearch/fvcore.git’
- 安装pyav(这个命令包含很多包,比较重要的是pyav,用来解码视频。PyAV提供了ffmpeg的python接口:使用ffmpeg做后端,使用Cython封装了ffmpeg的接口,所以调用pyav起作用的是ffmpeg)
- pip install simplejson av psutil opencv-python tensorboard==2.10.1 moviepy scipy scikit-learn
- 安装torchvideo
- 方式1-编译安装:
- git clone https://github.com/facebookresearch/pytorchvideo.git
- cd pytorchvideo
- pip install -e .
- cd …
- 方式2-设置环境变量(推荐):
- export PYTHONPATH=/path/to/pytorchvideo:$PYTHONPATH
- 方式1-编译安装:
- 安装fairscale
- pip install ‘git+https://github.com/facebookresearch/fairscale’
- 安装cython
- pip install -U cython
- 安装iopath
- conda install -c iopath iopath
- clone detectron2 (经常会遇到gcc版本不匹配的问题,需要手动更新gcc,有很多相关的博客可以参考)
- git clone https://github.com/facebookresearch/detectron2 detectron2_repo
- 方式1-编译安装:
- pip install -e detectron2_repo
- 方式2-不编译,设置环境变量(推荐):
- export PYTHONPATH=/path/to/detectron2_repo:$PYTHONPATH
- 方式3-按照官方对应pytorch版本的命令安装(限制比较明显):
- https://github.com/facebookresearch/detectron2/blob/main/INSTALL.md
- 安装ffmpeg (使用torchvision作为解码视频的后端时,不一致的ffmeg可能会导致报错)
- conda install ffmpeg==4.2 (or will result bug when decoding videos with torchvision as backend)
- Note:
- 实际上
SlowFast
,Detectron2
,pytorchvideo
这三个需要clone
+build
的安装方式,都可以用设置环境变量来解决,也就是 - export PYTHONPATH=/path/to/repository_name:$PYTHONPATH
- 可以打印$PYTHONPATH查看是否设置成功
$ echo $PYTHONPATH $ /home/STAL_docker/detectron2:/home/STAL_docker/pytorchvideo:
- 觉得每次开一个bash都要重新设置很麻烦,可以直接写在.bashrc里
- 实际上
安装报错
- AttributeError: module ‘distutils’ has no attribute ‘version’
- 原因: 当前tensorboard的版本和安装的pytorch版本不匹配
- 解决:降级版本
- pip uninstall setuptools
- pip install setuptools==59.5.0
- ImportError: cannot import name ‘cat_all_gather’ from ‘pytorchvideo.layers.distributed’
- 原因:这个报错时因为直接pip install pytorchvideo,这种安装有点点问题,官方issue提供了两种可替换的安装方案 (NOTE: )
- https://github.com/facebookresearch/SlowFast/issues/636
- 太多不看版:第一部分的安装指引就是参考该链接,也是我尝试过work的方式
运行报错
-
No such operator video_reader::probe_video_from_memory
- 原因:ffmpeg的版本和torchvision不匹配,需要设置为4.0
- 解决1:改一下ffmpeg的版本
- 解决2(推荐):config里将解码视频的后端改为pyav, 即
DECODING_BACKEND pyav
- 资料来源:https://github.com/facebookresearch/SlowFast/issues/181
-
pyav with exception: unsupported operand type(s) for -: ‘list’ and ‘int’
- 原因:SlowFast在支持无监督训练的时候,num_frames类别变为了list,torchvision的代码更新了,但是pyav的代码没更新
- 解决:参考dfan大神的fork, https://github.com/dfan/SlowFast/blob/main/slowfast/datasets/decoder.py, 直接替换原本的decoder.py文件内容
- 资料来源:https://github.com/facebookresearch/SlowFast/issues/181
-
unicodedecodeerror utf-8 codec can’t decode byte 0xd4 in position 1: invalid continuation byte
- 原因:PySlowFast预训练的ckpt有一部分是caffe2(官方config在c2目录下的模型)
- 解决:加载ckpt的时候需要设置参数,即
CHECKPOINT_TYPE caffe2
-
AVA数据集
- 一个小坑,下载AVA的注解的时候,应该下载数据准备部分最后一行的链接,只有这个链接里有
person_detection
等文件- You could also replace the v2.1 by v2.2 if you need the AVA v2.2 annotation. You can also download some pre-prepared annotations from
here
.
- You could also replace the v2.1 by v2.2 if you need the AVA v2.2 annotation. You can also download some pre-prepared annotations from
- ‘int’ object is not subscriptable
- 原因:下载错了官方提供的ckpt
- 解决:
- AVA数据集官方提供了两个ckpt,一个是
Pretrain Model
,另一个是model
。前者是在K400/600上预训练的,后者是在AVA上再次训练的,需要根据自己实际使用目的下载不同的ckpt。 - 比较坑的是两个ckpt文件时同名的
- AVA数据集官方提供了两个ckpt,一个是
- The size of tensor a (400) must match the size of tensor b (80) at non-singleton dimension 0
- 原因:这是因为在load pre-trained ckpt的时候把它的optimizer和scheduler也一并加载了。这导致在AVA上训练的时候类别数目不匹配
- 解决:在
utils/checkpoing.py
中,把lines 555-560注释掉就可以了,不需要当前的optimizer加载预训练的信息 - 资料来源:https://github.com/facebookresearch/maskrcnn-benchmark/issues/317
- Trying to pause a Timer that is already paused!
- 原因:test_net.py的代码存在缩进问题,导致
test_meter.iter_toc()
记录了两遍 - 解决:
- 把lines 121-136缩进到else:
- 然后copy这段代码到elif:
- 原因:test_net.py的代码存在缩进问题,导致
- RuntimeError: Tensors must be CUDA and dense
- 原因:和上一个报错的原因一致,缩进问题导致变量已经被送至cpu,但是记录的时候需要在gpu上
- 解决:和上一个问题一样
- 资料来源:https://github.com/facebookresearch/SlowFast/issues/549
- 一个小坑,下载AVA的注解的时候,应该下载数据准备部分最后一行的链接,只有这个链接里有