tsn-pytorch代码实验

本实验是在Linux服务器上完成。

目录

一、准备工作

1.1数据集准备

1.2代码准备

1.3环境准备

二、处理数据

2.1提取rgb和光流图片

2.2生成file_list

三、开始训练

3.1修改代码

3.2开始训练

四、测试工作

4.1修改代码

4.2开始测试

4.3模态融合

五、一些错误记录

六、总结


一、准备工作

1.1数据集准备

本文主要是为了复刻TSN论文中的实验,使用的是UCF101数据集

UCF101数据集:

 http://www.crcv.ucf.edu/data/UCF101/UCF101.rar

数据集划分方式:

https://www.crcv.ucf.edu/wp-content/uploads/2019/03/UCF101TrainTestSplits-RecognitionTask.zip

UCF101数据集从youtube收集而得,共包含101类动作。其中每类动作由25个人做动作,每人做4-7组,共13320个视频,分辨率为320*240,共6.5G
UCF101在动作的采集上具有非常大的多样性,包括相机运行、外观变化、姿态变化、物体比例变化、背景变化、光纤变化等。

下载完成后,UCF-101文件夹共101个子目录,其中每个子目录分别有若干相同动作的视频,ucfTrainTestlist文件夹下共有3种划分方式,在后续实验过程中自行选择。

1.2代码准备

需要使用tsn-pytorch和mmaction的代码,后期模态融合需要借鉴Temporal Segment Networks代码,这里直接从GitHub上拉取

tsn-pytorch

git clone --recursive https://github.com/yjxiong/tsn-pytorch

mmaction

git clone --recursive https://github.com/open-mmlab/mmaction.git
temporal-segment-networks

git clone --recursive https://github.com/yjxiong/temporal-segment-networks

1.3环境准备

这里主要是进行mmaction环境配置,mmaction是基于pytorch用于视频理解的开源工具箱,利用mmaction进行提帧和提取光流操作以及生成文件列表作为tsn-pytorch模型的输入。本实验使用的是Anaconda创建虚拟环境,根据cuda版本安装pytorch(在安装pytorch过程中会伴随安装本实验所需要的cuda以及nvcc),pytorch下载网址如下:

https://pytorch.org/

对于mmcv安装注意要根据pytorchcuda版本安装对应版本,可利用此网址查看mmcv版本

Installation — mmcv 1.7.0 documentation

tsn-pytorch代码实验_第1张图片

在安装Denseflow的时候可能会产生一些问题,可以通过百度解决。

处理数据

首先在mmaction/data/下创建一个UCF101文件夹,用于存放数据集相关文件,并建立如下三个目录

tsn-pytorch代码实验_第2张图片

它们的作用为:

annotationsucf101之后进行分割训练集、测试集的依据文件

rawframes:视频提帧后存放的文件目录

videos:复制ucf101数据集中的101个文件目录(考虑平台存储空间和运行时间,这里仅拷贝3个)

2.1提取rgb和光流图片

参照github上mmaction项目数据处理步骤提取rgb和光流图片,这个过程会很漫长尤其是用denseflow提取光流操作,对101类视频提取光流可能要花费数天,得到的文件大约300多G。

tsn-pytorch代码实验_第3张图片

提取完成后会在rawframes目录下发现flow_x,flow_yimg三种名称的图片。

tsn-pytorch代码实验_第4张图片

2.2生成file_list

参照github上mmaction项目数据处理步骤生成file_list.

操作完成后会生成相应文件列表。

tsn-pytorch代码实验_第5张图片

ucf101_train_split_1_rawframes.txt,ucf101_train_split_2_rawframes.txt,ucf101_train_split_3_rawframes.txt是训练文件

ucf101_val_split_1_rawframes.txt,ucf101_val_split_2_rawframes.txt,ucf101_val_split_3_rawframes.txt是测试文件,1,2,3三类文件可以使用任意一类,

file_list中有三列,第一列代表文件的地址,第二列代表视频的帧数,第三列代表视频的类别。这里仅仅使用ucf1013个文件夹,所以类别只有0 1 2

三、开始训练

3.1修改代码

1.ucf101个类别,这里仅测试了3种所以修改代码

2.TSNDataSet中,将将args.train_listargs.val_list改为2.2生成文件的绝对路径(任选一个),所以将代码修改为

训练路径

tsn-pytorch代码实验_第6张图片

测试路径

tsn-pytorch代码实验_第7张图片

3.因为我们只选取了三个类别,而pytorchtopk算法默认是(1,5),所以还要对这部分进行更改,否则会报越界错误,更改部分如下图

可以搜索在main.py中搜索topk关键字,将其改为(1,3),为了方便,前面的prec5不再做更改,在后期输出时注意区分即可。

3.2开始训练

tsn-pytorchREADME中有训练和测试命令,其中训练命令如下

tsn-pytorch代码实验_第8张图片

第一种,即RGB模态下分段为3的网络,切换到tsn-pytorch目录下,运行下面的命令开始训练,训练5epoch

python main.py ucf101 RGB /workspace/TSN2/mmaction/data/ucf101/ucf101_train_split_1_rawframes.txt /workspace/TSN2/mmaction/data/ucf101/ucf101_val_split_1_rawframes.txt --num_segments 3 --gd 20 --lr 0.001 --lr_steps 30 60 --epochs 5 -b 8 -j 8 --dropout 0.8 --snapshot_pref ucf101_bninception_

运行后可看到一些预设参数

tsn-pytorch代码实验_第9张图片

tsn-pytorch代码实验_第10张图片

第二种,即Flow模态下分段为3的网络,切换到tsn-pytorch目录下,运行下面的命令开始训练,训练5epoch

python main.py ucf101 Flow /workspace/TSN2/mmaction/data/ucf101/ucf101_train_split_1_rawframes.txt /workspace/TSN2/mmaction/data/ucf101/ucf101_val_split_1_rawframes.txt --num_segments 3 --gd 20 --lr 0.001 --lr_steps 190 300 --epochs 5  -b 1 -j 8 --dropout 0.7 --snapshot_pref ucf101_bninception_ --flow_pref flow_

tsn-pytorch代码实验_第11张图片

tsn-pytorch代码实验_第12张图片

模型文件保存

tsn-pytorch代码实验_第13张图片

测试工作

4.1修改代码

测试需要对tsn-pytorch目录下test_models.py进行一些修改

1.修改分段数,减少运算量

2.修改ucf类别数

3.修改为单gpu运行

4.2开始测试

tsn-pytorch代码实验_第14张图片

同样从README文件中获取测试命令,执行

仅测试rgb

python test_models.py ucf101 RGB /workspace/TSN2/mmaction/data/ucf101/ucf101_val_split_1_rawframes.txt ucf101_bninception__rgb_checkpoint.pth.tar --save_scores RGB_SCORE_FILE

首先打印TSN相关配置

tsn-pytorch代码实验_第15张图片

测试过程很快,测试结果如下:

tsn-pytorch代码实验_第16张图片

仅测试光流

首先打印TSN相关配置

tsn-pytorch代码实验_第17张图片

测试过程很快,测试结果如下:

tsn-pytorch代码实验_第18张图片

python test_models.py ucf101 Flow /workspace/TSN2/mmaction/data/ucf101/ucf101_val_split_1_rawframes.txt ucf101_bninception__flow_checkpoint.pth.tar --save_scores FLOW_SCORE_FILE

执行上述测试命令时会生成得分文件

tsn-pytorch代码实验_第19张图片

4.3模态融合

借鉴Temporal Segment Networks代码

tsn-pytorch代码实验_第20张图片

1.修改工作

切换至temporal-segment-networks目录下,打开/temporal-segment-networks/pyActionRecog/utils目录下metric文件添加softmax函数

tsn-pytorch代码实验_第21张图片

2.执行

python tools/eval_scores.py RGB_SCORE_FILE.npz FLOW_SCORE_FILE.npz --score_weights 1 1.5

一些错误记录

在实验过程中遇到了很多错误这里列举一些,仅对个人有效合理采纳即可。

1. pytorch版本高于1.3会出现一些小问题,可百度解决。

2.在输入rgb训练时报错

解决方法:

tsn-pytorch代码实验_第22张图片

3.安装opencv-4.1和dense_flow,执行make时发生大量报错

tsn-pytorch代码实验_第23张图片

解决方法:参考教程

https://seventhblue.blog.csdn.net/article/details/105210496?spm=1001.2014.3001.5502

4.训练时超出显存

tsn-pytorch代码实验_第24张图片

解决方法:调小batch-size

5.路径发生错误(在实验中发生了数次)

tsn-pytorch代码实验_第25张图片

解决方法:仔细检查命令是否输入正确,比如光流测试时用到训练时生成的.pth文件,文件名称确保正确。

6.光流测试时报错,生成的文件名称和使用的文件名称不一样,代码问题。

tsn-pytorch代码实验_第26张图片

解决方法:

tsn-pytorch代码实验_第27张图片

7.实验过程还有一些小bug,比如光流训练时,最后这一张光流图片找不到。

tsn-pytorch代码实验_第28张图片

解决方法:

dataset.py文件中length-1.

tsn-pytorch代码实验_第29张图片

总结

TSN算法是行为识别领域一个经典的算法,共有基于caffepytorch两个版本,对于pytorch版本网上关于rgb输入模型进行训练有很多教程,本人也是在这些教程的帮助下历时两周,最终以上述方式完成了测试,写下来希望大家再做上述工作的时候能少踩些坑,大家加油。

你可能感兴趣的:(深度学习,pytorch)