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

相关文章
相关标签/搜索