dense_flow光流特征加速提取
背景
本文主要介绍使用OpenCV的TV-L1算法提取视频的光流。近年来很多SOTA视频动作识别模型都采用RGB-光流的两线架构,能为动作特性的捕捉带来可观的提升。然而在像UCF101这样数以万计的视频数据集上提取光流则需要非常大的计算量。
利用opencv自带的TVL1函数,在CPU上8线程提取速度为 2 frame/s,这对于I3D要求的帧率10 frame/s来说,处理时长比原视频都长,不能用来做实时任务处理。因此,利用GPU进行加速光流提取则非常有必要。
用conda和pip安装的opencv-python默认是不使用CUDA的,因此需要从C++源代码编译。本文参考mmlab的denseflow代码,介绍安装带有CUDA支持的OpenCV并加速提取光流的方法。
对同一视频,仅花费107s同时提取完RGB和光流,相比博主之前在cpu上用openCV先抓取rgb,再计算flow的一个多小时,效率提高很多。
一、主要参考
open-mmlab官方代码
官方 install guide
二、主要依赖
Dependencies:
- CUDA (driver version > 400)
- OpenCV v3/v4
- Boost
- HDF5 (Optional)
三、安装步骤
1.CUDA (driver version > 400)
确保cuda的驱动版本大于400,查看方法如下:
nvcc –version
对照自己的CUDA 查英伟达驱动版本对照表
如上图所示,CUDA 10以上的版本驱动都满足大于400 的条件。
2. 安装依赖和denseflow源码
主要参考install参考手册
# ZZROOT is the root dir of all the installation
# you may put these lines into your `.bashrc` or `.zshrc`.
export ZZROOT=$HOME/app
export PATH=$ZZROOT/bin:$PATH
export LD_LIBRARY_PATH=$ZZROOT/lib:$ZZROOT/lib64:$LD_LIBRARY_PATH
# fetch install scripts
git clone https://github.com/innerlee/setup.git
cd setup
# opencv depends on ffmpeg for video decoding
# ffmpeg depends on nasm, yasm, libx264, libx265, libvpx
./zznasm.sh
./zzyasm.sh
./zzlibx264.sh
./zzlibx265.sh
./zzlibvpx.sh
# finally install ffmpeg
./zzffmpeg.sh
# install opencv 4.3.0
./zzopencv.sh
# you may put this line into your .bashrc
export OpenCV_DIR=$ZZROOT
# install boost
./zzboost.sh
# you may put this line into your .bashrc
export BOOST_ROOT=$ZZROOT
# install hdf5
./zzhdf5.sh
# finally, install denseflow
./zzdenseflow.sh
建立如上sh文件,利用sed消除win和linux的文本差异文本差异后,执行sh文件。
sed -i 's/\r//' denseflow.sh
bash denseflow.sh
3. 安装bug及调试经验
3.1 下载停顿(翻Q)
安装过程中服务器没有fan墙的能力,遇到如下图下载等待的问题,复制网址自己下载好压缩文件,放在app文件下的download文件夹下:
大概需要这些包(有的能自动下载,有的需要手动下载放到这里,多次运行sh文件就能发现哪些需要手动):
3.2 出现CMake版本低的问题:
CMake Error at CMakeLists.txt:1 (cmake_minimum_required):
CMake 3.12 or higher is required. You are running version 3.10.2
解决方法参考:
sudo apt remove cmake #删除旧版本的cmake
sudo apt-get install build-essential libssl-dev
wget https://github.com/Kitware/CMake/releases/download/v3.20.0/cmake-3.20.0.tar.gz
tar -zxvf cmake-3.20.0.tar.gz
cd cmake-3.20.0
./bootstrap #出问题参考下方3.3
make
sudo make install
cmake --version #查看升级完的版本
3.3 cmake报错Could NOT find OpenSSL
在执行 ./bootstrap 过程中出现如下错误
安装cmake报错Could NOT find OpenSSL
解决方法:
使用指令apt-get install libssl-dev或 yum install libssl-dev安装openssl
apt-get install libssl-dev
3.4 安装完毕
解决上述bug,重新运行 bash denseflow.sh ,指导出现如下结果表示安装成功。
四、光流提取(jpg格式)
先进行环境变量赋值:
$ export ZZROOT=$HOME/app
$ PATH=$ZZROOT/bin:$PATH
$ LD_LIBRARY_PATH=$ZZROOT/lib:$ZZROOT/lib64:$LD_LIBRARY_PATH
提取光流特征:
denseflow test.mp4 -b=20 -a=tvl1 -s=1 -if -v
仅花费107s同时提取完RGB和光流,相比博主之前在cpu上用openCV先抓取rgb,再计算flow的一个多小时,效率提高很多。
root@7fe7e3c5b04ed77cee25e217fcf3f557-taskrole1-0:/gemini#
load frames exit.
1 videos (865 frames, 864 tvl1 flows) processed, using 107.999s, decoding speed 8.00933fps, flow speed 8.00007fps
五、提取为HDF5格式(可选)
需要将app/src/denseflow/CMakelist.txt里的OFF 改为 ON(源文件里为OFF,修改后如下下图)
修改完后,用官方代码重新编译(注意这里同样把hdf5设置打开为yes):
cd denseflow && mkdir build && cd build
cmake -DCMAKE_INSTALL_PREFIX=$HOME/app -DUSE_HDF5=yes -DUSE_NVFLOW=yes..
make -j
make install
编译完毕后,即可提取图片光流为hdf5文件。
五、TSN中的GPU提取光流代码(补充)
其实相差不多,可以参考接口程序,用于优化自己的项目:
TSN-denseflow