复现I3D遇到的问题

1.Download模型

从deepmind的github中download I3D模型,它是由checkpoints保存的tensorflow session。

https://github.com/deepmind/kinetics-i3d

1.1问题1

首先要下载sonnet,按照教程下载之后运行import sonnet as snt提示需要下载tensorflow-probability,需要注意的是tensorflow-probablity的版本要与tensorflow的版本要对应,不能够太新或太旧。

1.2问题2

git clone https://github.com/deepmind/kinetics-i3d

然后出现了错误:error: RPC fatled; curl 56 GnuTLS recv error (-54): Error in the pull function.fatal: The remote end hung up unexpectedly fatal: early EOF-objects fatled

网上说是 网速太慢、亦或是http的缓存不够....百般尝试,最终得以解决的方法是:从宿舍前往实验室,换了个wifi就可以了。

1.3问题3

问题:解压UCF101数据集时候,RAR显示Parsing filters is unsupported,无法解压

问题分析:系统中未安装RAR文件的压缩/解压管理工具,而Archive Manager依赖于这些工具来解压/压缩文件。

问题解决:安装unrar

sudo apt install unrar

1.4问题4

问题:在kinetics-i3d/evaluate_sample.py中,其输入为rgb.npy和flow.npy,不清楚如何得到这个文件

问题解决:np.load和np.save是读写磁盘数组数据的两个主要函数,默认情况下,数组是以未压缩的原始二进制格式保存在扩展名为.npy的文件中。

import numpy as np
a=np.arange(5)
np.save('test.npy',a)

这样在程序所在的文件夹就生成了一个test.npy文件

将test.npy文件中的文件读出来:

import numpy as np
a=np.load('test.npy')
print(a)

注:保存为Numpy专用的二进制格式后,就不能用notepad++等打开看了(乱码)。因此这种方式建议在不需要看保存文件内容的情况下使用。

参考https://blog.csdn.net/m0_37041325/article/details/78006203

1.5问题5

问题:opencv的安装,这个安装可谓是一波三折,又是网速问题,又是缺package问题。

参考:依赖包的安装参考:https://blog.csdn.net/lovelyaiq/article/details/78630111?utm_source=blogxgwz3

安装过程的参考(我git clone的是opencv官方的那个,它发布的那个在make的时候会有问题):

https://www.cnblogs.com/fx-blog/p/8213704.html

1.6问题6

问题:怎么使用opencv

问题分析:需要配置它的环境,网上说都要安装pk-config,而且在g++编译时候好像也有用到,所以先下载安装一个pkg-config模型。再进行环境的配置。

问题解决:

1、下载pkg-config(我下载的是0.29.2版本的):https://pkg-config.freedesktop.org/releases/

2、解压:tar -zxvf pkg-config-0.28.tar.gz

3、cd 进入解压文件夹

4、运行配置文件进行系统配置 : ./configure

5、编译 pkgconfig : make

6、安装包自检测 : make check

7、安装 :make install

至此, pkg-config 安装完成。

关于pkgconfig的介绍:https://blog.csdn.net/weixin_38907560/article/details/81449272
转自:https://blog.csdn.net/malin0523/article/details/80328587  

opencv的配置:https://www.cnblogs.com/qiaozhoulin/p/4978055.html

重点:哇,辛辛苦苦安装好opencv后发现,pkg-config --cflags --libs都没用,因为在/usr/local/libs/pkconfig中根本没有opencv.pc文件,可能因为是opencv4.0的问题或者其他。结果在我的anaconda3/tensorflow中发现了这个,所以我一瞬间明白了怎么调用我anaconda里面的包了。照猫画虎,将/usr/local/libs/pkconfig变成/home/jing/anaconda3/envs/tensorflow/lib/pkgconfig;/usr/local/libs变成/home/jing/anaconda3/envs/tensorflow/lib/。这样就可以利用pkg-config来引用我在anaconda安装的包了。

可是:在编译C++文件时候,它调用的opencv是software里面的。唉真奇怪

1.7问题7

参数dstCn原来一直沿用CV_BGR2GRAY, CV_RGB2GRAY, CV_GRAY2BGR, CV_GRAY2RGB等格式,但最新几个版本的OpenCV已改为COLOR_BGR2GRAY类似形式,今天才看源代码imgproc.hpp才发现,但官方文档还没修改,如下图,如果程序中使用较新的版本OpenCV,采用CV_BGR2GRAY可能会一直出错。

1.8问题8

由于安装的是Opencv4.0,好像与程序中的许多东西不兼容,所以这里又重新安装了opencv3.4.3,实测有效的安装教程:

https://blog.csdn.net/echoamor/article/details/83022352

make结束之后还有个sudo make install,文章中没有提及,需要注意!

在cmake的时候遇到了一个问题:

$ cmake .
CMake Error: The source directory "/home/hwade/hwade/CMake/cmTest2" does not appear to contain CMakeLists.txt.

原因好像是CMakeLists.txt的命名没搞好,还有关于cmake的一些介绍这个博客也写得很好:

https://www.cnblogs.com/catmilk/p/4998053.html

最终denseFlow成功编译,生成了可执行文件。

1.9问题9

运行./denseFlow时候,有出现了一个问题:

jing@jing-Lenovo-G50-80:~/Models/MotionRecognition/I3D/dense_flow/build$ ./denseFlow -f ex.avi -x tmp/flow_x -y tmp/flow_x -i tmp/image -b 15
terminate called after throwing an instance of 'cv::Exception'
  what():  OpenCV(3.4.3) /home/jing/Software/opencv-3.4.3/modules/core/src/command_line_parser.cpp:158: error: (-5:Bad argument) undeclared key 'vidFile' requested in function 'getByName'

 

经过对CommandLineParser这个类的了解,发现它的格式应该如此才正确:

const char* keys =
{
    "{ f  |  ex.avi | filename of video }"
    "{ x  |  tmp/flow_x | filename of flow x component }"
    "{ y  |  tmp/flow_y | filename of flow x component }"
    "{ i  |  tmp/flow_i | filename of flow image}"
    "{ b  |  15 | specify the maximum of optical flow}"
};
CommandLineParser cmd(argc, argv, keys);
string vidFile = cmd.get<string>("f");//原来是vidFile,可是对于getByName会出错
string xFlowFile = cmd.get<string>("x");
string yFlowFile = cmd.get<string>("y");
string imgFile = cmd.get<string>("i");
int bound = cmd.get<int>("b");

注意:tmp文件夹需要事先建立好。

1.10问题10

问题:得到了一系列的光流图后,我想把他制作成gif图,这样可以直观地感受下视频的光流变化。

问题分析:经过查找,发现有个叫做FFmpeg的工具十分多人使用,所以在这里尝试地制作下,以下是安装方法:

https://www.cnblogs.com/freeweb/p/6897907.html

设置环境变量,使得可以在终端进行操作的方法,类似sudo这种引用:https://www.cnblogs.com/Joans/p/7760378.html

ffmpeg用于制作GIF的方法:https://blog.csdn.net/happydeer/article/details/45727227

1.11问题11

之前我所得到的光流,用的方法不是TVL1,而使用TVL1方法提取光流似乎要用cv::cuda才可以,而我的笔记本没有N卡,所以这里思考怎么利用远程控制来控制工作站的使用。经过了解,使用TeamViewer似乎不错。

还有就是在安装N卡驱动时候,由于工作站出问题了,N卡不能用作显示(插HDMI无信号,打电话给技术支持也没有办法),所以安装N卡驱动时候选择了不要覆盖原来的X-configuration(NO,其他都是YES),以此来用集显(VGA接口)用作显示。

1.12问题12

唉.......真的是安软件安了一天。像以前一样配置好cuda和cudnn和tensorflow-gpu1.4.0之后,发现sonnet的tensorflow版本要求是>=1.5.0,然后一口气下载了cuda10.1+cudnn7.4,结果发现根本不行,版本太新太不稳定了。于是乎决定下载cuda9.0(注意不要下9.1,在import tensorflow as tf时候又有问题,感觉x.1都不可靠,还是x.0可靠)

卸载cuda的好方法:https://blog.csdn.net/jacke121/article/details/55061833

1.13问题13

哇......原来denseflow所使用的opencv版本是2.0+的,这个时候是有gpu.hpp的,可是opencv3.0+之后的版本是没有gpu.hpp的,只有cv::cuda,所以在cmake-gui编译opencv3.4.3的时候,需要将with cuda勾选上,否则将无法编译与cv::cuda有关的函数。

1.14问题14

在使用./denseflow_gpu时候,出现以下问题:

lab@lab-PowerEdge-T630:~/Models/MotionRecognition/I3D/denseFlow2.0$ ./denseFlow_gpu
terminate called after throwing an instance of 'cv::Exception'
  what():  OpenCV(3.4.3) /home/lab/Software/opencv-3.4.3/modules/core/src/matrix_wrap.cpp:118: error: (-213:The function/feature is not implemented) You should explicitly call download method for cuda::GpuMat object in function 'getMat_'

经过研究发现,这个问题是GpuMat的方法使用不恰当导致的。代码中GpuMat的方法调用类型必须严格按照如下所示:

GpuMat::download(Mat)#GpuMat传给Mat
GpuMat::upload(Mat)#Mat传给GpuMat

还有一个问题:

lab@lab-PowerEdge-T630:~/Models/MotionRecognition/I3D/denseFlow2.0$ ./denseFlow_gpu
terminate called after throwing an instance of 'cv::Exception'
  what():  OpenCV(3.4.3) /home/lab/Software/opencv-3.4.3/modules/imgproc/src/resize.cpp:4044: error: (-215:Assertion failed) !ssize.empty() in function 'resize'

这个问题就是,resize(input,output)中的input为空,所以可以反推出前面的问题。

1.15问题15

问题:HDMB51文件夹中有多个.rar文件,需要想一个批量解压的方法

问题解决:写一个.sh文件:

for i in `ls *.rar`
do
unrar x $i
done

如果解压包里没有目录的话,可以如此:

for i in `ls *.rar`
do
mkdir ./${i/.rar//}
unrar x $i ${i/.rar//}
done

1.16问题16

问题:数据集的视频如此之多,如何批量地进行处理呢?

问题分析:因为15号问题给我的灵感,可以写一个bash文件来进行循环处理。还有就是可以将数据集平均分成4部分,然后写4个bash文件,用4快TITAN XP来并行处理,加快RGB和FLOW的提取。

问题解决:其中一个bash的写法如下,其它都大同小异:

for i in `ls ./dataset/UCF-101-1/`
do
for j in `ls ./dataset/UCF-101-1/$i`
do
mkdir -p ./dataset_extract/UCF-101/$i/${j%.*}/{i,x,y}
./denseFlow_gpu -f=./dataset/UCF-101-1/$i/$j 
-x=./dataset_extract/UCF-101/$i/${j%.*}/x/x 
-y=./dataset_extract/UCF-101/$i/${j%.*}/y/y 
-i=./dataset_extract/UCF-101/$i/${j%.*}/i/i 
-d=0
done
echo $i is ready
done

其中耗费了我一点时间的是思考如何“在bash中截取字符串”来创建没有.avi后缀的文件夹,有个bash文件中如何截取字符串的教程:https://www.cnblogs.com/Bighua/archive/2017/09/18/7542328.html

之前计算过,单个TITAN XP提取一个视频耗时将近15s。而UCF101总共有13320段视频,预估需要运行14.8h,天啊~可怕,只能怪等待了。等待发现...这个过程持续了25个小时。

1.17问题17

问题:如何把含有数据集的文件夹路径提取至List文件,并且将其分为训练集和验证集。

问题分析:还是可以用bash来完成,由于I3DTENSORFLOW自带的conver_images_to_list无法实现,所以我自己模仿着这个意思写了一个:

> train.list
> test.list
COUNT=-1
i=0
for folder in $1/*
do
    COUNT=$[$COUNT + 1]
    for imagesFolder in "$folder"/*
    do
        i=$[i + 1]
        if (( $[i % $2]  == 0 )); then
            echo "$imagesFolder" $COUNT >> test.list
        else
            echo "$imagesFolder" $COUNT >> train.list
        fi        
    done
done

1.18问题18

问题:在运行train_ucf_rgb.py时候,出现了no attribute for "tf.init_scope()"的错误,错误出现在sonnet之中。

问题分析:接着我下载了官方的I3D示例代码进行运行,也是这个错误;接着我在我的笔记本运行了一遍示例代码,显示无误,而我的笔记本的tensorflow的版本为1.12.0,而工作站的为1.10.0,故判断为tensorflow的版本过旧,无法与sonnet对应。

问题解决:将tensorflow-gpu1.10.0卸载后,安装了1.12.0(为CUDA9对应的最高版本),问题得以解决。

2.复现成功

Architecture

Pre_train

ACC/TOP1

RGB+I3D

Kinetics

74.77%

FLOW+I3D

Kinetics

92.46%

TWO_STREAM+I3D

Kinetics

94.41%

RGB+I3D

Imagenet+Kinetics

98.38%

FLOW+I3D

Imagenet+Kinetics

97.42%

TWO_STREAM+I3D

Imagenet+Kinetics

99.01%

3.制作为test_one.py

  • Test_example中在test基础上加入了提取连续帧和光流步骤,且输入为单个视频路径;
  • test_example中还有创建存储RGBFLOW的文件夹的功能;
  • 原本用python调用c++的动态链接库.so文件,可是调用opencv时候出现out of memor错误;于是换个办法,用python调用shell命令shell调用denseflow.bin可执行文件来提取连续帧和光流。

参考的有用博文:

python调用shell命令常用方法:https://www.cnblogs.com/pengpp/p/9833349.html

python利用os模块创建文件夹:https://www.cnblogs.com/monsteryang/p/6574550.html

  • 5
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 21
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 21
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值