【光流提取】linux中MMLab 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++源代码编译。本文参考mmlabdenseflow代码,介绍安装带有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/src/denseflow_gpu.cpp文件中更改增加两行代码:

#define USE_HDF5 1
#define USE_NVFLOW 1

如下图所示:
在这里插入图片描述

修改完后,用如下编译代码重新编译(注意这里同样把hdf5设置打开为yes):

cd denseflow 
cmake -DCMAKE_INSTALL_PREFIX=$HOME/app -DUSE_HDF5=yes -DUSE_NVFLOW=yes
make -j
make install

编译完毕后,即可提取图片光流为hdf5文件。

五、TSN中的GPU提取光流代码(补充)

其实相差不多,可以参考接口程序,用于优化自己的项目:
TSN-denseflow

  • 3
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 9
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值