https://arxiv.org/pdf/2102.05095.pdf
官方源码地址
https://github.com/facebookresearch/TimeSformer
视频分析
这个算法的意义类似detr,是ViT开始进入视频行为分析的开端,也是Facebook的作品。
首先我们看下什么是行为识别,对于很多视频视觉分析的学习,就会发现更多的视觉方面的细分,名词也多了很多,除了目标识别,语义分割,还有在视频方面的行为识别,动作识别,还有人重定位,动作定位等,有时可能也会傻傻分不清。
可以从业务和数据技术角度理解
比如我们看一段视频是在打篮球,这可以叫行为,然后动作更细微,比如投篮,运球时动作,当然但是很多时候也可能不那么严格区分,因为目前视频分析都很短,秒级的视频。
目前业务场景主要在短视频和直播上,
从数据看,行为识别就是对时域预先分割好的序列判定其所属行为动作的类型,即“读懂行为”。
其实我们录到的视频本身也是一帧一帧的流输入整合成的,跟设备的输入速度有关,所以可以把视频分为一个个有序的帧格式,这时候,就是图像二维数据加上了时间,所以时三维的,所以也叫3D视觉。
Action Detection
目的:不仅要知道一个动作在视频中是否发生,还需要知道动作发生在视频的哪段时间
特点:需要处理较长的,未分割的视频。且视频通常有较多干扰,目标动作一般只占视频的一小部分。
分类:根据待检测视频是一整段读入的还是逐次读入的,分为online和offline两种
Offline action detection:
特点:一次读入一整段视频,然后在这一整段视频中定位动作发生的时间
Online action detection:
特点:不断读入新的帧,在读入帧的过程中需要尽可能早的发现动作的发生(在动作尚未结束时就检测到)。
同时online action detection 还需要满足实时性要求,这点非常重要。
这导致online action detection不能采用计算复杂度过大的方法(在现有的计算能力下)
现有方法:
逐帧检测法:
即在视频序列的每帧上独立判断动作的类型,可以用CNN等方法,仅用上了spatial的信息
滑窗法: 即设置一个固定的滑窗大小,在视频序列上进行滑窗,然后对滑窗得到的视频小片断利用action recognition的方法进行分类。
现状:由于此问题难度比action recognition高很多,所以现在还没有效果较好的方法
分析方法
那从数据角度我们就可以很好考虑怎么分析了,一个时视觉二维维度,还有个是时间维度,那么从传统最新的transformer都是应用时间序列和图像分析的各种方法。
早期的传统方法可以借鉴dwt等序列规整,将两个视频帧数据进行相似度对比,来进行聚类或是分类,
而基于深度学习的更为有效,因为加入了CNN等提取的特征,可以分为三种思想
1、 two-[stream] (双流)方法
使用以单帧RGB作为输入的CNN来处理空间维度的信息,使用以多帧密度光流场作为输入的CNN来处理时间维度的信息,并通过多任务训练的方法将两个行为分类的数据集联合起来(UCF101与HMDB),去除过拟合进而获得更好效果。
2、C3D是在 two-stream的基础上
最后一个卷积层的ReLU之后将两个网络融合至空域流,并通过3D Conv+3D Pooling转化成时空流,同时不截断时域流,在时域网络上执行3D Pooling。最终两个Loss都用于训练并进行预测。
3、这也是比较好理解的,CNN+LSTM的方法
也是就是在平面二维上来说CNN具有很强的特征过滤提取能力,但是到了3D的情况,我们知道有了时间顺序关联的算法比如RNN和LSTM等更为有效,所以结合二者的方法就显而易见了。
TimeSformer
transformer已经在NLP等序列模式里发挥更好的性能,而这里transformer 优化LSTM也是显然的过程,同时这不仅是优化,更由于ViT的发展,使得可以在增加一个维度下进行了CNN和LSTM的融合,就是所谓的无卷积的方法,也就是这里的TimeSformer
也就是所谓的一种3D的算法, 而且特别的是,在3D上,不用CNN比CNN更为高效,这也是变形金刚技术的发展带来的一个惊喜,因为传统视觉上CNN还是在速度上更有优势。
因为CNN仅在短程模式方面有效,而对于更大的时间依赖的模式就很有限,而且计算量反而是更为大TimesFormer仅建立在transformer模型种使用自注意力机制上,而且计算成本低,
因为
1 将视频分为一组不重叠的patch;
2 采用自注意力,避免对所有的patch对进行详尽的比较,也即是依次应用时间注意力和空间注意力。具体就是高维融合,降维治之,在使用时间注意力的时候,每个patch 只和其他帧中相同空间位置的patch进行比较,在使用空间注意力的时候,每个patch只和同一个帧中的patch比较。而且3DCNN只能处理几秒的视频,而TimeSformer可以处理更长到一分多的视频。
目前有官方源码还有基于mmaction的 和paddlepaddle等的,这里是先使用官方代码,后期验证落地准备使用mmaction的
https://www.icode9.com/content-1-944906.html
数据集
https://www.cnblogs.com/qianchaomoon/p/12324905.html
部署
先使用windows anaconda 部署,以便快速体验,后面再研读论文和代码了
conda create -n timesformer python=3.7 -y
conda activate timesformer
这里继续安装torch ,版本最好要低于1.9 不然会有很多报错
conda install pytorch==1.8.0 torchvision==0.9.0 torchaudio==0.8.0 cudatoolkit=10.2 -c pytorch
接着就按官方安装步骤了
pip install 'git+https://github.com/facebookresearch/fvcore'pip install simplejson einops timm psutil scikit-learn opencv-python tensorboard -i https://pypi.douban.com/simple
conda install av -c conda-forge
安装项目git clone https://github.com/facebookresearch/TimeSformer
cd TimeSformer
python setup.py build develop
测试验证建立data文件夹,这里先使用k400 tiny数据集,
wget https://download.openmmlab.com/mmaction/kinetics400_tiny.zip
将txt的标注文件转为csv格式
import pandas as pd
data = pd.read_csv('kinetics_tiny_train_video.txt',names=['path','class'],sep=' ')
data['path']= "data/kinetics400_tiny/train/"+data['path']
data.to_csv('train.csv',index=False,header=False,sep=' ')
data = pd.read_csv('kinetics_tiny_val_video.txt',names=['path','class'],sep=' ')
data['path']= "data/kinetics400_tiny/val/"+data['path']
data.to_csv('val.csv',index=False,header=False,sep=' ')
data.to_csv('test.csv',index=False,header=False,sep=' ')
使用docker 部署,以便在服务器训练
Dockerfile
FROM pytorch/pytorch:1.8.0-cuda11.1-cudnn8-devel
MAINTAINER yihui8776 <wangyaohui8776@sina.com>
RUN apt-get update
RUN apt-get install -y git openssh-server vim libgl1-mesa-dev
#RUN apt-get clean && \
# apt-get update && \
# rm -rf /var/lib/apt/lists/*
# SSH Server
RUN sed -i 's/^\(PermitRootLogin\).*/\1 yes/g' /etc/ssh/sshd_config && \
sed -i 's/^PermitEmptyPasswords .*/PermitEmptyPasswords yes/g' /etc/ssh/sshd_config && \
echo 'root:ai1234' > /tmp/passwd && \
chpasswd < /tmp/passwd && \
rm -rf /tmp/passwd
RUN pip install jupyter -i https://pypi.doubanio.com/simple
COPY . /workspace
COPY run_jupyter.sh /
RUN chmod +x /run_jupyter.sh
RUN git clone https://github.com/facebookresearch/fvcore && cd fvcore && python setup.py install
RUN pip install -i https://pypi.douban.com/simple matplotlib markupsafe==2.0.1 simplejson einops timm av psutil scikit-learn opencv-python tensorboard
#RUN apt-get install -y libgl1-mesa-dev
WORKDIR /workspace
RUN python setup.py build develop
EXPOSE 22
EXPOSE 8888
CMD ["/run_jupyter.sh", "--allow-root"]
训练测试
训练 python tools/run_net.py --cfg .\configs\Kinetics\TimeSformer_divST_8x32_224.yaml DATA.PATH_TO_DATA_DIR .\data\kinetics400_tiny\
微调
python tools/run_net.py --cfg .\configs\Kinetics\TimeSformer_divST_8x32_224.yaml DATA.PATH_TO_DATA_DIR .\data\kinetics400_tiny\ TRAIN.CHECKPOINT_FILE_PATH .\checkpoints\TimeSformer_divST_8x32_224_K400.pyth TRAIN.FINETUNE True
主要是这模型文件不好下, 用的是dropbox ,最好用客户端同步
推理测试python tools/run_net.py --cfg configs/Kinetics/TimeSformer_divST_8x32_224_TEST.yaml DATA.PATH_TO_DATA_DIR .\data\kinetics400_tiny\ TEST.CHECKPOINT_FILE_PATH .\checkpoints\TimeSformer_divST_8x32_224_K400.pyth TRAIN.ENABLE False
使用GPU
python tools/run_net.py --cfg configs/Kinetics/TimeSformer_divST_8x32_224.yaml DATA.PATH_TO_DATA_DIR data/kinetics400_tiny/ NUM_GPUS 1 TRAIN.BATCH_SIZE 6 TRAIN.CHECKPOINT_FILE_PATH checkpoints/TimeSformer_divST_8x32_224_K400.pyth TRAIN.FINETUNE True