• 【视频开发】【计算机视觉】doppia编译之一:前言及安装CUDA


    最近做一个“高清视频人流量检测”的项目,由于对实时性要求较高,我们需要较快的检测速度。在搜索茫茫“论”海后,我在“The Fastest Deformable Part Model for Object Detection”这篇论文中,找到了FFT(DPM)、Proposed Method、以及ACF三种相对较快的行人检测方法。由于在这三种方法中,Proposed Method和ACF方法更快,检测效果更好,所以我将注意力主要集中在PM和ACF上,但浏览作者主页及各大源码下载网站后,我只找到了ACF的开源代码(网址 
    http://vision.ucsd.edu/~pdollar/toolbox/doc/index.html)。(为老外无私奉献的开源精神点赞!)在调试好ACF程序后发现,发现它处理1920*1080的图像大概要0.2-0.6s左右,没有达到我们项目的要求。但在读完作者的论文Fast Feature Pyramids for Object Detection后,发现有人实现了它的GPU加速,处理600*480图像它能达到100fps(Pedestrian Detection at 100 Frames per Second),对于这样的速度,显然是符合我们的要求的。在找到GPU加速ACF的开源代码后,就开始了我编译doppia的痛苦之旅(这个加速版ACF的名字叫做doppia,文章最后给出了下载链接)。对于一个之前完全没有接触过Ubuntu等Linux操作系统,没有用过CUDA,更没用它编译过OpenCV的我而言,说它是一种痛苦,真的丝毫不为过。不过值得高兴的是,经历了十天的时间,我终于是把它运行起来啦。(请原谅我的智商以及我捉急的调试能力) 
    在此写下编译doppia的博客,主要有三个目的: 
    第一, 当然是为了今后忘记的时候,能有点文字提醒自己怎么做; 
    第二, 希望这篇博客能给今后需要用到这个开源软件的朋友一点帮助,减轻一点他们的痛苦; 
    第三, 向doppia的作者以及在编译doppia过程中,给过我帮助的朋友致谢! 
    好啦,闲话不多说,开始进入正题。 
    (1) 下载doppia,网址:https://bitbucket.org/rodrigob/doppia,目前为止,doppia有2个版本,v1和v2。这里我调试的是v1,因为v2我一直没调通。(之后如果调通了,我会再更新) 
    (2) 在调试程序之前,最好先看看doppia中的Readme,了解软件的配置环境。 
    (3) 检查及配置编译环境 (这里,我就直接列出我的配置环境) 
    硬件:支持CUDA的NVIDIA显卡(2块NVIDIA显卡的台式机) 
    注:这里,一定要使用2块显卡都是NVIDIA的台式机。如果一块是NVIDIA,另一块不是的话,在安装CUDA后,极易出现重启开机进不了Ubuntu系统的情况。所以对于笔记本安装CUDA,这里的方法是不适用的,而且目前在网上我也没找到适用的方法。这里主要和显卡驱动有关,ubuntu系统默认使用集成显卡绘2D图,采用独立显卡绘3D图。在安装CUDA同时,NVIDIA驱动也会重新安装,使得独显只参与计算不参与绘制桌面,于是出现了只显示桌面墙纸的2D图(集显可显),而不显示启动器/任务栏这类的3D图标(独显不可显)的情况。

    (针对笔记本安装CUDA,网上有人曾提出以下的解决方案/**/,经测试,不管用,但为了保证文章的原始性,在这里我就不删除啦,仅用c++注释符象征性表示一下不可用,请忽略该方法,尽快换电脑。) 
    /*如果你只有集显+独显的本子,找不到2块NVIDIA显卡的台式机的话,建议你在安装CUDA前修改系统grub文件,方法如下: 
    打开系统中的grub配置文件:

    sudo gedit /etc/default/grub
    • 1
    • 1

    把 “nomodeset”参数加到 GRUB_CMDLINE_LINUX行:

    GRUB_CMDLINE_LINUX=”nomodeset”
    • 1
    • 1

    并更新 grub:

    sudo update-grub
    • 1
    • 1

    方法引自:http://blog.csdn.net/menglongbor/article/details/7015380 
    */

    操作系统及相应库 
    (下面只是我自己的配置,当然你也可以用其他操作系统和不同版本的库)

    Ubuntu 14.04 Kylin
    gcc 4.8/g++ 4.8
    Cmake 2.8
    CUDA 7.0
    Boost 1.58.0
    Opencv 2.4.10
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    (4) 下面就开始doppia的环境配置吧! 
    (这里要说明,我的大部分方法来自网络,但网上鱼龙混杂,有的方法很好,但也有方法根本行不通,从万千方法里找到正确的实属不易。这里重写一遍,主要意图是让自己和其他朋友今后少走弯路。至于借鉴别人的方法,我会指明方法来源) 
    首先,安装CUDA。可以说这是让我最头疼的一步,我的本子就是因为CUDA安装的NVIDIA驱动而荡机三次。而在经过这么多天的摸索后,我感觉CUDA的安装和验证都是很简单的(前提是,CUDA安装的NVIDIA驱动不会让你进不了系统。所以,我再次强烈建议,请用显卡都为NVIDIA的台式机)。 
    安装CUDA前,你要做三步验证工作: 
    1) 验证你的显卡是否支持GPU编程,在终端(Ctrl+Alt+T,打开终端)输入

    lspci | grep -i nvidia
    • 1
    • 1

    它会给出你的显卡信息,上http://developer.nvidia.com/cuda-gpus查看你的显卡是否在CUDA支持产品之列。 
    2) 查看你的linux版本,终端输入

    uname -m && cat /etc/*release
    • 1
    • 1

    返回系统信息后,官网https://developer.nvidia.com/cuda-downloads下载符合自己系统的CUDA版本。 
    以x86-64的Ubuntu14.04为例,我选择的是下图红线框中的第二个版本。(官网提供三个版本,第一个是在线安装包,第二个是离线安装包,第三个是linux通用版,这里我建议下载第二个,既不用担心断网安装失败,版本也比较稳定) 
    Ubuntu14.04 CUDA版本

    3) 查看编译器版本,终端输入

    gcc –-version
    • 1
    • 1

    你可以下载CUDA安装指导书 
    http://developer.download.nvidia.com/compute/cuda/7_0/Prod/doc/CUDA_Getting_Started_Linux.pdf核对版本是否符合要求。 
    这里,我的Ubuntu 14.04系统 自带gcc4.8、g++4.8,符合要求。 
    (查看g++版本)

    g++ -version
    • 1
    • 1

    4) 完成以上三步验证后,你就可以开始CUDA的安装工作啦!

    删除旧NVIDIA驱动 
    如果是刚装好的Ubuntu系统,其中的开源的NVIDIA显卡驱动是没有激活的,可以跳过这一步,而如果之前NVIDIA驱动已经激活则需要将其卸载掉。卸载命令:

    sudo apt-get --purge remove nvidia-*
    sudo apt-get --purge remove xserver-xorg-video-nouveau
    • 1
    • 2
    • 1
    • 2

    (第二条命令不知道作用是什么,如果你没有执行成功,也不要紧,继续下面的工作)

    重启电脑,进入tty1 
    接下来重启电脑,进入系统后,快捷键

    Ctrl+Alt+F1
    • 1
    • 1

    切换到tty1文字输入界面。(这里建议在切换到tty1之前,把CUDA安装文件放在Home下,这样就不用为记不住文件目录而烦恼啦) 
    输入账号和密码后,输入

    sudo stop lightdm
    • 1
    • 1

    关闭桌面管理。

    正式安装CUDA 
    关闭桌面管理后。接下来正式安装CUDA。输入下列命令,将CUDA安装到本地仓库 
    (<>中的内容根据自己下载的CUDA版本和Ubuntu系统做修改)

    sudo dpkg -i cuda-repo-<distro>_<version>_<architecture>.deb
    • 1
    • 1

    (当然,如果你的安装包不在Home下,记得切换目录) 
    更新本地仓库

    sudo apt-get update
    • 1
    • 1

    最后安装CUDA和显卡驱动(CUDA默认路径:/usr/local/cuda)

    sudo apt-get install cuda
    • 1
    • 1

    打开桌面管理后,重启电脑

    sudo start lightdm
    • 1
    • 1

    (我自己的本子就是在这里重启后进不了系统的,希望你们不会发生这种情况。如果谁有解决方案,也可以留言告诉我一下,在此先谢过)

    验证CUDA是否安装成功 
    进入系统后,记得要设置环境变量,不然系统找不到CUDA的执行文件“nvcc” 
    (下面这种方式只对此次开机有用,电脑重启后,又会清除,所以每次开机后都要重新设置)

    export PATH=/usr/local/cuda-7.0/bin:$PATH  
    export LD_LIBRARY_PATH=/usr/local/cuda-7.0/lib64:$LD_LIBRARY_PATH  
    • 1
    • 2
    • 1
    • 2

    这时,CUDA的安装和配置工作已经完成。

    但为了验证CUDA是否安装成功,我们还需以下几步:

    查看CUDA编译器版本 
    (注意,如果没有设置环境变量,可能会提示“nvcc未安装”)

    nvcc –V
    • 1
    • 1

    返回类似以下信息

    nvcc: NVIDIA (R) Cuda compiler driver
    Copyright (c) 2005-2015 NVIDIA Corporation
    Built on Mon_Feb_16_22:59:02_CST_2015
    Cuda compilation tools, release 7.0, V7.0.27
    • 1
    • 2
    • 3
    • 4
    • 1
    • 2
    • 3
    • 4

    编译CUDA示例代码 
    进入usr/local/cuda-7.0/samples目录,编译示例

    sudo make all -j8
    • 1
    • 1

    编译完成后,进入目录samples/bin/x86_64/linux/release,终端输入

    sudo ./deviceQuery
    • 1
    • 1

    如果出现类似以下显卡信息,那么恭喜你,CUDA安装成功。

    ./deviceQuery Starting...
    
     CUDA Device Query (Runtime API) version (CUDART static linking)
    
    Detected 2 CUDA Capable device(s)
    
    Device 0: "GeForce GT 640"
      CUDA Driver Version / Runtime Version          7.0 / 7.0
      CUDA Capability Major/Minor version number:    3.0
      Total amount of global memory:                 2048 MBytes (2147287040 bytes)
      ( 2) Multiprocessors, (192) CUDA Cores/MP:     384 CUDA Cores
      GPU Max Clock rate:                            902 MHz (0.90 GHz)
      Memory Clock rate:                             900 Mhz
      Memory Bus Width:                              128-bit
      L2 Cache Size:                                 262144 bytes
      Maximum Texture Dimension Size (x,y,z)         1D=(65536), 2D=(65536, 65536), 3D=(4096, 4096, 4096)
      Maximum Layered 1D Texture Size, (num) layers  1D=(16384), 2048 layers
      Maximum Layered 2D Texture Size, (num) layers  2D=(16384, 16384), 2048 layers
      Total amount of constant memory:               65536 bytes
      Total amount of shared memory per block:       49152 bytes
      Total number of registers available per block: 65536
      Warp size:                                     32
      Maximum number of threads per multiprocessor:  2048
      Maximum number of threads per block:           1024
      Max dimension size of a thread block (x,y,z): (1024, 1024, 64)
      Max dimension size of a grid size    (x,y,z): (2147483647, 65535, 65535)
      Maximum memory pitch:                          2147483647 bytes
      Texture alignment:                             512 bytes
      Concurrent copy and kernel execution:          Yes with 1 copy engine(s)
      Run time limit on kernels:                     No
      Integrated GPU sharing Host Memory:            No
      Support host page-locked memory mapping:       Yes
      Alignment requirement for Surfaces:            Yes
      Device has ECC support:                        Disabled
      Device supports Unified Addressing (UVA):      Yes
      Device PCI Domain ID / Bus ID / location ID:   0 / 4 / 0
      Compute Mode:
         < Default (multiple host threads can use ::cudaSetDevice() with device simultaneously) >
    
    Device 1: "Quadro 600"
      CUDA Driver Version / Runtime Version          7.0 / 7.0
      CUDA Capability Major/Minor version number:    2.1
      Total amount of global memory:                 1023 MBytes (1072889856 bytes)
      ( 2) Multiprocessors, ( 48) CUDA Cores/MP:     96 CUDA Cores
      GPU Max Clock rate:                            1280 MHz (1.28 GHz)
      Memory Clock rate:                             800 Mhz
      Memory Bus Width:                              128-bit
      L2 Cache Size:                                 131072 bytes
      Maximum Texture Dimension Size (x,y,z)         1D=(65536), 2D=(65536, 65535), 3D=(2048, 2048, 2048)
      Maximum Layered 1D Texture Size, (num) layers  1D=(16384), 2048 layers
      Maximum Layered 2D Texture Size, (num) layers  2D=(16384, 16384), 2048 layers
      Total amount of constant memory:               65536 bytes
      Total amount of shared memory per block:       49152 bytes
      Total number of registers available per block: 32768
      Warp size:                                     32
      Maximum number of threads per multiprocessor:  1536
      Maximum number of threads per block:           1024
      Max dimension size of a thread block (x,y,z): (1024, 1024, 64)
      Max dimension size of a grid size    (x,y,z): (65535, 65535, 65535)
      Maximum memory pitch:                          2147483647 bytes
      Texture alignment:                             512 bytes
      Concurrent copy and kernel execution:          Yes with 1 copy engine(s)
      Run time limit on kernels:                     Yes
      Integrated GPU sharing Host Memory:            No
      Support host page-locked memory mapping:       Yes
      Alignment requirement for Surfaces:            Yes
      Device has ECC support:                        Disabled
      Device supports Unified Addressing (UVA):      Yes
      Device PCI Domain ID / Bus ID / location ID:   0 / 3 / 0
      Compute Mode:
         < Default (multiple host threads can use ::cudaSetDevice() with device simultaneously) >
    > Peer access from GeForce GT 640 (GPU0) -> Quadro 600 (GPU1) : No
    > Peer access from Quadro 600 (GPU1) -> GeForce GT 640 (GPU0) : No
    
    deviceQuery, CUDA Driver = CUDART, CUDA Driver Version = 7.0, CUDA Runtime Version = 7.0, NumDevs = 2, Device0 = GeForce GT 640, Device1 = Quadro 600
    Result = PASS
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76

    现在你可以运行release里的例子,来体验一下CUDA的功能。

    sudo ./bilateralFilter
    • 1
    • 1

    得到图片 
    bilateralFilter

    至此,doppia环境配置的第一部分“CUDA的安装”就大功告成啦!!! 
    (最后,提醒一下,虽然CUDA的deb文件可以直接点击安装,但是不建议这么做,直接点击安装,你根本找不到CUDA的lib库和include文件在哪,之后无法调用)

    引用博客: 
    (1)http://blog.csdn.net/menglongbor/article/details/7015380 
    (2)http://blog.csdn.net/xizero00/article/details/43227019 
    (3)https://gist.github.com/bearpaw/c38ef18ec45ba6548ec0

    doppia及作者相关介绍链接: 
    (1)http://blog.csdn.net/xizero00/article/details/43227019 
    (2)https://bitbucket.org/rodrigob/doppia

  • 相关阅读:
    npm 全局执行 update 、 outdated 出现 npm-debug.log 404 错误的问题
    python 爬虫爬取内容时, xa0 、 u3000 的含义
    SCNU ACM 2016新生赛决赛 解题报告
    SCNU ACM 2016新生赛初赛 解题报告
    【记录】Ubuntu下安装VirtualBox
    Ubuntu16.04 LTS下apt安装WireShark
    Java的初始化块、静态初始化块、构造函数的执行顺序及用途探究
    Ubuntu在wps-office等qt5程序下不能切换中文fcitx输入法的问题
    Ubuntu管理开机启动服务项 -- 图形界面的Boot-up Manager
    解决Ubuntu下Firefox+OpenJDK没有Java插件的问题
  • 原文地址:https://www.cnblogs.com/huty/p/8517105.html
Copyright © 2020-2023  润新知