denseflow视频截帧提取光流工具

本篇博客介绍如何安装denseflow工具,由https://github.com/yjxiong/dense_flow提供。

这个工具可以对视频进行截帧,并计算光流保存到本地,使用了GPU编译的OpenCV,所以提取速度很快,后续可以用于行为动作识别中,例如two-stream网络、TSN等。


1、简单介绍

官方提供的安装方式很简单,如下,编译后就可以了,但往往不尽如人意,每次编译都会遇到各种各样的问题,因此,本篇博客记录过程中遇到的问题以及解决方案。

denseflow视频截帧提取光流工具_第1张图片

2、预备工作

首先,denseflow的readme一开始就说了,有一个依赖库需要安装。如下:

Depencies:
LibZip: to install on ubuntu apt-get install libzip-dev
on mac brew install libzip

这里说下linux上不使用apt-get安装的方法,原因为什么不这样做呢,因为一般linux上有很多账号,出了管理员外我们没有权限进行apt-get,而且,apt-get很容易出问题,或者对之前的环境变量造成影响,对其他账号的环境也可能有影响。因此为了避免这些问题,还是在自己账号下编译一个,只供自己可用的。因此,这里我们可以选择编译安装。

库链接:https://libzip.org/download/

你可以选择任意一个下载后解压,里面有INSTALL.md,也可以去GitHub上下载,链接为:https://github.com/nih-at/libzip/

下面说下安装libzip的过程。人家INSTALL.md中也写的很清楚了,如下:

mkdir build
cd build
cmake ..
make
make test
make install

如果你没有管理员权限,那么在你make install的时候,就会报以下的错误:

-- Install configuration: ""
CMake Error at cmake_install.cmake:36 (file):
  file cannot create directory: /usr/local/lib64/pkgconfig.  Maybe need
  administrative privileges.

make: *** [install] Error 1

因此,我们需要自己指定路径。

这里说下如何自己指定路径cmake,这样编译后的路径就不会是usr/local了。不会影响全局。改后的完整安装命令如下:

mkdir build
cd build
cmake -DCMAKE_INSTALL_PREFIX=你自己的路径 ..
make
make test
make install

比如,你的路径可以是/home/账户名/libzip_tools/,下面都以此举例。

这里,在make test的时候可能会报错,如下,不用理会,只是个测试而已。后面继续。

98% tests passed, 3 tests failed out of 128

Total Test time (real) =  63.38 sec

The following tests FAILED:
	 21 - clone-fs-add.test (Not Run)
	 22 - clone-fs-delete.test (Not Run)
	 23 - clone-fs-replace.test (Not Run)
Errors while running CTest
make: *** [test] Error 8

好了,到现在为止,你已经install好了libzip,现在,在你的指定路径下,已经出现了如下内容:

denseflow视频截帧提取光流工具_第2张图片

如果你现在很高兴,决定去install denseflow了,你会遇到下面这个问题,

CMake Error: The following variables are used in this project, but they are set to NOTFOUND.
Please set them or make sure they are set and tested correctly in the CMake files:
LIBZIP_INCLUDE_DIR_ZIP
   used as include directory in directory .....
   ....
LIBZIP_INCLUDE_DIR_ZIPCONF
   used as include directory in directory .....
   ....
LIBZIP_LIBRARY
   linked by target .....
   ....
-- Configuring incomplete, errors occurred!

denseflow视频截帧提取光流工具_第3张图片

为什么?现在我们装好libzip后,但是linux还不知道你的到底装哪了啊,你需要在自己的系统环境变量中添加这一路径。这里的lib64就是你要引入的路径了。

具体命令如下:

首先对.bashrc文件进行修改,先打开
vim ~/.bashrc

然后添加如下信息:
export PKG_CONFIG_PATH=前面指定的路径/lib64/pkgconfig/
也就是说:
export PKG_CONFIG_PATH=/home/账户名/libzip_tools/lib64/pkgconfig/

然后修改完保存,这里要让环境变量立即生效,要么重启,重启是不可能的,
所以,执行如下命令:
source ~/.bashrc

好了,此时你又高兴的开始install denseflow,发现还是有问题,如下

CMake Error: The following variables are used in this project, but they are set to NOTFOUND.
Please set them or make sure they are set and tested correctly in the CMake files:
LIBZIP_LIBRARY
   linked by target .....
   ....
-- Configuring incomplete, errors occurred!
......

denseflow视频截帧提取光流工具_第4张图片

跟上面一样,第三个怎么还是找不到,这里,需要去denseflow源码里修改了。

在你下载的denseflow中,有一个cmake文件夹,一路cd,

cd cmake
cd Modules
vim FindLibZip.cmake

然后在FindLibZip.cmake中进行修改,把你指定的路径直接写入进去,即,将

find_library(LIBZIP_LIBRARY
    NAMES zip)

在这里插入图片描述

改为,

find_library(LIBZIP_LIBRARY
    NAMES zip
    HINTS /home/账户名/libzip_tools//lib64)

好了,至此,你的libzip之路已经完成了,撒花花!

下面进入install denseflow阶段。

3、安装

当你开始按照官网提供的步骤,如下,开始编译时,

git clone --recursive http://github.com/yjxiong/dense_flow
mkdir build && cd build
cmake .. && make -j

你会发现,在你cmake的时候,会出现这些错误,

/usr/bin/ld: cannot find -lopencv_dep_nppial
/usr/bin/ld: cannot find -lopencv_dep_nppicc
/usr/bin/ld: cannot find -lopencv_dep_nppicom
/usr/bin/ld: cannot find -lopencv_dep_nppidei
/usr/bin/ld: cannot find -lopencv_dep_nppif
/usr/bin/ld: cannot find -lopencv_dep_nppig
/usr/bin/ld: cannot find -lopencv_dep_nppim
/usr/bin/ld: cannot find -lopencv_dep_nppist
/usr/bin/ld: cannot find -lopencv_dep_nppisu
/usr/bin/ld: cannot find -lopencv_dep_nppitc
collect2: error: ld returned 1 exit status
make[2]: *** [extract_cpu] Error 1
make[1]: *** [CMakeFiles/extract_cpu.dir/all] Error 2
make: *** [all] Error 2
.........

denseflow视频截帧提取光流工具_第5张图片

你发现,少了一些opencv中的库,这时你去你的opencv路径下找,发现也没有这些库,咋办,

有人给出了解决方法,https://stackoverflow.com/questions/48373922/cannot-find-nppi-series-when-building-dense-flow-with-opencv2-4-13

 ln -s /usr/local/cuda-9.2/targets/x86_64-linux/lib/libnppial.so /usr/local/lib/libopencv_dep_nppial.so
 ln -s /usr/local/cuda-9.2/targets/x86_64-linux/lib/libnppicc.so /usr/local/lib/libopencv_dep_nppicc.so
 ln -s /usr/local/cuda-9.2/targets/x86_64-linux/lib/libnppicom.so /usr/local/lib/libopencv_dep_nppicom.so
 ln -s /usr/local/cuda-9.2/targets/x86_64-linux/lib/libnppidei.so /usr/local/lib/libopencv_dep_nppidei.so
 ln -s /usr/local/cuda-9.2/targets/x86_64-linux/lib/libnppif.so /usr/local/lib/libopencv_dep_nppif.so
 ln -s /usr/local/cuda-9.2/targets/x86_64-linux/lib/libnppig.so /usr/local/lib/libopencv_dep_nppig.so
 ln -s /usr/local/cuda-9.2/targets/x86_64-linux/lib/libnppim.so /usr/local/lib/libopencv_dep_nppim.so
 ln -s /usr/local/cuda-9.2/targets/x86_64-linux/lib/libnppist.so /usr/local/lib/libopencv_dep_nppist.so
 ln -s /usr/local/cuda-9.2/targets/x86_64-linux/lib/libnppisu.so /usr/local/lib/libopencv_dep_nppisu.so
 ln -s /usr/local/cuda-9.2/targets/x86_64-linux/lib/libnppitc.so /usr/local/lib/libopencv_dep_nppitc.so

将linux安装的cuda中的库文件直接软连接到lib库下,当然,这个方法对我行不通,没有管理员权限,那咋办,

要不然直接硬拷贝到自己的路径下,在CMakeLists.txt文件里指定路径。

这个方法也进行了尝试,应该是可行的,但是无奈对cmake不太熟,搞了半天也没指定好路径,遂放弃。

此时的我万念俱灰,终于一位小伙伴告知了另一种解决方法,

cmake过程中,取寻找-lopencv_dep_nppial等动态链接库,
但是没有找到,所以需要找到中间文件link.txt,
指明这几个动态链接库所在的地址

具体操作就是,

在执行完

mkdir build 
cd build
cmake .. 

后,build路径下生成了新的文件,分别到以下4个路径的link.txt文件中进行修改,

cd dense_flow/build/CMakeFiles/extract_cpu.dir
cd dense_flow/build/CMakeFiles/extract_gpu.dir
cd dense_flow/build/CMakeFiles/extract_warp_gpu.dir
cd dense_flow/build/CMakeFiles/pydenseflow.dir

将link.txt文件中的

-lopencv_dep_nppial -lopencv_dep_nppicc -lopencv_dep_nppicom -lopencv_dep_nppidei -lopencv_dep_nppif -lopencv_dep_nppig -lopencv_dep_nppim  -lopencv_dep_nppist -lopencv_dep_nppisu -lopencv_dep_nppitc

替换为:

/usr/local/cuda-9.0/lib64/libnppial.so /usr/local/cuda-9.0/lib64/libnppicc.so /usr/local/cuda-9.0/lib64/libnppicom.so /usr/local/cuda-9.0/lib64/libnppidei.so /usr/local/cuda-9.0/lib64/libnppif.so /usr/local/cuda-9.0/lib64/libnppig.so /usr/local/cuda-9.0/lib64/libnppim.so /usr/local/cuda-9.0/lib64/libnppist.so /usr/local/cuda-9.0/lib64/libnppisu.so /usr/local/cuda-9.0/lib64/libnppitc.so

四个link.txt都修改完后,不需要重新cmake,直接进行make,

make -j

此时,终于没有错误了,撒花!

4、测试

现在,我们来试一下,denseflow可不可以用了。

首先单独测试:

命令:
./extract_gpu -f test.avi -x tmp/flow_x -y tmp/flow_y -i tmp/image -b 20 -t 1 -d 0 -s 1 -o dir

参数解释:
test.avi: input video
tmp: folder containing RGB images and optical
flow images dir: output generated images to folder. if set to zip,
will write images to zip files instead.`

build/extract_gpu -f /my_examples/test.avi -x my_examples/result/flow_x -y my_examples/result/flow_y -i my_examples/result/image -b 20 -t 1 -d 0 -s 1 -o dir -w 256 -h 256

现在去我的my_examples/result下看看结果有没有,

denseflow视频截帧提取光流工具_第6张图片

都是好的。

下面再测试下tsn中的截帧提取光流脚本,将你编译好的denseflow复制到tsn路径下的lib文件夹中,然后执行scripts/extract_optical_flow.sh脚本

命令:
bash scripts/extract_optical_flow.sh SRC_FOLDER OUT_FOLDER NUM_WORKER

参数解释:
SRC_FOLDER points to the folder where you put the video dataset
OUT_FOLDER points to the root folder where the extracted frames and optical images will be put in
NUM_WORKER specifies the number of GPU to use in parallel for flow extraction, must be larger than 1

如下,我对脚本进行了修改,

在这里插入图片描述

执行后,会有提示:

denseflow视频截帧提取光流工具_第7张图片

现在去看下,是不是真的好了,

denseflow视频截帧提取光流工具_第8张图片

denseflow视频截帧提取光流工具_第9张图片

好了,现在为止,算是真的完结了,撒花✿✿ヽ(°▽°)ノ✿


你可能感兴趣的:(深度学习,OpenCV,图像处理,计算机视觉,动作识别)