近期需要做动作识别,so选择一些经典网络进行测试。目前仅使用了RGB进行测试,optical flow 并未进行测试。
TSN code:https://github.com/yjxiong/tsn-pytorch
TSN pre-train model:https://github.com/shuangshuangguo/caffe2pytorch-tsn
dataset: ucf101
数据集处理使用mmaction2: https://github.com/open-mmlab/mmaction2
mmaction2的方式处理数据集即可,在我的实验过程中,服务器无法通过其sh文件下载数据集,所以去官网自行下载并按sh文件中规定路径,上传到指定位置。
这里有一点需要注意,就是数据标签、视频、图片以及train、val列表,均存放在mmaction2/data路径下,而sh文件操作路径是mmaction2/tools/data/路径下。
同时因为denseflow未安装成功,所以没有提取光流,仅仅通过opencv提取了RGB帧,具体方式见mmaction2.
代码采用TSN code所示代码,因为官方并未提供pytorch 的 pre-train model, 所以找到了第三方提供的(见上文TSN pre-train model)。
该模型由官方提供的caffe 模型转换而来,所以需要用其提供的test_models.py替换官方文件中的test_model.py
测试环境:NVIDIA V100显卡,消耗显存11781MB, ucf101 split1 测试时长3-4小时。
测试时, 采用如下指令进行测试,以ucf101数据集为例,其中mmaction2 和 tsn-pytorch文件在同级目录上。
CUDA_VISIBLE_DEVICES=3 python test_models.py ucf101 RGB ../mmaction2/data/ucf101/ucf101_val_split_1_rawframes.txt \
--arch BNInception ./checkpoints/ucf101_rgb.pth
--arch 需要选择BNInception,不可以选择resnet系列,模型会不匹配。
pytorch >= 0.4 版本,会出现size mismatch的错误,
报错如下:Error(s) in loading state_dict for BNInception:size mismatch for
解决方法:
解决前的代码是这样的:
self.load_state_dict(torch.utils.model_zoo.load_url(weight_url, model_dir='./TRN-pytorch-master/model_zoo'))
解决后:
model_BNInception = torch.utils.model_zoo.load_url(weight_url, model_dir='./TRN-pytorch-master/model_zoo')
for name, weights in model_BNInception.items():
# print(name, weights.size()) 可以查看模型中的模型名字和权重维度
if len(weights.size()) == 2: #判断需要修改维度的条件
model_BNInception[name] = weights.squeeze(0) #去掉维度0,把(1,128)转为(128)
self.load_state_dict(model_BNInception)
至于其他问题,肯定还有,不过印象深刻的都写下来的,剩下的多半根据报错直接百度都可以解决掉。
测试结果:Accuracy 85.82%
这一个东西搞了十来天,顶着老板的push,搞了好几个版本的tsn,最终以上述方式完成了测试,写下来希望大家再做上述工作的时候能少踩些坑,大家加油~