doppia调试之旅
![闭嘴](http://static.blog.csdn.net/xheditor/xheditor_emot/default/shutup.gif)
首先,下载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的条件的及步骤。
前提条件(翻译readme.text 原文):
Linux 系统(理论上在Windows上也可以运行,但事实证明不是个好主意)
C++ 和 CUDA 编译环境
带有 CUDA 2.0 新能的GPU
boost 库
google protocol buffer
opencv(2.4版本,在更老的版本上也能运行,但3.0目前不支持)
libjpeg, libpng
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