1 引言
之前写过一个Windows下编译YOLOv3的文章:《Win10+VS2015安装配置YOLO3(CPU/GPU)》
现在Yolo已经到V4了,而且性能有了比较大的提升,如下图。
相关Paper:Paper YOLO v4:和Paper Scaled YOLO v4,所以也装了个Yolo4测试一下,以下为编译时的记录。
2 所需安装软件及配置
2.1 CMake
版本>=3.18,下载:https://cmake.org/download/,我下载的是最新版本3.21.1
2.2 CUDA
版本>=10.2: https://developer.nvidia.com/cuda-toolkit-archive ,我这里下载了11.1.1,这个要看你安装的显卡最高支持到的CUDA版本(最好先安装显卡最新驱动程序,并在NVIDIA控制面版里查看),并不是最新就好。
2.3 OpenCV
版本>= 2.4: https://github.com/opencv/opencv_contrib/releases,我下载了4.5.3,记得装完后要在系统变量中添加:OPENCV_DIR=D:\opencv-4.5.3\opencv\build(按实际OPENCV所在路径直到build)
2.4 cuDNN
版本>= 8.0.2,https://developer.nvidia.com/rdp/cudnn-archive,这个版本要与CUDA版本对应,我下的是8.1.1,cuDNN安装就是把文件解压到CUDA的安装目录,我这里是D:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.1
2.5 MSVC
按作者描述的Windows下的编译方法,都需要用到MSVC,作者推荐用VS2017或者VS2019,但我已经安装了VS2015,不想再装额外的了,所以这里就保持用VS2015。
3 下载源码和权重测试文件
源码:https://github.com/AlexeyAB/darknet,我是Download ZIP方式下载的
权重测试文件yolov4.weights:下载1或下载2
4 编译
把下载的darknet-master.zip解压到合适的位置。
按作者描述,Windows下编译方法有两种:1 使用CMake;2 使用vcpkg,第2种需要VS2017或VS2019,本文使用第1种方法。
本文同时介绍另外一种直接用VS2015编译的方法。
两种方法编译出的内容稍有些不同,可以根据需要选择。
4.1 编译方法1——CMake与VS2015
启动CMake(cmake-gui),填入源码所在路径,以及希望编译结果所在路径,我这里填写如下:
按“Config”按钮,第一栏生成器中选择VS2015,第二栏生成平台选择x64
然后Finish,稍等片刻,出现一大片红字
查看红字部分,应该出现以下字样:CMake_CUDA_xxx、CUDA_xxx、CUDNN_xxx、INSTALL_xxx等,如果缺少某些字样,可能是对应的软件安装不正确,需重新检查安装。
保持ENABLE_CUDA、ENABLE_CUDNN、ENABLE_OPENCV勾选状态。
没问题后,点击"Generate",然后"Open Project",VS2015被打开并自动装入工程,加载工程后会看到解决方案中有6个工程。
VS2015的配置选择Release,平台选择x64,如上图。
然后就可以点击“生成”-“生成解决方案”。
按照作者以及其他人的资料所描述,此时应该直接就编译成功了,但我在这里遇到了问题。
问题如下:编译出现了大量错误,但均为同一类错误:error C2065: “__func __” : 未声明的标识符
上网查了下此错误出现原因,是由于__func __属于C99标准,而VS2015并不支持C99标准,但这里奇怪的是,网上也有很多用VS2015编译YoloV4的,但大家都没有说遇到这个问题,那么可能是因为我自己的这个编译器有问题?或者VS2017和VS2019支持C99?
于是设法找错误来源,最后追踪到darknet源码src目录下的utils.h,其中开头部分有一句
#define DARKNET_LOC __FILE__, __func__, __LINE__
修改为
#define DARKNET_LOC __FILE__, __FUNCTION__, __LINE__
再次编译,错误消失。
编译成功后,到设定的输出路径的Release目录下,会看到编译出的文件。
文件作用:
文件名 | 作用 |
---|---|
darknet.exe | yolov4主执行程序 |
darknet.dll和darknet.lib | yolov4动态链接库 |
uselib.exe | yolov4动态链接库演示测试工程 |
4.2 编译方法2——VS2015
这个方法与Win10+VS2015安装配置YOLO3(CPU/GPU)的编译方法相同,但没有那么多要修改的地方了,具体如下:
到D:\YoloV4\darknet-master\build\darknet目录下,可以看到很多*.sln文件,用VS2015打开编译即可,这里说明一下各个工程的作用:
工程名 | 作用 | 编译结果 |
---|---|---|
darknet.sln | yolov4主执行程序工程 | darknet.exe |
darknet_no_gpu.sln | 不使用GPU的yolov4主执行程序工程 | darknet_no_gpu.exe |
yolo_cpp_dll.sln | yolov4动态链接库程序工程 | yolo_cpp_dll.dll |
yolo_cpp_dll_no_gpu.sln | 不使用GPU的yolov4动态链接库程序工程 | yolo_cpp_dll.dll |
yolo_console_dll.sln | yolov4动态链接库演示测试工程 | yolo_console_dll.exe |
当然,直接用此种编译方法一样会遇到以上的__func __问题,解决方法同上。
这种方法编译出的文件位于以下位置:
5 测试
5.1 exe测试
用以上编译出的darknet.exe(两种方法编译出的均可)进行测试,要说明的是,darknet不能直接双击运行,需要带命令行参数,不会用参数的,可以直接到darknet-master\build\darknet\x64下,这里有很多的cmd文件,里面就是各种测试命令,同时此目录下也包含了各种所需的文件。下载的权重文件,包括以前的yolov3.weights也是放在这个目录下参与测试。
5.2 dll测试
如果程序需要调用yolo的DLL,那么就可以用到以上两类方法编译出的dll和lib,头文件位于D:\YoloV4\darknet-master\include目录下。
本人以前的一篇文章《VS2015图形界面YOLO3应用程序》描述了YOLO DLL的使用,这里不再重复。