FlowNet2.0 安装指南

\(安装环境: \color{red}{Ubuntu16.04 + CUDA8.0 + cuDNN5.0}\)
安装 CUDA
CUDA 安装准备
首先查看是否电脑具有支持 CUDA 的 GPU
lspci | grep -i nvidia
查看 Linux 版本信息与 gcc 版本
uname -m && cat /etc/*release && gcc --version
下载
下载 CUDA-8.0, 注意选取 deb(local)
版本, 如下图

安装 CUDA
sudo dpkg -i cuda-repo-ubuntu1604-8-0-local-ga2_8.0.61-1_amd64.deb
sudo apt-key add /var/cuda-repo-8-0-local-ga2/7fa2af80.pub
sudo apt-key adv --fetch-keys http://developer.download.nvidia.com/compute/cuda/repos/ubuntu1604/x86_64/7fa2af80.pub
sudo apt-get update
sudo apt-get install cuda
环境设置
在 .bashrc 中加入
export PATH=/usr/local/cuda-8.0/bin${PATH:+:${PATH}}
export LD_LIBRARY_PATH=/usr/local/cuda-8.0/lib64 ${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}} # 64位系统
export LD_LIBRARY_PATH=/usr/local/cuda-8.0/lib ${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}} # 32位
安装 Persistence Daemon
The daemon approach provides a more elegant and robust solution to this problem than persistence mode.
/usr/bin/nvidia-persistenced --verbose
验证安装
查看 GPU 驱动和 CUDA 的版本信息
cat /proc/driver/nvidia/version && nvcc -V
执行 cuda-install-samples-8.0.sh
cuda-install-samples-8.0.sh ~
cd ~/NVIDIA_CUDA-8.0_Samples
make -j `nproc`
cd ~/NVIDIA_CUDA-8.0_Samples/bin/x86_64/linux/release
./deviceQuery
安装 cuDNN
注册 Nvidia 账号, Nvidia cuDNNv5,选择 cuDNN v5 Library for Linux
下载
tar -xzvf cudnn-8.0-linux-x64-v5.0-ga.tgz
sudo cp cuda/include/cudnn.h /usr/local/cuda/include
sudo cp cuda/lib64/libcudnn* /usr/local/cuda/lib64
sudo chmod a+r /usr/local/cuda/include/cudnn.h /usr/local/cuda/lib64/libcudnn*
验证安装
cp -r /usr/src/cudnn_samples_v7/ $HOME
cd $HOME/cudnn_samples_v7/mnistCUDNN
make clean && make `nproc`
./mnistCUDNN
如果看到如下信息, 恭喜你, 安装成功
Test passed!
环境依赖安装
sudo apt-get update
sudo apt-get install libprotobuf-dev libleveldb-dev libsnappy-dev libopencv-dev libhdf5-serial-dev protobuf-compiler -y
sudo apt-get install --no-install-recommends libboost-all-dev -y
sudo apt-get install libopenblas-dev liblapack-dev libatlas-base-dev -y
sudo apt-get install libgflags-dev libgoogle-glog-dev liblmdb-dev -y
sudo apt-get install git cmake build-essential -y
安装 opencv
下载 opencv
git clone https://github.com/opencv/opencv.git
cd opencv
git checkout 3.3.1
编译 opencv 3.3.1
mkdir build # 创建编译的文件目录
cd build
cmake -D CMAKE_BUILD_TYPE=Release -D CMAKE_INSTALL_PREFIX=/usr/local ..
make -j `nproc` # 编译
sudo make install
pkg-config --modversion opencv
opencv-python
推荐使用 cmake-gui
来配置编译选项, 比较方便, 如果你想指定特定版本的 python, 在 cmake-gui 配置也很方便, 不过没有什么必要, 即使你指定了特定的 python 环境(如 conda env), 系统还是会把 opencv 编译的动态库 cv2XX.so 放在系统位置 /usr/local/lib/pythonXX 下, 可以通过以下方式查看
find /usr/local/lib -type f -name "cv2*.so"
output: /usr/local/lib/python2.7/sist-packages/cv2.so
然后进入自己的 python 目录, 如 ~/anaconda2/env/opencv/lib/python2.7/site-packages/, 创建软连接, 以 python2.7为例
ln -s /usr/local/lib/python2.7/sist-packages/cv2.so cv2.so
使用 opencv-python, 像上面这么麻烦没什么必要, 直接使用 pip 就可以, 很方便
pip install opencv-python
pip install opencv-contrib-python
安装 flownet2.0
安装前准备
在安装 flownet2.0 时, 你的安装目录的组织可能和我不同, 所以这里我按照我的安装目录来说明, 这样便于我说明, 应该也便于你理解, 当你安装时, 你只需要简单的将我的安装目录替换成你自己的就可以了, 就是这么简单, 下面开始介绍了
首先介绍下我的安装目录是
install_dir = /home/wangbin/github/
cd /home/wangbin/github/
git clone https://github.com/lmb-freiburg/flownet2
cd flownet2
cp Makefile.config.example Makefile.config
下面我们需要考虑如何来配置 caffe 的 Makefile.config 了, 如果你是第一次接触 caffe, 可以参考 官方 docker 版本的 Makefile.config配置, 你可以直接使用官方的配置文件, 不过你也可以使用我修改的版本, 下面介绍
想必大家都比较熟悉 Anaconda, 由于我们要使用 pycaffe
, 所以我们需要配置 python, 貌似 caffe 对 python3 支持不好, 所以选择 python2.7. 为了不影响其他软件的运行, 我们使用 conda 配置一个虚拟 python2.7 的环境, Anaconda 安装见这里
conda create -n flownet2.0 python=2.7
conda install numpy
conda instaLL cython
conda install scipy
conda install scikit-image
pip install msgpack
pip install opencv-python
我的 Anaconda 安装目录是
/home/wangbin/software/anaconda2
然后修改 Makefile.config 中文件中的 python 相关变量
ANACONDA_HOME := $(HOME)/software/anaconda2/envs/flownet2
PYTHON_INCLUDE := $(ANACONDA_HOME)/include \
$(ANACONDA_HOME)/include/python2.7 \
$(ANACONDA_HOME)/lib/python2.7/site-packages/numpy/core/include
PYTHON_LIB := $(ANACONDA_HOME)/lib
LINKFLAGS := -Wl,-rpath,$(PYTHON_LIB)
便于参考这里贴出我的 Makefile.config 文件
同时修改 Makefile 文件的变量
LIBRARIES += glog gflags protobuf boost_system boost_filesystem m hdf5_serial_hl hdf5_serial opencv_core opencv_highgui opencv_imgproc opencv_imgcodecs
NVCCFLAGS += -D_FORCE_INLINES -ccbin=$(CXX) -Xcompiler -fPIC $(COMMON_FLAGS)
编译安装 caffe
make -j `nproc` all tools pycaffe
编译成功之后, 将 pycaffe 加入 $PYTHONPATH 中
sudo echo export PYTHONPATH=:$PYTHONPATH:"~/github/flownet2/python" >> ~/.bashrc
配置环境, 每次使用 flownet2.0 时, 都要进行如下操作
source set-env.sh
重要: 使用上述脚本建立 flownet2的环境, 要确保你的 python 路径和系统路径中不包含其他版本的 caffe
下载模型
cd models
./download-models.sh
使用 image pair 测试模型
FlyingChairs 测试数据位于
/home/wangbin/github/flownet2/data/FlyingChairs_examples
为了后续便于操作, 我们首先将该目录下的下的第一对样例数据中的复制到 flownet2/models 目录下
cp /home/wangbin/github/flownet2/data/FlyingChairs_examples/0000000-* /home/wangbin/github/flownet2/models/
0000000-gt.flo 是 ground-truth 光流
(2通道)光流, 我们是无法通过图片查看器 eog
打开, 我们需要将光流图转化为 RGB 图, 转化工具下面介绍
光流可视化工具
[Middlebury 光流可视化工具] (http://vision.middlebury.edu/flow/submit/)
具体使用见 flow-code文件夹中的 README.md
wget http://vision.middlebury.edu/flow/code/flow-code.zip
unzip flow-code.zip
cd flow-code/imageLib
make -j `nproc`
cd ..
make -j `nproc`
使用生成的可执行文件 color_flow
将光流图转化成 RGB 图, 图的颜色表示运动方向, 颜色的深浅表示的是运动的快慢
usage: ./color_flow [-quiet] in.flo out.png [maxmotion]
下面使用 color_flow 将第一对 FlyingChairs 的 ground-truth 光流 0000000-gt.flo 转化为 RGB 图
./color_flow 0000000-gt.flo 0000000-gt.png

光流可视化代码(python)
如果想要在代码中使用光流可视化, 有个简单的 python 版本可以使用(使用 opencv), 简单的没法相信,
背景比较亮的版本
def visualize_optical_flow(frame1, blob):
# optical flow visualization 光流可视化
# 由于frame的数据类型为np.uint8 即 usigned char, 最大存储值为255, 如果赋值为256, 结果为 0,
# 也就是说及时赋值很大, 也会被截断
# 对于 饱和度s 和亮度v 而言, 最大值是255, s = 255 色相最饱和, v = 255, 图片最亮
# 而对与颜色而言, opencv3中, (0, 180) 就会把所有颜色域过一遍, 所以这里下面就算角度时会除以 2
# np.zeros_like(): Return an array of zeros with the same shape and type as a given array.
hsv = np.zeros_like(frame1)
# cv2.cartToPolar(x, y): brief Calculates the magnitude and angle of 2D vectors.
mag, ang = cv2.cartToPolar(blob[..., 0], blob[..., 1])
# degree to rad: degree*180/np.pi
hsv[..., 0] = (ang * 180 / np.pi) / 2
# brief Normalizes the norm or value range of an array
# norm_type = cv2.NORM_MINMAX, 即将值标准化到(0, 255)
hsv[..., 1] = cv2.normalize(mag, None, 0, 255, cv2.NORM_MINMAX)
# 亮度为255
hsv[..., 2] = 255
bgr = cv2.cvtColor(hsv, cv2.COLOR_HSV2BGR)
return bgr
背景比较暗的版本
def visualize_optical_flow(frame1, blob):
# optical flow visualization
hsv = np.zeros_like(frame1)
rad, ang = cv2.cartToPolar(blob[..., 0], blob[..., 1])
hsv[..., 0] = ang * 180 / np.pi / 2
hsv[..., 2] = cv2.normalize(rad, None, 0, 255, cv2.NORM_MINMAX)
hsv[..., 1] = 255
rgb = cv2.cvtColor(hsv, cv2.COLOR_HSV2BGR)
cv2.imshow('flow', rgb)
HSV 调色板
推荐看学会调色,从理解HSL面板开始, 了解 HSV 相关知识

测试 image pair
将 flownet2.0/script 目录加入 PATH 中, 便于我们任何目录下使用 script 下的脚本
sudo echo export PATH=$PATH:"/home/wangbin/github/flownet2/scripts" >> ~/.bashrc
cd models
run-flownet.py FlowNet2/FlowNet2_weights.caffemodel.h5 \
FlowNet2/FlowNet2_deploy.prototxt.template \
0000000-img0.ppm 0000000-img1.ppm 0000000-pre.flo
./color_flow 0000000-pre.flo 0000000-pre.png
eog 0000000-pre.png
视频输入源
我们使用 flownet2.0 处理大部分是视频内容, 我这里写了一份关于将视频作为输入源的代码, 分享在 github 上, 有需要的自取, 这部分虽然简短, 不过应该是本博客最有价值的部分了
github flownet2_videocapture.py
参考