\(安装环境: \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) 版本, 如下图

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

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

参考

  1. install opencv on ubuntu
  2. 学会调色,从理解HSL面板开始
  3. Ubuntu16.04 Caffe 安装步骤记录(超详尽)
  4. Github FlowNet2





FlowNet2.0 安装指南的更多相关文章

  1. flownet2.0 caffe anaconda2 编译安装

    1. 下载flownet2.0源码到指定目录 cd /home/zzq/saliency_models/deep_optical_flow git clone https://github.com/l ...

  2. FlowNet2.0论文笔记

    原论文标题:FlowNet 2.0: Evolution of Optical Flow Estimation with Deep Networks 文章是对FlowNet的进一步改进,主要贡献为如下 ...

  3. cord-in-a-box 2.0 安装指南

    [TOC] 这篇文章简要介绍了 Ciab2.0 的安装. 包括硬件, 软件环境的选择, Ciab2.0的实际部署架构, 安装过程等. 下面就先对 Ciab2.0 部署环境做简要介绍. 1. 概述 这一 ...

  4. Hive 0.12.0安装指南

    目录 目录 1 1. 前言 1 2. 约定 1 3. 服务端口 2 4. 安装MySQL 2 4.1. 安装MySQL 2 4.2. 创建Hive元数据库 2 5. 安装步骤 3 5.1. 下载Hiv ...

  5. HBase-1.2.1和Phoenix-4.7.0分布式安装指南

    目录 目录 1 1. 前言 2 2. 概念 2 2.1. Region name 2 3. 约定 2 4. 相关端口 3 5. 下载HBase 3 6. 安装步骤 3 6.1. 修改conf/regi ...

  6. Spark 0.9.1和Shark 0.9.1分布式安装指南

    目录 目录 1 1. 约定 1 2. 安装Scala 1 2.1. 下载 2 2.2. 安装 2 2.3. 设置环境变量 2 3. 安装Spark 2 3.1. 部署 2 3.2. 下载 3 3.3. ...

  7. HBase-0.98.0和Phoenix-4.0.0分布式安装指南

    目录 目录 1 1. 前言 1 2. 约定 2 3. 相关端口 2 4. 下载HBase 2 5. 安装步骤 2 5.1. 修改conf/regionservers 2 5.2. 修改conf/hba ...

  8. Yarn上运行spark-1.6.0

    目录 目录 1 1. 约定 1 2. 安装Scala 1 2.1. 下载 2 2.2. 安装 2 2.3. 设置环境变量 2 3. 安装Spark 2 3.1. 下载 2 3.2. 安装 2 3.3. ...

  9. Hive 1.2.1&Spark&Sqoop安装指南

    目录 目录 1 1. 前言 1 2. 约定 2 3. 服务端口 2 4. 安装MySQL 2 4.1. 安装MySQL 2 4.2. 创建Hive元数据库 4 5. 安装步骤 5 5.1. 下载Hiv ...

随机推荐

  1. Storm常用的类

    BaseRichSpout (消息生产者)BaseBasicBolt (消息处理者)TopologyBuilder (拓扑的构建器)Values (将数据存放到values ,发送到下个组件)Tupl ...

  2. 基于python调用libvirt API

    基于python调用libvirt API 1.程序代码 #!/usr/bin/python import libvirt import sys def createConnection(): con ...

  3. mybatis_异常

    1.HTTP Status 500 - Request processing failed; nested exception is org.apache.ibatis.binding.Binding ...

  4. 网络编程基础【day09】:socket接收大数据(五)

    本节内容 1.概述 2.socket接收大数据 3.中文字符的坑 一.概述 上篇博客写到了,就是说当服务器发送至客户端的数据,大于客户端设置的数据,则就会把数据服务端发过来的数据剩余数据存在IO缓冲区 ...

  5. "Error 0162 - Setup data integrity check failure" after updating BIOS via Thinkvantage

    Start the computer and start pressing F1 and get into set up. In setup press F9 for default settings ...

  6. Linux记录-lsof打开文件工具常用操作

    lsof `which httpd` //那个进程在使用apache的可执行文件 lsof /etc/passwd //那个进程在占用/etc/passwd lsof /dev/hda6 //那个进程 ...

  7. oldboys21day03

    # 1.有变量name = "aleX leNb " 完成如下操作:'''name = "aleX leNb "'''# 移除 name 变量对应的值两边的空格 ...

  8. 错误 1 未能找到类型或命名空间名称“DataPager”(是否缺少 using 指令或程序集引用?)

    鄙人在设计器SearchTab.xaml中添加了如下一个分页控件: <sdk:DataPager x:Name="dataPagerPrj" Grid.Row="3 ...

  9. SpringBoot系列: Redis 共享Session

    Web项目Session管理是一个很重要的话题, 涉及到系统横向扩展, SpringBoot已经为共享Session很好的解决方案, 这篇文章关注使用Redis共享会话, 同时这也是最常用的方法. = ...

  10. Java面试经典题目合集

    32 1.”static”关键字是什么意思?Java中是否可以覆盖(override)一个private或者是static的方法? “static”关键字表明一个成员变量或者是成员方法与类相关,可以在 ...