软硬件环境
- 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/
下载后是一个 exe
文件,打开傻瓜式一步步安装就好了,记录好安装路径(我这里是 D:\Tools\OpenCV\opencv
),然后增加一个环境变量 OpenCV_DIR
,指向 opencv
安装后的 build
目录,如下
接下来分别将 opencv
下的 build\x64\vc15\bin
和 build\x64\vc15\lib
目录,追加到 PATH
环境变量中,如下
编译darknet.exe
下载 cmake
,地址是:https://cmake.org/download/,也是傻瓜式的安装。然后打开 cmake-gui.exe
源码目录和编译目标目录都指向 darknet
的源码目录,这里使用 AlexeyAB
的版本 https://github.com/AlexeyAB/darknet
接下来就是点击 Configure
然后就是 Generate
最后 Open Project
随即,visual studio 2019
就打开了 darknet
工程,点击右侧的 ALL_BUILD
–> 生成
等待一会,就可以编译完成
最后我们来测试一下,将 Debug\darknet.exe
和 3rdparty\pthreads\bin
下的 pthreadGC2.dll
和 pthreadVC2.dll
都拷贝到 darknet
源码根目录下,除此以外,还要准备权重文件 yolov4.weights
然后执行图片测试命令
.\darknet.exe detect cfg\yolov4.cfg yolov4.weights data\dog.jpg
编译dll
如果要编译动态链接库 dll
的话,进入到 darknet
源码下的 build\darknet
,用 visual studio 2019
打开 yolo_cpp_dll.sln
同样地,右键生成
这里出现了一个错误
错误 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
重新生成,还是报错
错误 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
删除,然后保存,重新生成
这时候就能够编译成功了
最近再多聊一句,在 python
中使用上面生成的 yolo_cpp_dll.dll
文件时(通常使用 ctypes
这个库)需要注意下,由于 yolo_cpp_dll.dll
依赖于同目录下的 pthreadGC2.dll
和 pthreadVC2.dll
,因此,想通过 ctypes.CDLL
来调用 yolo_cpp_dll.dll
,就需要讲这几个 dll
文件放在同一个目录下,不然就会报类似下面的错误
python CDLL OSError: [WinError 126] The specified module could not be found