Windows下VS2015编译YOLOv4的两种方法,以及error C2065: “__func __”未定义问题的解决

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的使用,这里不再重复。

猜你喜欢

转载自blog.csdn.net/hangl_ciom/article/details/119612456