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中还有创建存储RGB和FLOW的文件夹的功能;
- 原本用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