欢迎访问我的网站,希望内容对您有用,感兴趣的可以加入我们的社群。

windows编译yolov4,包括exe和dll

YOLO 迷途小书童 4年前 (2021-03-27) 5124次浏览 0个评论

软硬件环境

  • 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, 这里不再赘述。

安装配置opencv

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

windows darknet

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

windows darknet

windows darknet

接下来分别将 opencv 下的 build\x64\vc15\binbuild\x64\vc15\lib 目录,追加到 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

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

然后执行图片测试命令

.\darknet.exe detect cfg\yolov4.cfg yolov4.weights data\dog.jpg

windows darknet

编译dll

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

windows darknet

同样地,右键生成

windows darknet

这里出现了一个错误

错误  MSB4019 找不到导入的项目“C:\Program Files (x86)\Microsoft Visual Studio\2019\Professional\MSBuild\Microsoft\VC\v160\BuildCustomizations\CUDA 10.1.props”。请确认 Import 声明“C:\Program Files (x86)\Microsoft Visual Studio\2019\Professional\MSBuild\Microsoft\VC\v160\\BuildCustomizations\CUDA 10.1.props”中的表达式正确,且文件位于磁盘上。    yolo_cpp_dll    D:\Projects\darknet-master\build\darknet\yolo_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

错误  MSB3721 命令“"C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.1\bin\nvcc.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 Studio\2019\Professional\VC\Tools\MSVC\14.24.28314\bin\HostX86\x64" -x cu   -ID:\Tools\OpenCV\opencv\build\include -IC:\opencv_3.0\opencv\build\include -I..\..\include -I..\..\3rdparty\stb\include -I..\..\3rdparty\pthreads\include -I"C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.1\include" -I"C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.1\include" -I\include -I\include -I"C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.1\include"  -G   --keep-dir x64\Debug -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 /Fdx64\DLL_Debug\vc142.pdb /FS /Zi /RTC1 /MDd " -o x64\DLL_Debug\crop_layer_kernels.cu.obj "D:\Projects\darknet-master\src\crop_layer_kernels.cu"”已退出,返回代码为 1。 yolo_cpp_dll    C:\Program Files (x86)\Microsoft Visual Studio\2019\Professional\MSBuild\Microsoft\VC\v160\BuildCustomizations\CUDA 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 文件放在同一个目录下,不然就会报类似下面的错误

python CDLL OSError: [WinError 126] The specified module could not be found

参考资料

喜欢 (1)

您必须 登录 才能发表评论!