【目标检测实战】Darknet入门—yolov3模型训练(Win10下的安装、编译、实现)

效果图

简介

Yolo,是实时物体检测的算法系统,基于Darknet—一个用C和CUDA编写的开源神经网络框架。它快速,易于安装,并支持CPU和GPU计算,也是yolo的底层。本文主要介绍在win10系统上配置darknet环境,编译,使用yolo实现开头展示的目标检测效果。主要包括以下几个步骤:

编译流程 -> 环境安装 -> VS2017配置和编译 -> 运行展示

YOLO,美语新词,是You Only Live Once的首字母缩略词,意为你只能活一次,应该活在当下,大胆去做。

本文的YOLO,意为:You Only Look Once,再点进官网,一股暗黑色系地风格让人觉得很magic,编程真有意思~

yolo官网:https://pjreddie.com/darknet/yolo/

darknet官网:https://pjreddie.com/darknet/

github:Linux:https://github.com/pjreddie/darknet windows:https://github.com/AlexeyAB/darknet


编译流程

要使用yolo,必须先安装darknet、darknet可以直接在githb上下载压缩包:https://github.com/AlexeyAB/darknet

本文主要介绍darknet在win10上的编译流程。github上介绍了Linux和Windows下darknet的编译,我这里直接用谷歌浏览器翻译了:

1.如何在Linux上编译

只是make在darknet目录中。在make之前,您可以在Makefilelink中设置这些选项

  • GPU=1用CUDA构建以使用GPU加速(CUDA应该在/usr/local/cuda
  • CUDNN=1使用cuDNN v5-v7构建以使用GPU加速训练(cuDNN应该在/usr/local/cudnn
  • CUDNN_HALF=1 构建Tensor核心(在Titan V / Tesla V100 / DGX-2及更高版本上)加速检测3x,训练2x
  • OPENCV=1 使用OpenCV 3.x / 2.4.x构建 - 允许检测来自网络摄像机或网络摄像头的视频文件和视频流
  • DEBUG=1 可以调试Yolo的版本
  • OPENMP=1 使用OpenMP支持构建,通过使用多核CPU来加速Yolo
  • LIBSO=1构建使用此库的库darknet.so和二进制可运行文件uselib。或者您可以尝试运行LD_LIBRARY_PATH=./:$LD_LIBRARY_PATH ./uselib test.mp4如何从您自己的代码中使用此SO库 - 您可以查看C ++示例:https//github.com/AlexeyAB/darknet/blob/master/src/yolo_console_dll.cpp 或者使用这样的方式:LD_LIBRARY_PATH=./:$LD_LIBRARY_PATH ./uselib data/coco.names cfg/yolov3.cfg yolov3.weights test.mp4

要在Linux上运行Darknet,请使用本文中的示例,./darknet而不是darknet.exe使用,即使用此命令:./darknet detector test ./cfg/coco.data ./cfg/yolov3.cfg ./yolov3.weights

2.如何在Windows上编译(使用vcpkg

  1. 将Visual Studio安装或更新到至少2017版,确保将其完全修补(如果不确定自动更新到最新版本,请再次运行安装程序)。如果您需要从头开始安装,请从此处下载VS:Visual Studio 2017社区
  2. 安装CUDA和cuDNN
  3. 安装gitcmake。确保它们至少在当前帐户的路径上
  4. 例如,安装vcpkg并尝试安装测试库以确保一切正常vcpkg install opengl
  5. 定义环境变量,VCPKG_ROOT指向安装路径vcpkg
  6. 使用名称VCPKG_DEFAULT_TRIPLET和值定义另一个环境变量x64-windows
  7. 打开Powershell(作为标准用户)并键入(最后一个命令需要确认并用于清理不必要的文件)
  8. [仅限CUDA]使用首选计算功能自定义CMakeLists.txt
  9. 使用Powershell脚本构建build.ps1或使用Visual Studio 2017的“打开文件夹”功能。在第一个选项中,如果要使用Visual Studio,您将找到包含所有相应配置的构建后由CMake为您创建的自定义解决方案系统的标志。

环境安装

1.安装Visual Studio2017

官网下载安装社区版即可:https://visualstudio.microsoft.com/zh-hans/downloads/

VS2017-0.png

安装时依照自己的开发需要,勾选相应的环境:

VS2017-2.png

一定要选下面这个V140工具集,不然用141的会报错.....

VS2017-1.png

安装时没有选完整也没关系,可以在Visual Studio Installer修改

vs.png

2.安装CUDA和CUDNN

官网下载即可,我的安装包如下:
cuda_9.0.176_win10.exe
cudnn-9.0-windows10-x64-v7.4.2.24

Nvidia和CUDA和CUDNN的关系,参考:https://blog.csdn.net/qq_35941018/article/details/96481116

一关系阐述:

(1)NVIDIA的显卡驱动程序和CUDA完全是两个不同的概念哦!CUDA是NVIDIA推出的用于自家GPU的并行计算框架,也就是说CUDA只能在NVIDIA的GPU上运行,而且只有当要解决的计算问题是可以大量并行计算的时候才能发挥CUDA的作用。
CUDA的本质是一个工具包(ToolKit);但是二者虽然不一样的。

显卡驱动的安装:
当我们使用一台电脑的时候默认的已经安装了NVIDIA的显卡驱动,因为没有显卡驱动根本用不了显卡嘛,但是这个时候我们是没有CUDA可以用的,我们可以更新我们的驱动,更新链接为:
https://www.nvidia.com/Download/index.aspx?lang=en-us
在这个里面可以根据自己的显卡类型选择最新的驱动程序。显卡驱动程序当前大小大概500多M。

CUDA ToolKit的安装:
CUDA的下载地址为:https://developer.nvidia.com/cuda-downloads
我们可以选择两种安装方式,一种是在线安装(我还没用过),一中离线安装(我采用的)即本地安装,
当我们选择离线安装,当我们选定相对应的版本之后,下载的时候发现这个地方的文件大小大概在2G左右,Linux系统下面我们选择runfile(local) 完整安装包从本地安装,或者是选择windows的本地安装。CUDA Toolkit本地安装包时内含特定版本Nvidia显卡驱动的,所以只选择下载CUDA Toolkit就足够了,如果想安装其他版本的显卡驱动就下载相应版本即可。

所以,NVIDIA显卡驱动和CUDA工具包本身是不具有捆绑关系的,也不是一一对应的关系,只不过是离线安装的CUDA工具包会默认携带与之匹配的最新的驱动程序。

注意事项:NVIDIA的显卡驱动器与CUDA并不是一一对应的哦,CUDA本质上只是一个工具包而已,所以我可以在同一个设备上安装很多个不同版本的CUDA工具包,比如我的电脑上同事安装了 CUDA 9.0、CUDA 9.2、CUDA 10.0三个版本。一般情况下,我只需要安装最新版本的显卡驱动,然后根据自己的选择选择不同CUDA工具包就可以了,但是由于使用离线的CUDA总是会捆绑CUDA和驱动程序,所以在使用多个CUDA的时候就不要选择离线安装的CUDA了,否则每次都会安装不同的显卡驱动,这不太好,我们直接安装一个最新版的显卡驱动,然后在线安装不同版本的CUDA即可。

总结:CUDA和显卡驱动是没有一一对应的。

(2)cuDNN是一个SDK,是一个专门用于神经网络的加速包,注意,它跟我们的CUDA没有一一对应的关系,即每一个版本的CUDA可能有好几个版本的cuDNN与之对应,但一般有一个最新版本的cuDNN版本与CUDA对应更好。

总结:cuDNN与CUDA没有一一对应的关系

(3)CUDA 工具包附带的 CUPTI。

CUPTI,即CUDA Profiling Tools Interface (CUPTI)。在CUDA分析工具接口(CUPTI)能够分析和跟踪靶向CUDA应用程序的工具的创建。CUPTI提供以下API:
Activity API,Callback API,事件API,Metric API,和Profiler API。
使用这些API,您可以开发分析工具,深入了解CUDA应用程序的CPU和GPU行为。CUPTI作为CUDA支持的所有平台上的动态库提供。请参阅CUPTI文档。

nvidia与cuda需要满足关系:
https://docs.nvidia.com/cuda/cuda-toolkit-release-notes/index.html
cuda与cudnn需要满足关系:
https://developer.nvidia.com/rdp/cudnn-archive
cuda历史版本下载连接:
https://developer.nvidia.com/cuda-toolkit-archive
Tensorflow不同版本要求与CUDA及CUDNN版本对应关系:
https://blog.csdn.net/u013066730/article/details/88845083

3.安装git和cmake

git直接在官网下载即可:https://git-scm.com/download/win
cmake也是,直接下载:https://cmake.org/download/
刚开始,我git版本过低,后来在cmd中用update升级了一下~现在的版本如下:

cmake.png

下载完成,记得配置环境变量:

环境变量.png

4.安装vcpkg

详见:https://github.com/Microsoft/vcpkg
安装完成后,用vcpkg安装pthreads和opencv。
cd到vcpkg的主目录,运行命令:.\vcpkg install pthreads opencv
此处我发现,pthreads可以安装成功,opencv总是安装失败.....

--1.png

看报错信息,下载opencv:3.4.3.tar.gz时报错,于是手动下载tar包(https://github.com/opencv/opencv/archive/3.4.3.tar.gz),放入vcpkg的downloads目录下,再次尝试安装:

2.png

至此,准备工作基本做完,我们可以开始编译darknet了

5.安装opencv

单纯安装opencv对版本没有限制,但是为了和darknet匹配,必须安装特定的版本,darnnet官网要求的版本是opencv 3.x,明确要求小于4.0版。

我一次下了多个版本的opencv,发现3.0.0,3.4.0的可用,4.0.1的不可用。实践证明,确实如此,4.0.1的在编译daeknet时VS会报错,说有些接口方法不存在....3.x的版本中有些能用,有些不能用。

222.png

官网下载: https://opencv.org/releases.html

111.png

下载后解压至任意目录,方便自己使用时能找到即可

6.下载darnnet

darknet直接在https://github.com/AlexeyAB/darknet 下载zip包即可,同样可以解压至任意目录

📎darknet-master.zip


VS2017配置和编译

  首先找到之前下载的daeknet-master目录,进入->build->darknet文件夹下,可以看见有三个.sln文件,这三个文件是三个VS项目入口,其中
  • darknet.sln主要用来编译darknet,生成darknet.exe可执行文件
  • yolo_cpp_dll.sln主要用来编译可供外部使用的GPU版yolo的dll和lib文件;
  • yolo_cpp_dll_no_gpu.sln主要用来编译可供外部使用的非GPU版(即CPU版)dll和lib。

dll动态链接库,lib静态链接库

前面提到过,yolo支持CPU和GPU计算,CPU和GPU运行yolo所依赖的库文件是不同的

VS222.png

双击darknet.sln即可在VS2017中打开这个项目。

VS2017属性配置

找到项目目录,右键点属性:

aaa.png

在属性页面,我们需要经行一系列配置

目标平台版本

目标平台版本即要生成的exe目标运行环境,默认是8.1,可修改为10,不配置也暂时无影响

平台工具集

即VS2017开发平台的工具集,经过采坑发现v141不行、v140可用

常规.png

VC++目录

主要配2处:包含目录和引用目录,根据自己opencv安装目录配置相应路径.下面以我的路径为例:

包含目录:
D:\software\opencv\opencv3.4.0\opencv\build\include
库目录:
D:\software\opencv\opencv3.4.0\opencv\build\x64\vc15\lib
D:\software\opencv\opencv3.4.0\opencv\build\x64\vc14\lib


VC++++++.png

编译darknet.exe

现在,我们可以尝试编译了,点击生成
shengcheng.png

报异常

bug-1.png

异常信息

1>------ 已启动生成: 项目: darknet, 配置: Release x64 ------

1>D:\software\darknet\darknet190226\new\darknet-master\build\darknet\darknet.vcxproj(54,5): error MSB4019: 未找到导入的项目“C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\Common7\IDE\VC\VCTargets\BuildCustomizations\CUDA 10.0.props”。请确认 <Import> 声明中的路径正确,且磁盘上存在该文件。

1>已完成生成项目“darknet.vcxproj”的操作 - 失败。
========== 生成: 成功 0 个,失败 1 个,最新 0 个,跳过 0 个 ==========

解决异常

我们顺着异常提示的文件夹路径点进去发现,确实没有CUDA 10.0.props这个文件,但是有CUDA 9.0.props,原来在当前版本的darknet中,默认使用的CUDA 10.0,我们需要在配置darknet.vcxproj中修改(和darknet.sln在同级目录)

用notepad++修改,将10.0改为9.0即可,总共改头尾两处。
asdasd.png

再次编译

dddddddd.png

编译成功后,会在darknet-master\build\darknet\x64下生成darknet.exe文件,这个就是可执行的程序。

编译GPU版库

编译GPU版库文件,主要即产生可以支持GPU运行的yolo的dll和lib文件,用于方便在别的C++项目中直接调用,编译前的VS2017配置和上面编译darknet.exe基本类似,此处还需配置一处:

配置属性-CUDA-Device.jpg

CUDA C/C++ ->Deviece -> Code Generation处。原compute_75,sm_75改为compute_52,sm_52
然后就是正常的生成,生成成功后在darknet-master\build\darknet\x64目录下会新生成:yolo_cpp_dll.dll和yolo_cpp_dll.lib

wqwwqwq.png

编译CPU版库

CPU版本库的编译和GPU类似,就不赘述了


运行展示

1.下载yolov3.weights并放到darknet.exe同级目录下,下载链接:

http://link.zhihu.com/?target=https%3A//pjreddie.com/media/files/yolov3.weights

2.运行

cd到darknet.exe所在目录,运行命令即可。

命令1:

darknet detect cfg/yolov3.cfg yolov3.weights data/dog.jpg

效果1:

image
命令2:

darknet detect cfg/yolov3.cfg yolov3.weights data/bird.jpg

效果2:
222.png

tips:

1.运行时如果提示找不到opencv_world340.dll,需要手动将opencv下的此dll放入darknet.exe运行同级目录下


11111.png

我的opencv_world340.dll所在目录:D:\software\opencv\opencv3.4.0\opencv\build\x64\vc14\bin
opencv_world340.dll对应Release版、opencv_world340d.dll对应debug版。

2.如果运行时报内存溢出的异常,需要手动修改yolov3-voc.cfg中的batch和subdivisions,可以都修改为1


a.png
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,904评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,581评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,527评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,463评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,546评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,572评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,582评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,330评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,776评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,087评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,257评论 1 344
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,923评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,571评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,192评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,436评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,145评论 2 366
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,127评论 2 352

推荐阅读更多精彩内容