\(安裝環境: \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
參考