FlowNet2.0 安装指南

-w387

\(安装环境: \color{red}{Ubuntu16.04 + CUDA8.0 + cuDNN5.0}\)

安装 CUDA

CUDA 安装准备

CUDA 官方安装文档

首先查看是否电脑具有支持 CUDA 的 GPU

lspci | grep -i nvidia

查看 Linux 版本信息与 gcc 版本

uname -m && cat /etc/*release && gcc --version

下载

下载 CUDA-8.0, 注意选取 deb(local) 版本, 如下图

屏幕快照 2018-06-15 上午9.59.40-w593

安装 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

, 然后在 目录下会出现一个文件夹NVIDIA_CUDA-8.0_Samples

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 下载

cuDNN 官方安装指南

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  

安装 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

0000000-gt

光流可视化代码(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)

推荐看学会调色,从理解HSL面板开始, 了解 HSV 相关知识

-w455

测试 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





posted @ 2018-06-15 13:14 NowGood 阅读(...) 评论(...) 编辑 收藏