腾讯动作检测网络DBG算法编译运行

官方代码的github地址为:https://github.com/Tencent/ActionDetection-DBG
DBG代码中的输入是视频经TSN网络的输出结果,即视频的特征。官方教程下给出了其使用的TSN网络的模型及模型参数,以及其后处理代码,读教程的时候一定要仔细读,本人当时就是粗心大意没看到这些,导致走了很多弯路。下面开始正题。
此次的目标是以视频为输入,输出视频的temporal action proposal。 DBG代码主页给出使用例程是以ActivityNet1.3视频库经过TSN提取的特征为输入,输出temporal action proposal,若希望对任意视频提取temporal action proposal,需要编译TSN并获得其模型参数。
首先列出电脑配置:
OS: Ubuntu 16.04
显卡:RTX2060
Nvidia-driver: 440.100
CUDA: 10.0.130
cudnn: 7.4.2
conda: 4.8.2

1.编译TSN

TSN网络的github地址为:https://github.com/yjxiong/temporal-segment-networks
下面先简单说一下踩过的坑:由于我的cuda版本较高,从代码仓库下载的代码需要经过一系列修改,编译时中间出现了很多问题,后来就直接下载了官方提供的docker使用,docker下载下来会占用11G的空间,但官方docker基于cuda9,cuda9支持的算力为3.0-7.2,本人显卡RTX2060,算力7.5,因此不能直接使用。关于显卡算力与cuda对应关系,可以看这个维基百科。最后通过docker镜像内的文件,找到了解决办法。
切换到TSN代码仓库的docker分支,可以看到根目录中有一个文件opencv_cuda9.patch,这里记录了3rd-party/opencv-2.4.13/cmake/FindCUDA.cmake3rd-party/opencv-2.4.13/cmake/OpenCVDetectCUDA.cmake两个文件针对高版本cuda进行的修改。3rd-party这个目录会在编译时创建,opencv也会在编译的时候下载,可详见build_all.sh

1.1 git clone 方法

这个代码地址中包含其他项目的代码,因此clone时一定要加上--recursive,不然代码不全

# 下载
git clone --recursive https://github.com/yjxiong/temporal-segment-networks
# 切换分支
git checkout docker
# 激活python2.7环境
conda activate python27
# 编译
bash build_all.sh

编译的时候会下载opencv2.4.13,若下载很慢,可手动下载,地址:opencv-2.4.13.zip,下载后解压到3rd-party目录下

1.2 手动下载编译

若加上--recursiveclone很慢,可选择手动下载代码。
1、手动下载代码的docker分支
2、手动下载lib/caffe_actionlib/dense_flow的代码,解压到对应文件夹下,TSN项目中有代码地址。
3、lib/dense_flow/include文件夹下CLUEeasylogging++也需要手动下载,dense_flow项目代码中有地址,本文也提供了链接地址,点击它们的名字即可链接过去。
4、手动下载opencv,地址:opencv-2.4.13.zip,下载后解压到3rd-party目录下
5、手动下载的代码opencv_cuda9.patch这个文件起不了作用,因此我将FindCUDA.cmakeOpenCVDetectCUDA.cmake上传到了github,可下载下来替换掉,地址:DBG_TSN_files
6、编译

# 切换conda到python2.7版本
conda activate python27
# 编译
bash build_all.sh

2.运行TSN

2.1 下载模型文件和参数文件

DBG使用的是在ActivityNet数据集上预训练的TSN模型,在TSN根目录下新建文件夹./tsn/models,使用下列命令下载模型(参考自get_reference_models.sh):

# bn flow model was trained with cuDNN v4, we will use the weights upgraded to cuDNN v5
wget -O tsn/models/bn_inception_anet_2016_temporal.caffemodel.v5 https://yjxiong.blob.core.windows.net/anet-2016/bn_inception_anet_2016_temporal.caffemodel.v5
wget -O tsn/models/bn_inception_anet_2016_temporal_deploy.prototxt https://yjxiong.blob.core.windows.net/anet-2016/bn_inception_anet_2016_temporal_deploy.prototxt
wget -O tsn/models/resnet200_anet_2016.caffemodel https://yjxiong.blob.core.windows.net/anet-2016/resnet200_anet_2016.caffemodel
wget -O tsn/models/resnet200_anet_2016_deploy.prototxt https://yjxiong.blob.core.windows.net/anet-2016/resnet200_anet_2016_deploy.prototxt
2.2 运行tsn

DBG在./tools目录下提供了应用示例,把代码简单修改了下,可在这里下载。
安装pandas:

pip install pandas -i https://pypi.tuna.tsinghua.edu.cn/simple

将视频文件放入./tsn/input_folder/目录下,在TSN主目录下运行:

注:目前支持的视频后缀名为’avi’,‘mp4’, ‘mkv’, ‘webm’,可以在build_of.py文件中修改

conda activate python27

# 设置PYTHONPATH为TSN主目录,使得代码中“import cv2”时使用的是刚编译出的cv2,TSN编译好后,cv2.so会出现在TSN主目录下
export PYTHONPATH=$pwd

# 生成视频的光流文件和逐帧图像文件,zip格式
# 输出的内容放到tsn/output_folder/1.video_optical_flow/目录下,gpu 1个 
bash tsn/extract_optical_flow.sh tsn/input_folder tsn/output_folder/1.video_optical_flow/ 1

# 使用anet2016提供的网络模型和参数,以上一步生成的光流和逐帧图像文件为输入,生成视频特征csv文件
# 输出的内容放到tsn/output_folder/2.tsn_anet2016_score_5fps/spatial/
# 和tsn/output_folder/2.tsn_anet2016_score_5fps/temporal/ 目录下
# anet2016
python tsn/eval_net_zip.py activitynet_1.3 1 rgb tsn/output_folder/1.video_optical_flow/ tsn/models/resnet200_anet_2016_deploy.prototxt tsn/models/resnet200_anet_2016.caffemodel --num_worker 1 --gpus 0 --save_scores tsn/output_folder/2.tsn_anet2016_score_5fps/spatial/
python tsn/eval_net_zip.py activitynet_1.3 1 flow tsn/output_folder/1.video_optical_flow/  tsn/models/bn_inception_anet_2016_temporal_deploy.prototxt tsn/models/bn_inception_anet_2016_temporal.caffemodel.v5 --num_worker 1 --gpus 0 --save_scores tsn/output_folder/2.tsn_anet2016_score_5fps/temporal/

# 生成video_info.csv, 包含视频名称、帧数和时长(秒)
python tsn/gen_video_info.py tsn/input_folder/ tsn/output_folder/

# 将上述生成的视频特征进行rescale
# 生成的内容放到tsn/output_folder/3.all_csv_mean_100/ 目录下
# 生成tsn_anet_anno_100.json
python tsn/data_process.py tsn/output_folder/2.tsn_anet2016_score_5fps/ tsn/output_folder/3.all_csv_mean_100 tsn/output_folder/video_info.csv --out_json_file tsn/output_folder/tsn_anet_anno_100.json

最终得到视频信息文件tsn_anet_anno_100.json和文件夹./tsn/output_folder/3.all_csv_mean_100/,这个文件夹下包含了各个视频的特征数据。

3.编译运行DBG

本文使用tensorflow,使用pytorch参考项目DBG的readme。
下载DBG的项目代码。
编译custom_op:
在DBG主目录下运行:

# 激活python3.7环境
conda activate python37
cd tensorflow/custom_op
make

仿照./config/config_pretrained.yaml写一个yaml文件,设置video_info_file为TSN产生的json文件,设置feat_dir为视频特征文件夹。
将在这里下载的dbg/test_custmize.py复制到DBG的./tensorflow/目录下。
将下载的dbg/post_processing_customize.py复制到DBG的根目录下。
在DBG根目录下执行以下命令:

# 激活python3.7环境
conda activate python37
# 运行网络,得到各个视频的预测结果csv文件
# 根据config_customize.yaml中配置,最终结果会放置到output/result_customize/目录下
python tensorflow/test_customize.py config/config_customize.yaml
# 后处理,最终结果放到results/result_proposals_customize.json文件中
python post_processing_customize.py output/result_customize/ results/result_proposals_customize.json

最终终端的输出结果如下:

plastering {'score': 0.323409660201818, 'segment': [2.6500000000000004, 52.47]}
videoplayback (2) {'score': 0.7327236645051455, 'segment': [107.88, 135.78]} 
videoplayback (1) {'score': 0.40213491879310287, 'segment': [3.96, 17.46]}
How to Choose an Elliptical Trainer {'score': 0.41125810425928727, 'segment': [13.86, 48.51]}
videoplayback {'score': 0.5474026367080884, 'segment': [0, 24.75]}

其每一行第一个表示视频名称,score表示获得的分数,segment表示动作起始时间。
终端中提供了分数最高的temporal action proposal,如果想看更多内容可以查看results/result_proposals_customize.json文件的内容。部分内容如下:
在这里插入图片描述

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值