本篇博客介绍如何安装denseflow工具,由https://github.com/yjxiong/dense_flow提供。
这个工具可以对视频进行截帧,并计算光流保存到本地,使用了GPU编译的OpenCV,所以提取速度很快,后续可以用于行为动作识别中,例如two-stream网络、TSN等。
官方提供的安装方式很简单,如下,编译后就可以了,但往往不尽如人意,每次编译都会遇到各种各样的问题,因此,本篇博客记录过程中遇到的问题以及解决方案。
首先,denseflow的readme一开始就说了,有一个依赖库需要安装。如下:
Depencies:
LibZip: to install on ubuntuapt-get install libzip-dev
on macbrew 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,现在,在你的指定路径下,已经出现了如下内容:
如果你现在很高兴,决定去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!
为什么?现在我们装好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源码里修改了。
在你下载的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阶段。
当你开始按照官网提供的步骤,如下,开始编译时,
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
.........
你发现,少了一些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
此时,终于没有错误了,撒花!
现在,我们来试一下,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下看看结果有没有,
都是好的。
下面再测试下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
如下,我对脚本进行了修改,
执行后,会有提示:
现在去看下,是不是真的好了,
好了,现在为止,算是真的完结了,撒花✿✿ヽ(°▽°)ノ✿