TimeSformer笔记视频分析的变形金刚

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等提取的特征,可以分为三种思想


image.png

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,686评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,668评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,160评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,736评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,847评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,043评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,129评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,872评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,318评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,645评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,777评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,470评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,126评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,861评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,095评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,589评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,687评论 2 351

推荐阅读更多精彩内容