doppia調試之旅

        前些天,導師讓調一下 dpm 的 cuda 版本 doppia,咱們專門爲這個程序買了一塊支持 cuda 的顯卡,第一遍在臺式機上調試的過程真心是很受傷,好在最後終於成功了,並且後來在本身筆記本上調試 doppia 的時候只用了半天不到的時間就調通了。因此想寫一篇博客記錄一下調試過程當中遇到的問題,以避免之後忘了,同時也想爲後來想調doppia的朋友做一些參考。爲了寫這個教程,我特地把本身已經調試好 doppia 的 ubuntu 系統重裝了,不要說我閒的 閉嘴。好了,廢話很少說,直接上乾貨。

        首先,下載doppia,它有v1和v2兩個版本,我最開始調的是v1,可是因爲調了好幾天都沒有調成功,我改調試v2,沒想到居然成功了,如今想一想,v1或許沒有那麼難調試。因此,我以v2爲例,介紹一下調試過程當中遇到的問題及解決方法。doppia 下載網址:  https://bitbucket.org/rodrigob/doppia/downloads/?tab=branches   ,它有 zip, gz, bz2 三中壓縮包格式,隨便選擇一種下載。而後進入壓縮包所在路徑,解壓出來(名爲 rodrigob-doppia-50700e4f6df0, 我把它重命名爲 doppia-v2)。進入都doppia-v2,裏面有一個名爲readme.text 的文件,它詳細介紹了配置 doppia的條件的及步驟。html

前提條件(翻譯readme.text 原文):python

Linux 系統(理論上在Windows上也能夠運行,但事實證實不是個好主意)linux

C++ 和 CUDA 編譯環境ios

帶有 CUDA 2.0 新能的GPUbootstrap

boost 庫ubuntu

google protocol buffer小程序

opencv(2.4版本,在更老的版本上也能運行,但3.0目前不支持)app

libjpeg, libpngide

libSDL測試

cMake >= 2.4.3

這些條件中最重要的是支持支持cuda 的顯卡,這是硬件條件,所在安裝以前必定要確保本身電腦的顯卡(須要時NVIDIA類型的顯卡)型號支持cuda,不然是不會安裝成功的。其它的條件都是相應的軟件版本,不須要擔憂。對於如何查看本身電腦的顯卡是否支持cuda,我推薦兩位做者的博客,參考1 ; 參考2 。這兩位做者的博客是給我幫助最多,可是當我徹底按照他們的教程去操做是,老是不能像他們那麼順利,這很正常,由於各人的電腦版本,環境各不相同。因此我要綜合多爲做者的參考,寫一個更加詳細的教程,但願對你們有幫助。下面說一下個人系統環境: ubuntu14.04 + cuda7.0 + opencv2.4.10 + boost_1_57_0 .   

上面兩位做者的安裝方法不一樣(一個是經過 .deb 安裝包,一個是經過 runfile 安裝的),個人臺式機用.deb 方式按照 參考1 方式老是出問題,而後我用 參考2 方式安裝成功了,而個人筆記本用 .runfile 方式裝出了點問題,但用 .deb 方式能正常安裝(感受任什麼時候候這兩種方法總有一種可以成功)。有一點我強調一下參考2中做者的觀點,每進行一項操做,都要檢查該操做是否成功

CUDA 安裝:

cuda 下載網址,https://developer.nvidia.com/cuda-downloads  這是參考1裏面的做者的cuda下載網址,如今的提供的版本是cuda8.0的,估計之後可能會升級成更高版本。根據本身的版本信息,選擇相應的cuda版本(我須要的版本是:Linux->x86_64->Ubuntu->deb(local))  讀者也能夠在個人百度雲裏下載   cuda7.0+opencv2.4.10+boost1.57 for ubuntu1404  密碼: d169  (這是我筆記本安裝的各類庫的版本)。 以參考1 做者的方法爲例,因爲我是新裝的系統,卸載舊驅動這一步能夠省去了。

在終端輸入:  g++ --version

系統提示沒有安裝,經過   sudo apt-get install g++   安裝 g++

再此輸入: g++ --version 會顯示g++ 的版本,說明g++ 安裝成功;而後 gcc --version 會顯示gcc的版本信息(gcc應該是ubuntu自帶的)

終端輸入: Ctrl+Alt+F1 進入tty1,輸入用戶名和密碼進入:

關閉桌面管理:(在tty1裏面安裝的時候這一步別忘了,我有一次安裝就是忘了這一步致使安裝完重啓以後黑屏,而後我使用修復模式,進入循環登陸的界面,最後沒辦法只能重裝一遍ubuntu)

sudo stop lightdm 

使用 cd 命令進入你 cuda 所在的目錄下,而後 sudo dpkg -i cuda- Tab鍵補全

sudo dpkg -i cuda-repo-ubuntu1404-7-0-local-ga2_7.0-28_amd64.deb(這是解包的命令,注意cuda-repo-... 根據本身的cuda版本而定,這個是我安裝的版本)

sudo apt-get update

sudo apt-get install cuda

重啓電腦(若是開機後沒有黑屏的話,若黑屏建議用  參考2 的方法安裝cuda試一試)(其實我安裝完cuda以後直接Ctrl+Alt+F7退出tty1以後再在終端輸入: sudo start lightdm ,而後重啓,貌似也成功了),進入終端輸入:

sudo start lightdm

安裝完成後,在 /usr/local/ 目錄下會出現cuda相關的文件夾。

而後,設置環境變量(推薦 參考2 的方法,爲了不每次開機都要從新設置環境變量,直接把它們寫入文件能夠一勞永逸):

終端輸入: sudo gedit /etc/profile

在打開的文件末尾添加(注意,我是cuda7.0的,因此一下寫的是7.0 若是你安裝的是其餘版本,只要把7.0改爲你對應的cuda版本號就能夠了):

export PATH=/usr/local/cuda-7.0/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/cuda7.0/lib64

終端輸入:  env


若是在打印的信息中出現了你添加的環境變量(cuda-7.0),說明添加成功(個人打印信息以下,抱歉ubuntu系統截圖質量太差)。

而後終端輸入: nvcc -V


若是出現以上信息,說到明目前爲止一切正常。接下來嘗試編譯cuda實例(最後一次強調,cuda-7.0 是我安裝的cuda版本對應的文件夾,讀者根據本身實際的cuda版本寫):

cd /usr/local/cuda-7.0/samples

sudo make all -j8

cd bin/x86_64/linux/release

上面三步完成了cuda實例的編譯,再輸入:

sudo ./deviceQuery

若是出現相似顯卡信息像參考1,2 做者貼出來的那樣(我就不貼了,後面還有不少要寫,以避免篇幅太長),而後,終端輸入 ls


這些綠色的文件都是能夠執行的, 例如

sudo ./Mandelbrot

顯示結果以下:


怎麼樣,是否是逼格很高(如上圖,根據它輸出的提示在終端輸入 s,j,r,g,b,...,j 會有不一樣的效果),到這裏說明你的cuda已經安裝成功了。

須要說明一下的是 那些綠色的文件中,帶有 _nvrct 的運行會報錯,以下


我沒有裝 libnvrtc 庫,因此會報錯,這裏先無論它。

boost 安裝:

接下來,咱們來安裝 boost 庫 (參考  boost 安裝教程)(我幾乎是所有安裝這個教程上作的,可是有些地方也出了點小錯誤,因此我要從新寫一個方便後來安裝者直接複製我教程裏代碼面向小白的教程)

boost下載 ,如今是boost_1.65 的版本,或者,讀者能夠下載我在百度雲裏的boost_1.57的版本(cuda7.0+opencv2.4.10+boost1.57 for ubuntu1404 密碼: d169),下載完以後,解壓,

安裝 boost 的依賴庫

sudo apt-get install mpi-default-dev

sudo apt-get install libicu-dev

sudo apt-get install python-dev

sudo apt-get install libbz2-dev

在解壓後的文件中搜索 user-config.jam 文件,打開,在末尾添加 (注意有分號):

# using mpi ;

經過cd命令,從終端進入 boost解壓後的文件目錄中,而後輸入:

sudo ./bootstrap.sh

sudo ./b2 -a -sHAVE_ICU=1

sudo ./b2 install

到這了就能夠了,我裝過好幾遍 boost,都沒失敗過。如今用一個小程序測試一下(參考  boost 參考測試程序):

新建一個文本 test.cpp , 將下面的代碼複製進去,保存

#include<iostream>
#include<boost/lexical_cast.hpp>
int main()
{
   int a = boost::lexical_cast<int>("123456");
   std::cout << a <<std::endl;
   return 0;
}

編譯:

g++ test.cpp -o test

運行:

./test

若是最終輸出 123456 說明boost庫安裝成功!

opencv 安裝:

再接下來,咱們要進行 opencv 的安裝。下載opencv,網址我在上面已經貼過了2.4.10的百度雲連接了。我以前是按照  doppia 之opencv 安裝 這個教程安裝的,可是不知什麼緣由每次老是在編譯到一半以後報錯,無奈之下,不得不找其餘方法。(這種方法讀者能夠做爲參考,畢竟不一樣電腦和庫的版本有區別,不見得在個人電腦上不行,在你的電腦上就不行)最終我參考了 ubuntu opencv安裝 ,他雖然介紹的是opencv3.0 的安裝,但用他的方法,我裝2.4 也成功了。

先安裝 opencv 依賴包:

sudo apt-get install build-essential

sudo apt-get install  libgtk2.0-dev libavcodec-dev libavformat-dev  libtiff4-dev  libswscale-dev libjasper-dev

上述包在安裝過程當中,若是你遇到關於依賴庫版本太高的問題, 輸入 sudo apt-get upgrade ,sudo apt-get update 命令,再從新試一下

若是 sudo apt-get upgrade 方法還不行,進這條連接試試  (上面兩步若是沒有遇到異常,直接看下面的過程)

安裝cmake:

sudo apt-get install cmake

而後

cd opencv-2.4.10 (進入解壓後的opencv文件夾,名稱根據本身opencv文件夾名稱寫)  
mkdir release  
cd release  
cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local ..  

make

若是遇到   Unsupported gpu architecture 'compute_11' 錯誤

cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local -D CUDA_GENERATION=Kepler ..

(上面的錯誤參考的這個連接:   http://blog.csdn.net/langb2014/article/details/51658744

而後接着  make  ,進行編譯(時間很長,大概須要30分鐘)

sudo make install

sudo ldconfig -v 

sudo su

gedit /etc/profile

在打開的文件末尾加上:

export PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/lib/pkgconfig

而後保存,退出。而後進入opencv 的 sample 目錄下的 c 目錄下(build_all.sh 所在的目錄),測試opencv是否安裝成功:

cd ../samples/c/

./build_all.sh

而後,我遇到了錯誤:


而後,找到了解決辦法.對這些文件創建軟連接:

sudo ln -s /usr/local/cuda-7.0/lib64/libcufft.so.7.0 /usr/local/lib/libcufft.so

sudo ln -s /usr/local/cuda-7.0/lib64/libnpps.so.7.0 /usr/local/lib/libnpps.so

sudo ln -s /usr/local/cuda-7.0/lib64/libnppi.so.7.0 /usr/local/lib/libnppi.so

sudo ln -s /usr/local/cuda-7.0/lib64/libnppc.so.7.0 /usr/local/lib/libnppc.so

sudo ln -s /usr/local/cuda-7.0/lib64/libcudart.so.7.0 /usr/local/lib/libcudart.so

  (參考  ./build_all.sh 出錯 -lcufft,-lnpps,-lnppi,-lnppc,-lcudart 解決辦法

再次  ./build_all.sh  就編譯經過了。輸入指令 ls ,顯示:


這些綠色的文件都是能夠經過 ./  方式執行的,我運行  ./adaptiveskindetecter  , 這是一個皮膚檢測的例子,結果顯示:


到這裏就說明,opencv 庫已經安裝成功了。讀者能夠測試一下,其它例子,挺好玩兒的。

doppia 調試:

最後,就要進入doppia調試的階段了(參考  doppia 調試)。

首先,安裝相應的依賴庫:

sudo apt-cache search libsdl

sudo apt-get install libsdl1.2-dev

sudo apt-get install libprotobuf-dev libprotoc-dev python-protobuf protobuf-compiler

從終端切換到 doppia 解壓後的文件夾中,運行

sudo sh ./generate_protocol_buffer_files.sh

我用的是都doppia v2版本,返回信息如參考教程的中那樣,它太長了,我就不貼返回結果了

而後,根據doppia 中 readme.text 的做者建議,先編譯 doppia目錄下的 src/applications/ground_estimation 中的文件,若是這裏面的文件都能編譯經過,說明cmake 和 C++ 部分工做正常。

切換到 ground_estimation 所在目錄

cmake -D CMAKE_BUILD_TYPE=RelWithDebInfo . && make

cmake . && make -j2 && ./ground_estimation -c test.config.ini

運行結果是一個小視頻,:


既然在 groud_estimation 中能運行成功,在stixel_world 中也能成功,進入stixel_world 目錄:  cd ../stixel_world     ,而後運行:

cmake . && make -j2 && OMP_NUM_THREADS=4 ./stixel_world -c fast.config.ini --gui.disable false

cmake . && make -j2 && OMP_NUM_THREADS=4 ./stixel_world -c fast_uv.config.ini --gui.disable false

結果也是一段小視頻,:


如今經過 cd ../objects_detection   進入objects_detection目錄,根據 做者文檔readme.text ,編譯

cmake -D CMAKE_BUILD_TYPE=RelWithDebInfo . && make -j2

 結果出錯,根據 doppia 調試  的參考,

進入doppia目錄下 ,打開 common_settings.cmake ,在該文件中的任意兩個 elseif塊 中,加入以下代碼,

elseif(${HOSTNAME} STREQUAL  "sun-thinkpad")
  message(STATUS "Using sun-thinkpad optimisation options")
  option(USE_GPU "Should the GPU be used ?" TRUE)
  set(CUDA_BUILD_CUBIN OFF)
  set(local_CUDA_LIB_DIR "/usr/local/cuda/lib64")
  set(cuda_LIBS "")

例如個人是,


注意  "sun-thinkpad" 是個人主機名,你須要將它改爲你電腦的主機名,若是你還不知道本身的主機名是什麼,那麼


這樣,第一個錯誤解決了

打開  doppia/src/helpers/data/DataSequence.hpp 文件(左邊doppia爲解壓縮後的doppia文件名稱),將 

doppia/src/helpers/data/DataSequence.hpp

粘貼到

#include "DataSequenceHeader.pb.h"

#include <google/protobuf/io/zero_copy_stream_impl.h>

這兩行之間,解決第二個錯誤。

進入doppia 目錄,搜索 SoftCascadeOverIntegralChannelsFastFractionalStage.cpp 文件,打開該文件,在行手輸入  

#include<iostream>

保存,關閉該文件,第三個錯誤解決。

至於 doppia 調試 中的第四個問題,這一問題在配置doppia過程當中我沒有遇到,可是上次我在臺式機上安裝的時候遇到了,不知道什麼緣由。  

解決這些問題以後在再次運行  cmake -D CMAKE_BUILD_TYPE=RelWithDebInfo . && make -j2    編譯經過以後,再編譯 

cmake . && make -j2 && OMP_NUM_THREADS=4 ./objects_detection -c cvpr2012_very_fast_over_bahnhof.config.ini --gui.disable false

結果是一個小視頻,


到這裏,最重要的部分就完成了,如今我介紹一下如何經過doppia識別本身的圖片序,首先先分析一下下面這條命令

cmake . && make -j2 && OMP_NUM_THREADS=4 ./objects_detection -c cvpr2012_very_fast_over_bahnhof.config.ini --gui.disable false

這條命令等價於一次運行下面三條指令

cmake .

make -j2   (-j2 至關於開兩條進程,它的編譯速度比直接 make 編譯要快,可是佔用的內存增長一倍)

OMP_NUM_THREADS=4 ./objects_detection -c cvpr2012_very_fast_over_bahnhof.config.ini --gui.disable false   (OMP_NUM_THREADS=4 至關於開四個 線程 ,它同能提升運行速度, cvpr2012_very_fast_over_bahnhof.config.ini 是一個參數配置文件(這個文件是識別人的,你還能夠選擇該文件所在目錄下的其它配置文件,從而識別不一樣的目標,好比,識別人臉),文件部份內容以下(# 表示註釋,不用管)


left_filename_mask 和 right_filename_mask 是對應的雙目攝像頭(能識別深度)的左右側攝像頭採集獲得的圖片序列所在的路徑以及名稱,打開相應的圖片所在的文件夾顯示


calibration_filename 是一個校準文件,咱們不用去管

start_frame 和 end_frame 是起始幀和終止幀,它告訴程序從哪一幀圖片開始讀,到哪一幀結束。

camera_height = 0.98 是設置的相機高度的一個參數

--gui.disable false  是讓處理結果可視化,若是不寫或寫成 --gui.disable true 那麼程序識別的結果將不會顯示在屏幕上

那麼如何讓doppia 識別本身的視頻或圖片序列呢?

例如,我在桌面上建一個文件夾 images 將許多(好比1200張吧)的名爲abc_0000_0.png,abc_0000_1.png,abc_0001_0.png,abc_0001_1.png,..., abc_0599_1.png的圖片序列(全部圖片尺寸均爲640x480)放到該文件中,在cvpr2012_very_fast_over_bahnhof.config.ini 文件中把end_frame 的值改成 1200,left_filename_mask 和 right_filename_mask 的值分別改成 /home/sun/Desktop/images/abc_%05i_0.png ,  /home/sun/Desktop/images/abc_%05i_1.png  (注意個人ubuntu 是英文系統,用戶名是 sun ,因此這麼寫,若是用戶名爲 zhangsan 的中文系統應該寫成 /home/zhangsan/桌面/images/...    等,總之要寫你本身的圖片序列的路徑),最後運行

OMP_NUM_THREADS=4 ./objects_detection -c cvpr2012_very_fast_over_bahnhof.config.ini --gui.disable false

就能識別本身定義的圖片序列中的人了。 若是你的圖片尺寸太大,它頗有可能會報錯,這時候你須要調一下參數來使你的經做者測試, objects_detector.min_scale/.max_scale/.num_scales ,video_input.camera_height 這些參數對的設置對於可否識別不一樣尺寸圖片中的目標比較重要,讀者若是有興趣,能夠測試一下。關於如何輸入自定義參數,當你在objects_detection 的路徑下時,能夠在終端輸入  ./objects_detection --help  命令查看各類配置參數,以及配置方法。例如,

cmake . && make -j2 && OMP_NUM_THREADS=4 ./objects_detection -c cvpr2012_very_fast_over_bahnhof.config.ini --gui.disable false --video_input.end_frame 2

我把終止幀參數設爲2,結果是看到顯示屏上彈出的識別過程很短,由於程序只識別了 image_00000000_0.png 到 image_00000001_1.png 四張圖,因此很快就結束了。 

最後強調一下,其實讀者直接看 readme.text 中的內容,會比看我介紹有用得多,我這篇博客的價值主要在doppia環境配置上的介紹。

最後,在 readme.text 中,還有關於訓練本身訓練識別模型的一些介紹,我就不寫了。


主要參考連接:

http://blog.csdn.net/tingyue_/article/details/45618413

http://blog.csdn.net/masa_fish/article/details/51882183

http://blog.csdn.net/junmuzi/article/details/49888123

相關文章
相關標籤/搜索