windows 10编译YOLOv4,包括exe和d

2021-04-21 15:10:32 浏览数 (1)

软硬件环境

  • windows 10 64bit
  • visual studio 2019
  • cuda 11.1
  • cudnn 8.0.5
  • opencv 4.5.1
  • darknet 2021.03.27
  • cmake 3.20.0

安装配置cuda和cudnn

参考前文 windows 10安装CUDA和cuDNN,地址是:https://xugaoxiang.com/2019/12/18/windows-10-cuda-cudnn/, 这里不再赘述。

安装配置opencv

来到opencv的官方网站下载页面 https://opencv.org/releases/

windows darknet

下载后是一个exe文件,打开傻瓜式一步步安装就好了,记录好安装路径(我这里是D:ToolsOpenCVopencv),然后增加一个环境变量OpenCV_DIR,指向opencv安装后的build目录,如下

windows darknet

windows darknet

接下来分别将opencv下的buildx64vc15binbuildx64vc15lib目录,追加到PATH环境变量中,如下

windows darknet

编译darknet.exe

下载cmake,地址是:https://cmake.org/download/,也是傻瓜式的安装。然后打开cmake-gui.exe

windows darknet

源码目录和编译目标目录都指向darknet的源码目录,这里使用AlexeyAB的版本 https://github.com/AlexeyAB/darknet

接下来就是点击Configure

windows darknet

然后就是Generate

windows darknet

最后Open Project

windows darknet

随即,visual studio 2019就打开了darknet工程,点击右侧的ALL_BUILD --> 生成

windows darknet

等待一会,就可以编译完成

windows darknet

windows darknet

最后我们来测试一下,将Debugdarknet.exe3rdpartypthreadsbin下的pthreadGC2.dllpthreadVC2.dll都拷贝到darknet源码根目录下,除此以外,还要准备权重文件yolov4.weights

然后执行图片测试命令

代码语言:javascript复制
.darknet.exe detect cfgyolov4.cfg yolov4.weights datadog.jpg

windows darknet

编译dll

如果要编译动态链接库dll的话,进入到darknet源码下的builddarknet,用visual studio 2019打开yolo_cpp_dll.sln

windows darknet

同样地,右键生成

windows darknet

这里出现了一个错误

代码语言:javascript复制
错误 MSB4019 找不到导入的项目“C:Program Files (x86)Microsoft Visual Studio2019ProfessionalMSBuildMicrosoftVCv160BuildCustomizationsCUDA 10.1.props”。请确认 Import 声明“C:Program Files (x86)Microsoft Visual Studio2019ProfessionalMSBuildMicrosoftVCv160\BuildCustomizationsCUDA 10.1.props”中的表达式正确,且文件位于磁盘上。yolo_cpp_dll D:Projectsdarknet-masterbuilddarknetyolo_cpp_dll.vcxproj 55

我的系统中,cuda明明是11.1版本,为何会出现cuda 10.1的报错?

编辑文件yolo_cpp_dll.vcxproj,将里面的cuda 10.1版本改成你系统中的版本,我这里是cuda 11.1,包括.props.targets

windows darknet

windows darknet

重新生成,还是报错

windows darknet

代码语言:javascript复制
错误 MSB3721 命令“"C:Program FilesNVIDIA GPU Computing ToolkitCUDAv11.1binnvcc.exe" -gencode=arch=compute_30,code="sm_30,compute_30" -gencode=arch=compute_75,code="sm_75,compute_75" --use-local-env -ccbin "C:Program Files (x86)Microsoft Visual Studio2019ProfessionalVCToolsMSVC14.24.28314binHostX86x64" -x cu   -ID:ToolsOpenCVopencvbuildinclude -IC:opencv_3.0opencvbuildinclude -I....include -I....3rdpartystbinclude -I....3rdpartypthreadsinclude -I"C:Program FilesNVIDIA GPU Computing ToolkitCUDAv11.1include" -I"C:Program FilesNVIDIA GPU Computing ToolkitCUDAv11.1include" -Iinclude -Iinclude -I"C:Program FilesNVIDIA GPU Computing ToolkitCUDAv11.1include"  -G   --keep-dir x64Debug -maxrregcount=0  --machine 64 --compile -cudart static  -g   -D_MBCS -DLIB_EXPORTS -D_TIMESPEC_DEFINED -D_SCL_SECURE_NO_WARNINGS -D_CRT_SECURE_NO_WARNINGS -DGPU -DWIN32 -DDEBUG -D_CONSOLE -D_LIB -D_WINDLL -D_MBCS -Xcompiler "/EHsc /W3 /nologo /Od /Fdx64DLL_Debugvc142.pdb /FS /Zi /RTC1 /MDd " -o x64DLL_Debugcrop_layer_kernels.cu.obj "D:Projectsdarknet-mastersrccrop_layer_kernels.cu"”已退出,返回代码为 1。yolo_cpp_dll C:Program Files (x86)Microsoft Visual Studio2019ProfessionalMSBuildMicrosoftVCv160BuildCustomizationsCUDA 11.1.targets 785

接下来,右键点击解决方案,进入到项目属性,点击CUDA C/C --> Device,找到Code Generation,将compute_30;sm_30删除,然后保存,重新生成

windows darknet

这时候就能够编译成功了

windows darknet

最近再多聊一句,在python中使用上面生成的yolo_cpp_dll.dll文件时(通常使用ctypes这个库)需要注意下,由于yolo_cpp_dll.dll依赖于同目录下的pthreadGC2.dllpthreadVC2.dll,因此,想通过ctypes.CDLL来调用yolo_cpp_dll.dll,就需要讲这几个dll文件放在同一个目录下,不然就会报类似下面的错误

代码语言:javascript复制
python CDLL OSError: [WinError 126] The specified module could not be found

参考资料

  • https://xugaoxiang.com/2019/12/18/windows-10-cuda-cudnn/
  • https://xugaoxiang.com/2019/12/16/darknet-basic/

0 人点赞