YOLO v4 建置心得 -- Windows 环境

前言

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 元件。
http://img2.58codes.com/2024/20001976nSIaGFhOfy.png

http://img2.58codes.com/2024/20001976WYqH35ICFD.png

若有NVidia独立显卡,需安装 CUDA SDK:CUDA版本 > 10.0, cuDNN版本 > 7.0
CUDA/CuDNN 并不是安装最新版,需参考专案档内的设定(darknet-master\build\darknet\darknet.vcxproj),使用记事本观看最后几行,目前是採用 v11.1:
http://img2.58codes.com/2024/200019761nBm81mbap.png

另外,必须把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。
http://img2.58codes.com/2024/20001976th8GtYAgqU.png

修改专案属性,编修【VC++ Directories】> 【Include Directories】,加上:

D:\opencv\build\includeD:\opencv\build\include\opencv2
http://img2.58codes.com/2024/200019763NMcjHiSOY.png

http://img2.58codes.com/2024/20001976UqidrEam4V.png

编修【连结器】> 【输入】> 【其他相依性】,加上:D:\openCV\build\x64\vc15\lib\opencv_world430.lib注意,若安装较新版本的openCV,lib名称会不同,例如opencv_world454.lib。后面有d的档案为debug mode 使用,例如opencv_world454d.lib。
http://img2.58codes.com/2024/20001976NKkfUloMov.png

http://img2.58codes.com/2024/20001976Ld2hq4sf4H.png

建置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

输出截图如下:
http://img2.58codes.com/2024/200019768TmEXkAumn.png

vcpkg 建置成功的程序

官网另外提供两种 Windows 版的建置方法,建置时间较长:

CMake:官网建议的方式。vcpkg:程序比较複杂。

依官网建议的方式,笔者从 CMake 着手,虽然很顺利建置成功,但测试时却发生以下错误。
http://img2.58codes.com/2024/20001976e9i3EFxOoK.png

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。
测试程序如下:

下载 yolov4.cfg、yolov4.weights,放在 vcpkg\installed\x64-windows\tools\darknet 目录中。放一些图片在 data 目录中,执行下列指令:
darknet detector cfg/yolov4.cfg yolov4.weights data/dog.jpg

http://img2.58codes.com/2024/20001976yxqfzQ7bTb.png
正确侦测到自行车及狗,胜利成功, 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 秘笈
http://img2.58codes.com/2024/20001976MhL9K2rsgO.png
预计 2022/6/20 出版。

TensorFlow:
深度学习 -- 最佳入门迈向 AI 专题实战。
http://img2.58codes.com/2024/20001976ZOxC7BHyN3.jpg


关于作者: 网站小编

码农网专注IT技术教程资源分享平台,学习资源下载网站,58码农网包含计算机技术、网站程序源码下载、编程技术论坛、互联网资源下载等产品服务,提供原创、优质、完整内容的专业码农交流分享平台。

热门文章