TimeSformer筆記視頻分析的變形金剛

https://arxiv.org/pdf/2102.05095.pdf
官方源碼地址
https://github.com/facebookresearch/TimeSformer

視頻分析

這個(gè)算法的意義類(lèi)似detr,是ViT開(kāi)始進(jìn)入視頻行為分析的開(kāi)端,也是Facebook的作品。
首先我們看下什么是行為識(shí)別,對(duì)于很多視頻視覺(jué)分析的學(xué)習(xí),就會(huì)發(fā)現(xiàn)更多的視覺(jué)方面的細(xì)分,名詞也多了很多,除了目標(biāo)識(shí)別,語(yǔ)義分割,還有在視頻方面的行為識(shí)別,動(dòng)作識(shí)別,還有人重定位,動(dòng)作定位等,有時(shí)可能也會(huì)傻傻分不清。

可以從業(yè)務(wù)和數(shù)據(jù)技術(shù)角度理解
比如我們看一段視頻是在打籃球,這可以叫行為,然后動(dòng)作更細(xì)微,比如投籃,運(yùn)球時(shí)動(dòng)作,當(dāng)然但是很多時(shí)候也可能不那么嚴(yán)格區(qū)分,因?yàn)槟壳耙曨l分析都很短,秒級(jí)的視頻。
目前業(yè)務(wù)場(chǎng)景主要在短視頻和直播上,

從數(shù)據(jù)看,行為識(shí)別就是對(duì)時(shí)域預(yù)先分割好的序列判定其所屬行為動(dòng)作的類(lèi)型,即“讀懂行為”。
其實(shí)我們錄到的視頻本身也是一幀一幀的流輸入整合成的,跟設(shè)備的輸入速度有關(guān),所以可以把視頻分為一個(gè)個(gè)有序的幀格式,這時(shí)候,就是圖像二維數(shù)據(jù)加上了時(shí)間,所以時(shí)三維的,所以也叫3D視覺(jué)。

Action Detection

目的:不僅要知道一個(gè)動(dòng)作在視頻中是否發(fā)生,還需要知道動(dòng)作發(fā)生在視頻的哪段時(shí)間

特點(diǎn):需要處理較長(zhǎng)的,未分割的視頻。且視頻通常有較多干擾,目標(biāo)動(dòng)作一般只占視頻的一小部分。

分類(lèi):根據(jù)待檢測(cè)視頻是一整段讀入的還是逐次讀入的,分為online和offline兩種

Offline action detection:
特點(diǎn):一次讀入一整段視頻,然后在這一整段視頻中定位動(dòng)作發(fā)生的時(shí)間

Online action detection:
特點(diǎn):不斷讀入新的幀,在讀入幀的過(guò)程中需要盡可能早的發(fā)現(xiàn)動(dòng)作的發(fā)生(在動(dòng)作尚未結(jié)束時(shí)就檢測(cè)到)。
同時(shí)online action detection 還需要滿足實(shí)時(shí)性要求,這點(diǎn)非常重要。
這導(dǎo)致online action detection不能采用計(jì)算復(fù)雜度過(guò)大的方法(在現(xiàn)有的計(jì)算能力下)

現(xiàn)有方法:
逐幀檢測(cè)法:
即在視頻序列的每幀上獨(dú)立判斷動(dòng)作的類(lèi)型,可以用CNN等方法,僅用上了spatial的信息
滑窗法: 即設(shè)置一個(gè)固定的滑窗大小,在視頻序列上進(jìn)行滑窗,然后對(duì)滑窗得到的視頻小片斷利用action recognition的方法進(jìn)行分類(lèi)。

現(xiàn)狀:由于此問(wèn)題難度比action recognition高很多,所以現(xiàn)在還沒(méi)有效果較好的方法

分析方法

那從數(shù)據(jù)角度我們就可以很好考慮怎么分析了,一個(gè)時(shí)視覺(jué)二維維度,還有個(gè)是時(shí)間維度,那么從傳統(tǒng)最新的transformer都是應(yīng)用時(shí)間序列和圖像分析的各種方法。
早期的傳統(tǒng)方法可以借鑒dwt等序列規(guī)整,將兩個(gè)視頻幀數(shù)據(jù)進(jìn)行相似度對(duì)比,來(lái)進(jìn)行聚類(lèi)或是分類(lèi),
而基于深度學(xué)習(xí)的更為有效,因?yàn)榧尤肓薈NN等提取的特征,可以分為三種思想


image.png

1、 two-[stream] (雙流)方法
使用以單幀RGB作為輸入的CNN來(lái)處理空間維度的信息,使用以多幀密度光流場(chǎng)作為輸入的CNN來(lái)處理時(shí)間維度的信息,并通過(guò)多任務(wù)訓(xùn)練的方法將兩個(gè)行為分類(lèi)的數(shù)據(jù)集聯(lián)合起來(lái)(UCF101與HMDB),去除過(guò)擬合進(jìn)而獲得更好效果。

2、C3D是在 two-stream的基礎(chǔ)上
最后一個(gè)卷積層的ReLU之后將兩個(gè)網(wǎng)絡(luò)融合至空域流,并通過(guò)3D Conv+3D Pooling轉(zhuǎn)化成時(shí)空流,同時(shí)不截?cái)鄷r(shí)域流,在時(shí)域網(wǎng)絡(luò)上執(zhí)行3D Pooling。最終兩個(gè)Loss都用于訓(xùn)練并進(jìn)行預(yù)測(cè)。

3、這也是比較好理解的,CNN+LSTM的方法
也是就是在平面二維上來(lái)說(shuō)CNN具有很強(qiáng)的特征過(guò)濾提取能力,但是到了3D的情況,我們知道有了時(shí)間順序關(guān)聯(lián)的算法比如RNN和LSTM等更為有效,所以結(jié)合二者的方法就顯而易見(jiàn)了。

TimeSformer

transformer已經(jīng)在NLP等序列模式里發(fā)揮更好的性能,而這里transformer 優(yōu)化LSTM也是顯然的過(guò)程,同時(shí)這不僅是優(yōu)化,更由于ViT的發(fā)展,使得可以在增加一個(gè)維度下進(jìn)行了CNN和LSTM的融合,就是所謂的無(wú)卷積的方法,也就是這里的TimeSformer

也就是所謂的一種3D的算法, 而且特別的是,在3D上,不用CNN比CNN更為高效,這也是變形金剛技術(shù)的發(fā)展帶來(lái)的一個(gè)驚喜,因?yàn)閭鹘y(tǒng)視覺(jué)上CNN還是在速度上更有優(yōu)勢(shì)。

因?yàn)镃NN僅在短程模式方面有效,而對(duì)于更大的時(shí)間依賴(lài)的模式就很有限,而且計(jì)算量反而是更為大TimesFormer僅建立在transformer模型種使用自注意力機(jī)制上,而且計(jì)算成本低,
因?yàn)?br> 1 將視頻分為一組不重疊的patch;
2 采用自注意力,避免對(duì)所有的patch對(duì)進(jìn)行詳盡的比較,也即是依次應(yīng)用時(shí)間注意力和空間注意力。具體就是高維融合,降維治之,在使用時(shí)間注意力的時(shí)候,每個(gè)patch 只和其他幀中相同空間位置的patch進(jìn)行比較,在使用空間注意力的時(shí)候,每個(gè)patch只和同一個(gè)幀中的patch比較。而且3DCNN只能處理幾秒的視頻,而TimeSformer可以處理更長(zhǎng)到一分多的視頻。

目前有官方源碼還有基于mmaction的 和paddlepaddle等的,這里是先使用官方代碼,后期驗(yàn)證落地準(zhǔn)備使用mmaction的
https://www.icode9.com/content-1-944906.html

數(shù)據(jù)集

https://www.cnblogs.com/qianchaomoon/p/12324905.html

部署

先使用windows anaconda 部署,以便快速體驗(yàn),后面再研讀論文和代碼了

conda create -n timesformer python=3.7 -y
conda activate timesformer
這里繼續(xù)安裝torch ,版本最好要低于1.9 不然會(huì)有很多報(bào)錯(cuò)
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
安裝項(xiàng)目git clone https://github.com/facebookresearch/TimeSformer
cd TimeSformer
python setup.py build develop
測(cè)試驗(yàn)證建立data文件夾,這里先使用k400 tiny數(shù)據(jù)集,
wget https://download.openmmlab.com/mmaction/kinetics400_tiny.zip

將txt的標(biāo)注文件轉(zhuǎn)為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 部署,以便在服務(wù)器訓(xùn)練
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"]

訓(xùn)練測(cè)試

訓(xùn)練 python tools/run_net.py --cfg .\configs\Kinetics\TimeSformer_divST_8x32_224.yaml DATA.PATH_TO_DATA_DIR .\data\kinetics400_tiny\

微調(diào)
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 ,最好用客戶端同步

推理測(cè)試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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容