前言
YOLO 是一个即时物件侦测(object detection)的模型,它处理速度可达 30 FPS,可以用在视讯上侦测移动的物体,平均準确度(mAP)可达 43.5%。只是要使用它,必须由原始码建置,过程有些複杂,因此,将心得记录下来,与同好分享。
YOLO 已经进化到第4版了,最近才发行,热得发烫,赶快来试一下。
安装
YOLO 的基础为 Darknet,以 C 及 CUDA 撰写而成,官网同时提供 LINUX 及 Windows 作业系统下的建置程序,在 LINUX 上以 GCC 建置应该是比较直觉而简单,不过,笔者比较习惯使用 Windows 作业系统,因此,本文主要是说明在 Windows 下如何建置Darknet。
前置作业
前置作业须先安装下列软体:
VS 2017 或 2019:须安装 VC toolset、English language pack 元件。
CUDA/CuDNN 并不是安装最新版,需参考专案档内的设定(darknet-master\build\darknet\darknet.vcxproj),使用记事本观看最后几行,目前是採用 v11.1:

另外,必须把CUDA 的 bin 路径加入环境变数 path 中,另外加入一环境变数 CUDA_PATH_V11_1,值为CUDA安装路径『C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.1』。
可以使用记事本修改darknet.vcxproj,将CUDA版本更新,例如,11.1改为11.2,注意有两处要改,可搜寻【11.】,环境变数也要随之更改为CUDA_PATH_V11_2,值为CUDA安装路径『C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.2』。
OpenCV:版本须 > 2.4,下载原始程式码。编译及建置
自OpenCV官网下载 OpenCV Sources。解压缩至 c:\ 或 d:\,以下假设解压缩在d:\opencv。自Darknet github下载程式码,解压缩,,以下假设安装在D:\darknet-master。以 Visual Studio 开启 D:\darknet-master\build\darknet\darknet.sln 档案,会出现升级视窗,点选【确定】。 注意,若无NVidia独立显卡,改开启 darknet_no_gpu.sln。如要使用其他版本,例如11.2,请修改darknet.vcxproj、yolo_cpp_dll.vcxproj,搜寻11.1 改为 11.2 (有两处)。若无 NVidia 独立显卡,也可以建置专案,开启 darknet-master\build\darknet\darknet_no_gpu.vcxproj、yolo_cpp_dll_no_gpu.vcxproj,建置即可。
将Configuration 改为 release、x64。
修改专案属性,编修【VC++ Directories】> 【Include Directories】,加上:
D:\opencv\build\includeD:\opencv\build\include\opencv2

建置yolo_cpp_dll_no_gpu.vcxproj,若发生错误 LNK2001 unresolved external symbol make_implicit_layer,可依照编译yolo遇到 LNK2001 无法解析的外部符号 make_implicit_layer一文修改,文中的66行不用添加。建置成功的档案也是yolo_cpp_dll.dll。
在darknet专案上按滑鼠右键,选【重建】,若出现【建置成功】,表示大功告成,执行档在 D:\darknet-master\build\darknet\x64 目录下。
自 D:\openCV\build\x64\vc15\lib 複製 opencv_world430.lib 至 D:\darknet-master\build\darknet\x64 目录下。注意使用 vs2017,目录应改为 vc14。
自 D:\openCV\build\x64\vc15\bin\ 複製 opencv_world430.dll 至 D:\darknet-master\build\darknet\x64 目录下。注意使用 vs2017,目录应改为 vc14。
自『这里』下载 yolov4.weights,放入 D:\darknet-master\build\darknet\x64 目录。
执行下列指令测试:
darknet.exe detect .\cfg\yolov4.cfg .\yolov4.weights .\data\dog.jpg
另外目录下还有许多 *.cmd 档案可测试。
若无 NVidia 独立显卡,使用 darknet_no_gpu.exe,指令如下:
darknet_no_gpu.exe detect .\cfg\yolov4.cfg .\yov4.weights .\data\dog.jpg
若要使用 Python 呼叫 darknet API,需重建 yolo_cpp_dll.sln,修改方式与darknet专案相同。
複製必要的函数库:
自D:\darknet-master\3rdparty\pthreads\bin 複製 pthreadGC2.dll、pthreadVC2.dll自D:\openCV\build\bin 複製 opencv_videoio_ffmpeg430_64.dll自 D:\openCV\build\x64\vc15\lib 複製 opencv_world430.lib複製D:\darknet-master\darknet_images.py至D:\darknet-master\build\darknet\x64目录内,注意,2022/05版本darknet_images.py程式106行有错:if type(image_or_path) == "str":# 应改为if type(image_or_path) == str:
执行下列指令测试:
python darknet_images.py --input data/dog.jpg
要测试 no gpu 版本,可建置 yolo_cpp_dll_no_gpu.sln。
若发现dll找不到,可修改darknet.py加一行:
lib = CDLL("yolo_cpp_dll.dll", RTLD_GLOBAL)
还有一个 performBatchDetect function,可一次测试多个档案。
视讯测试:找一个视讯档,假设为test.mp4,执行下列指令:
python darknet_video.py --data_file cfg/coco.data --config_file cfg/yolov4.cfg --input test.mp4
输出截图如下:
vcpkg 建置成功的程序
官网另外提供两种 Windows 版的建置方法,建置时间较长:
CMake:官网建议的方式。vcpkg:程序比较複杂。依官网建议的方式,笔者从 CMake 着手,虽然很顺利建置成功,但测试时却发生以下错误。
Google 一阵子,始终找不到解决的方法,因此,就不浪费篇幅说明建置的过程了。
以下就详细说明另一种建置方法 -- vcpkg。
搞定上述软体,开始建置Darknet,程序如下:
执行cmd,开启DOS视窗。首先从『官网』下载程式码或执行下列指令:git clone https://github.com/Microsoft/vcpkg.git更改当前目录至vcpkg:
cd vcpkg执行 .\bootstrap-vcpkg.bat建置 Darknet,执行下列指令,需要执行20分钟以上:
.\vcpkg install darknet[full]:x64-windows
花了半天的时间才搞定它,执行档目录在 vcpkg\installed\x64-windows\tools\darknet。
测试程序如下:
darknet detector cfg/yolov4.cfg yolov4.weights data/dog.jpg
正确侦测到自行车及狗,胜利成功, Ya !!
建置注意事项
使用 VS 2019,建置若有错误,可修改下列事项:
注意 darknet.vcxproj、yolo_cpp_dll.vcxproj 内的 CUDA 版本,目前(2021/11/08) 为 CUDA 11.1。需加入一环境变数 CUDA_PATH_V11_1,值为CUDA安装路径(C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.1)。, 如要使用其他版本,例如11.2,请修改darknet.vcxproj、yolo_cpp_dll.vcxproj,搜寻11.1 改为 11.2 (有两处)。複製 C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.1\extras\visual_studio_integration\MSBuildExtensions\*.* 至 C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\MSBuild\Microsoft\VC\v160\BuildCustomizations。修改专案属性 > C/C++ > 命令列,在其他选项加 /FS,点选【套用】钮。清除专案,再建置专案。若出现【dropout_layer_kernels.cu error code 2】错误,在【工具》选项》专案和方案》建置并执行】的【平时专案组见的最大数目】修改为 1。无 NVidia 独立显卡
没有 NVidia 独立显卡,也可以建置专案,开启 darknet-master\build\darknet\darknet_no_gpu.vcxproj、yolo_cpp_dll_no_gpu.vcxproj,建置即可。
目前(2021/11/08)下载的yolo_cpp_dll_no_gpu.vcxproj有问题,专案需加入representation_layer.c、 representation_layer.h 两个档案,同时专案属性的目标名称须改为『$(ProjectName)』。
参阅『LNK2001 usresolved external symbol make_implicit_layer』。
常见错误
yolo_cpp_dll.dll not found:
检查相关的OpenCV library是否複製到目前目录下(第14步骤)。正确版本的 CUDA/CuDNN 是否安装。如果安装较新版本的CUDA/CuDNN,也可能出现此错误,可在程式中加入以下指令,直接指定CUDA/CuDNN 所在位置及yolo_cpp_dll.dll/yolo_cpp_dll_no_gpu.dll所在目录。os.add_dll_directory('c:/Program Files/NVIDIA GPU Computing Toolkit/CUDA/v11.1/bin')os.add_dll_directory(os.path.dirname(__file__))
参见StackOverflow。
编译时发生【CUDA 11.target XAML 无法编译】错误时,请将c:windows\temp目录尽可能清空,再重建专案即可。每隔一段时间重新编译Darknet,总是会出现各式的问题,都要搞到半夜,钱难赚啊!!结语
YOLO 4 专案虽然持续的扩充功能,但是测试好像不太周延,目前出现许多错误,侦错有点辛苦。
工商广告一下:
PyTorch:
开发者传授 PyTorch 秘笈
预计 2022/6/20 出版。
TensorFlow:
深度学习 -- 最佳入门迈向 AI 专题实战。