本实验是在Linux服务器上完成。
目录
一、准备工作
1.1数据集准备
1.2代码准备
1.3环境准备
二、处理数据
2.1提取rgb和光流图片
2.2生成file_list
三、开始训练
3.1修改代码
3.2开始训练
四、测试工作
4.1修改代码
4.2开始测试
4.3模态融合
五、一些错误记录
六、总结
本文主要是为了复刻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种划分方式,在后续实验过程中自行选择。
需要使用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
这里主要是进行mmaction环境配置,mmaction是基于pytorch用于视频理解的开源工具箱,利用mmaction进行提帧和提取光流操作以及生成文件列表作为tsn-pytorch模型的输入。本实验使用的是Anaconda创建虚拟环境,根据cuda版本安装pytorch(在安装pytorch过程中会伴随安装本实验所需要的cuda以及nvcc),pytorch下载网址如下:
https://pytorch.org/
对于mmcv安装注意要根据pytorch和cuda版本安装对应版本,可利用此网址查看mmcv版本
Installation — mmcv 1.7.0 documentation
在安装Denseflow的时候可能会产生一些问题,可以通过百度解决。
首先在mmaction/data/下创建一个UCF101文件夹,用于存放数据集相关文件,并建立如下三个目录
它们的作用为:
annotations:ucf101之后进行分割训练集、测试集的依据文件
rawframes:视频提帧后存放的文件目录
videos:复制ucf101数据集中的101个文件目录(考虑平台存储空间和运行时间,这里仅拷贝3个)
参照github上mmaction项目数据处理步骤提取rgb和光流图片,这个过程会很漫长尤其是用denseflow提取光流操作,对101类视频提取光流可能要花费数天,得到的文件大约300多G。
提取完成后会在rawframes目录下发现flow_x,flow_y和img三种名称的图片。
参照github上mmaction项目数据处理步骤生成file_list.
操作完成后会生成相应文件列表。
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中有三列,第一列代表文件的地址,第二列代表视频的帧数,第三列代表视频的类别。这里仅仅使用ucf101的3个文件夹,所以类别只有0 1 2。
1.ucf有101个类别,这里仅测试了3种所以修改代码
2.在TSNDataSet中,将将args.train_list和args.val_list改为2.2生成文件的绝对路径(任选一个),所以将代码修改为
训练路径
测试路径
3.因为我们只选取了三个类别,而pytorch的topk算法默认是(1,5),所以还要对这部分进行更改,否则会报越界错误,更改部分如下图
可以搜索在main.py中搜索topk关键字,将其改为(1,3),为了方便,前面的prec5不再做更改,在后期输出时注意区分即可。
在tsn-pytorch的README中有训练和测试命令,其中训练命令如下
第一种,即RGB模态下分段为3的网络,切换到tsn-pytorch目录下,运行下面的命令开始训练,训练5个epoch。
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_
运行后可看到一些预设参数
第二种,即Flow模态下分段为3的网络,切换到tsn-pytorch目录下,运行下面的命令开始训练,训练5个epoch。
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目录下test_models.py进行一些修改
1.修改分段数,减少运算量
2.修改ucf类别数
3.修改为单gpu运行
同样从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相关配置
测试过程很快,测试结果如下:
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
执行上述测试命令时会生成得分文件
借鉴Temporal Segment Networks代码
1.修改工作
切换至temporal-segment-networks目录下,打开/temporal-segment-networks/pyActionRecog/utils目录下metric文件添加softmax函数
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训练时报错
解决方法:
3.安装opencv-4.1和dense_flow,执行make时发生大量报错
解决方法:参考教程
https://seventhblue.blog.csdn.net/article/details/105210496?spm=1001.2014.3001.5502
4.训练时超出显存
解决方法:调小batch-size
5.路径发生错误(在实验中发生了数次)
解决方法:仔细检查命令是否输入正确,比如光流测试时用到训练时生成的.pth文件,文件名称确保正确。
6.光流测试时报错,生成的文件名称和使用的文件名称不一样,代码问题。
解决方法:
7.实验过程还有一些小bug,比如光流训练时,最后这一张光流图片找不到。
解决方法:
在dataset.py文件中length-1.
TSN算法是行为识别领域一个经典的算法,共有基于caffe和pytorch两个版本,对于pytorch版本网上关于rgb输入模型进行训练有很多教程,本人也是在这些教程的帮助下历时两周,最终以上述方式完成了测试,写下来希望大家再做上述工作的时候能少踩些坑,大家加油。