OpenCV 3.1.0 重编译——支持CUDA8.0

写在前面

最近主要在看机器学习的十大算法,尝试书中提供的示例,实验环境是win7 + python3.4.4 。突然间,我发现新版本的OpenCV对机器学习大部分算法都有很好的实现,原谅我一直停留在2.4版本。相较于python,我更熟悉Visual Studio,相比于Scikit-Learn,我更熟悉opencv_contrib。因此,觉得没必要舍近求远,去做自己不擅长的事情,效率低是一方面,而且学习的积极性也受影响。此外,机器学习大多时候依赖大的数据样本,学习代价高,依赖加速。CUDA加速一直都是热门,我一直没有深入了解,所以学习也从现在开始。
本文主要分为两个部分,第一部分,CUDA 8.0 安装;第二部分,利用Cmake,对OpenCV 3.1进行重编译,编译选项中支持GPU加速。编译器选择Visual Studio 2015,操作系统为Win7 SP1 。


前提条件

确保显卡为英伟达,明确显卡的系列型号等,并且正确安装过驱动。一般通过第三方的驱动安装工具如某大师、某精灵等都不太靠谱,我是遇到过类似的坑。

NVIDIA显卡驱动卸载与安装

如果有安装过NVIDIA的驱动,个人建议进行如下操作:
1. 在英伟达官网下载对应显卡最新驱动:驱动下载地址 注意选择正确的版本;
2. 利用驱动卸载工具DDU(Display Driver Uninstaller) 对旧驱动进行卸载,这里提供个人免费资源链接DDU
建议在安全模式下卸载显卡驱动程序,系统会自动重启进入安全模式,等待DDU自动弹出后,选择好对应显卡类型,然后执行卸载驱动并重启。如图:
DDU
3. 安装前面下载的最新显卡驱动程序,安装过程看:这里,从第五步开始看就好了,前面我认为你已经做好了。

CUDA支持的显卡列表


安装 VS2015+CUDA8.0+OPENCV3.1

  • VS2015

    以前常用的VS版本是2010,因为用着习惯一直没有升级。CUDA 8.0好像只兼容vs2012版本及以上,没有去确认,个人建议使用VS2012以上版本。 另外说一句,VS2015只支持win7 SP1及以上系统,在win7 非SP1版本系统上无法安装.net 4.6。Visual Studio 2015 :社区免费中文版

  • CUDA 8.0
    下载
    请根据系统下载对应版本,安装类型建议选择local 本地版,如图:
    CUDA8.0

安装注意一点,一定不要选择安装CUDA里面带的驱动,如图:
这里写图片描述
图上可以发现,我安装过的当前版本是比它包含的版本更新的,所以完全没必要替换的。切记!

详细安装说明请参考CUDA Quick Start Guide以及Installation Guide for Microsoft Windows,建议别偷懒!

验证安装: 我们通过CUDA提供的例子来验证是否安装成功

首先,cmd命令打开命令行窗口输入 nvcc -V ,可以查询到cuda toolkit 版本号,如图:
NVCC

其次,如果你是默认安装路径,可以在C:\ProgramData\NVIDIA Corporation\CUDA Samples\v8.0 找示例程序,根据VS版本打开对应的Samples工程,这里选择打开Samples_vs2015.sln。找到1_Utilities工程中的deviceQuery项目。编译该项目并设为启动项,该程序是利用CUDA运行时库中的API查询机器中CUDA设备详情的,具体参数含义在此不表。我的运行结果为:
deviceQuery

你也可以试着运行bandwidthTest项目,查看运行结果。
如果上述程序没有输出正确的结果,最主要的原因就是显卡的驱动问题。可以尝试重复上面显卡驱动安装步骤,记住先卸载再安装。此外,确保安装的显卡驱动与你的显卡类型是一致的。

  • OpenCV 3.1.0
    官方下载地址

    OpenCV版本随个人喜好,建议选择opencv-2.4.13及以后版本。原因是对于cuda 8.0,opencv 3.0,3.1,2.4.10都会报如下错误:
    graphcuts.cpp:120:54: error: ‘NppiGraphcutState’ has not been declared typedef NppStatus (init_func_t)(NppiSize oSize, NppiGraphcutState* ppState, Npp8u* pDeviceMem);
    使用opencv2.4.13就没有问题,opencv2.4.13是2016年第一个发布的版本,与cuda 8.0兼容应该最好。

    这里使用CMAKE工具进行OpenCV重编译工作,使用CMAKE 3.8版本,工具详细介绍在此不表。
    下载OpenCV后进行解压,目录自选,个人推荐D:\Program Files (x86)\opencv310,然后在opencv目录 下新建两个文件夹: cmake_withGPU 以及 build_withGPU。目录如图:
    opencv目录

    打开Cmake,源目录设置为OpenCV源码目录sources,编译目录设置为上面创建的文件夹cmake_withGPU,点击Configure进行设置,选择VS2015 X64。 如图:
    CMake

    编译过程中,会下载第三方依赖库ffmpeg以及ippicv,由于网络问题可能会出错,解决方法看这里。个人资源也提供了ippcv免费下载。

    如果此前没有编译过OpenCV的经验,请百度一下,相关内容很多,细节也很多,此处只说两点:首先,在CMAKE类别中设置CMAKE_INSTALL_PREFIX为上面新建的文件夹build_withGPU,如图:
    CMAKE_INSTALL_PREFIX

    其次,在WITH类别中确保WITH_CUDA被选中,在CUDA类别中取消如图选项:
    CUDA

    最后,Generate生成OpenCV.sln工程文件。
    接下来便是OpenCV的编译工作,这是个耗时的过程。此外,如果你使用的OpenCV3.1,即会遇到上面提到的编译错误。解决方法是 打开出错文件graphcuts.cpp,做如图修改:
    graphcuts

    OpenCV的主要编译过程如图所示:
    Build OpenCV

    先编译opencv_core以及opencv_cudacodec看是否出错,如果不出错,基本就没有什么问题了,可以执行ALL_BUILD进行全部编译,最后进行安装INSTALL,会把OpenCV的头文件 库文件以及相关DLL和EXE安装到我们创建的build_withGPU文件夹里,文件的组织形式是与opencv自带的build文件夹一致的。

验证安装:利用opencv自带的sample中两个程序进行验证

第一个是samples\cpp\tutorial_code\HighGUI\video-input-psnr-ssim中的例子,验证OpenCV的基础功能,运行结果如图:
PSNR_SSIM

命令行参数是similarity_measurement.exe video/Megamind.avi video/Megamind_bugy.avi 35 10 ,注意要编译成X64版本,因为我们的OpenCV是编译的x64的。

第二个是samples\cpp\tutorial_code\gpu\gpu-basics-similarity中的例子,验证GPU加速是否有效,以及正确的使用方法,运行结果如果:
PSNR_SSIM_GPU

至此,OpenCV已编译成功,并且支持了最新版CUDA加速,开启飞速模式尽情享受吧!

后记

写文档过程比安装过程还烦,我是先使用VS2013+OPENCV3.1+CUDA8.0一步步编译成功并验证,然后在旧电脑上使用VS2015重复了整个过程,才有了上面的配图。不过说来也有很多收获,因为旧电脑是WIN7旧版系统,非WIN7 SP1而不支持安装VS2015,为此折腾一番,还有更好的OpenCV应该选择最新版本的,安于使用以前熟悉的旧版本是不可取的。总的说来自己不尝试,真的不知道坑在哪。此外,WIN8 WIN10都没有验证过,上述方法只能作为参考了,自己的坑要自己填的。

没有N卡的小伙伴也不用担心,后面会说一下Intel IPP的安装和使用。

后面会介绍opencv_contrib这个模块的编译以及使用,也会包括算法理解与源码分析。


                                                                        Unicorn Lewis, 03.31.2017
posted @ 2017-03-31 16:30  Louie-Liu  阅读(126)  评论(0编辑  收藏  举报