Darknet Object Detection Framework and YOLO
Downcodes小编带您深入了解Darknet,一个用C、C++和CUDA编写开源神经网络框架,以及运行在Darknet框架上的先进实时目标检测系统YOLO(You Only Look Once)。
Darknet/YOLO框架比其他框架和YOLO版本更快、更精确。这个框架是完全免费和开源的。您可以将Darknet/YOLO整合到现有项目和产品中,包括商业项目,而无需许可证或付费。
Darknet V3(“Jazz”)于2024年10月发布,使用NVIDIA RTX 3090 GPU时,可以准确地运行LEGO数据集视频,速度高达1000 FPS,这意味着每个视频帧在1毫秒或更短的时间内由Darknet/YOLO读取、调整大小和处理。
如果您需要帮助或想讨论Darknet/YOLO,请加入Darknet/YOLO Discord服务器:https://discord.gg/zSq8rtW
Darknet/YOLO的CPU版本可以在简单设备上运行,如树莓派、云和协作服务器、台式机、笔记本电脑以及高端训练设备。Darknet/YOLO的GPU版本需要NVIDIA的CUDA支持GPU。
Darknet/YOLO已知可以在Linux、Windows和Mac上运行。请查看下面的构建说明。
Joseph Redmon在2013-2017年编写的原始Darknet工具没有版本号。我们认为这是0.x版本。
Alexey Bochkovskiy在2017-2021年维护的下一个流行Darknet库也没有版本号。我们认为这是1.x版本。
从2023年开始,由Hank.ai赞助,Stéphane Charette维护的Darknet库是第一个拥有版本命令的库。从2023年到2024年底,它返回版本2.x“OAK”。
目标是在熟悉代码库的同时,尽量减少对现有功能的破坏。
重新编写构建步骤,以便我们有1种统一的方法在Windows和Linux上使用CMake进行构建。
将代码库转换为使用C++编译器。
增强训练过程中的chart.png。
错误修复和与性能相关的优化,主要涉及减少训练网络所需的时间。
此代码库的最后一个分支是v2分支中的版本2.1。
下一阶段的开发始于2024年中期,并在2024年10月发布。版本命令现在返回3.x“JAZZ”。
如果您需要运行这些命令之一,您始终可以签出之前的v2分支。请告知我们,以便我们调查添加回任何缺失的命令。
删除了许多旧的和未维护的命令。
在训练和推理过程中,进行了许多性能优化。
更改了遗留C API;使用原始Darknet API的应用程序需要进行少量修改:https://darknetcv.ai/api/api.html
新的Darknet V3 C和C++ API:https://darknetcv.ai/api/api.html
src-examples中的新应用程序和示例代码:https://darknetcv.ai/api/files.html
为了方便起见,YOLO的几个流行版本在MSCOCO数据集上进行了预训练。此数据集有80个类别,可以在文本文件cfg/coco.names中看到。
还有几个其他更简单的可用于测试Darknet/YOLO的数据集和预训练权重,例如LEGO Gears和Rolodex。有关详细信息,请参阅Darknet/YOLO常见问题解答。
可以从多个不同的位置下载MSCOCO预训练权重,并且也可以从此仓库下载:
YOLOv2,2016年11月
* YOLOv2-tiny
* YOLOv2-full
YOLOv3,2018年5月
* YOLOv3-tiny
* YOLOv3-full
YOLOv4,2020年5月
* YOLOv4-tiny
* YOLOv4-full
YOLOv7,2022年8月
* YOLOv7-tiny
* YOLOv7-full
MSCOCO预训练权重仅用于演示目的。MSCOCO对应的.cfg和.names文件位于cfg目录中。示例命令:
`
wget --no-clobber https://github.com/hank-ai/darknet/releases/download/v2.0/yolov4-tiny.weights
darknet02displayannotatedimages coco.names yolov4-tiny.cfg yolov4-tiny.weights image1.jpg
darknet03display_videos coco.names yolov4-tiny.cfg yolov4-tiny.weights video1.avi
DarkHelp coco.names yolov4-tiny.cfg yolov4-tiny.weights image1.jpg
DarkHelp coco.names yolov4-tiny.cfg yolov4-tiny.weights video1.avi
`
请注意,人们应该训练自己的网络。MSCOCO通常用于确认一切正常工作。
过去(2023年之前)提供的各种构建方法已合并到一个统一的解决方案中。Darknet需要C++17或更高版本、OpenCV,并使用CMake生成必要的项目文件。
您不需要了解C++就可以构建、安装或运行Darknet/YOLO,就像您不需要成为机械师就可以驾驶汽车一样。
Google Colab的说明与Linux的说明相同。提供了一些Jupyter笔记本,展示了如何执行某些任务,例如训练新网络。
请查看colab子目录中的笔记本,或者按照下面的Linux说明操作。
Darknet在Linux上的构建教程
可选:如果您拥有现代的NVIDIA GPU,则可以此时安装CUDA或CUDA+cuDNN。如果已安装,Darknet将使用您的GPU来加速图像(和视频)处理。
您必须从Darknet构建目录中删除CMakeCache.txt文件,以强制CMake重新查找所有必需的文件。
请记住重新构建Darknet。
Darknet可以在没有它的情况下运行,但是如果您想训练自定义网络,则需要CUDA或CUDA+cuDNN。
访问https://developer.nvidia.com/cuda-downloads下载并安装CUDA。
访问https://developer.nvidia.com/rdp/cudnn-download或https://docs.nvidia.com/deeplearning/cudnn/install-guide/index.html#cudnn-package-manager-installation-overview下载并安装cuDNN。
安装CUDA后,确保可以运行nvcc和nvidia-smi。您可能需要修改PATH变量。
如果您在稍后安装CUDA或CUDA+cuDNN,或者升级到NVIDIA软件的较新版本:
这些说明假设(但不要求!)运行Ubuntu 22.04的系统。如果您使用的是其他发行版,请根据需要进行调整。
`
sudo apt-get install build-essential git libopencv-dev cmake
mkdir ~/srccd ~/src
git clone https://github.com/hank-ai/darknetcd darknet
mkdir buildcd build
cmake -DCMAKEBUILDTYPE=Release ..
make -j4 package
sudo dpkg -i darknet-VERSION.deb
`
如果您使用的是旧版本的CMake,则需要在运行上面的cmake命令之前升级CMake。可以使用以下命令在Ubuntu上升级CMake:
`
sudo apt-get purge cmakesudo snap install cmake --classic
`
如果您使用bash作为命令外壳,则需要在此时重新启动外壳。如果使用fish,它应该立即获取新的路径。
高级用户:
如果您想构建RPM安装文件而不是DEB文件,请参阅CM_package.cmake中的相关行。在运行make -j4 package之前,您需要编辑这两行:
`
SET (CPACKGENERATOR "DEB")# SET (CPACKGENERATOR "RPM")
`
对于像Centos和OpenSUSE这样的发行版,您需要将CM_package.cmake中的这两行切换为:
`
SET (CPACKGENERATOR "DEB")SET (CPACKGENERATOR "RPM")
`
安装包构建完成后,可以使用发行版的常用包管理器进行安装。例如,在基于Debian的系统(如Ubuntu)上:
`
sudo dpkg -i darknet-2.0.1-Linux.deb
`
安装.deb包将复制以下文件:
/usr/bin/darknet是常用的Darknet可执行文件。从CLI运行darknet version以确认它已正确安装。
/usr/include/darknet.h是供C、C++和Python开发人员使用的Darknet API。
/usr/include/darknet_version.h包含开发人员的版本信息。
/usr/lib/libdarknet.so是供C、C++和Python开发人员链接的库。
/opt/darknet/cfg/...是存储所有.cfg模板的位置。
您现在完成了!Darknet已构建并安装到/usr/bin/中。运行以下命令进行测试:darknet version。
如果您没有/usr/bin/darknet,则意味着您没有安装它,您只是构建了它!请确保按照上面的说明安装.deb或.rpm文件。
这些说明假设Windows 11 22H2全新安装。
打开一个普通的cmd.exe命令提示符窗口,并运行以下命令:
`
winget install Git.Git
winget install Kitware.CMake
winget install nsis.nsis
winget install Microsoft.VisualStudio.2022.Community
`
此时,我们需要修改Visual Studio安装以包括对C++应用程序的支持:
1. 点击“Windows开始”菜单,然后运行“Visual Studio Installer”。
2. 点击修改。
3. 选择使用C++的桌面开发。
4. 点击右下角的修改,然后点击是。
所有内容下载并安装完成后,再次点击“Windows开始”菜单,然后选择VS 2022的开发者命令提示符。不要使用PowerShell进行这些步骤,您会遇到问题!
高级用户:
除了运行开发者命令提示符,您也可以使用普通命令提示符或ssh到设备,并手动运行“Program FilesMicrosoft Visual Studio2022CommunityCommon7ToolsVsDevCmd.bat”。
运行上述(不是PowerShell!)的开发者命令提示符后,运行以下命令安装Microsoft VCPKG,然后将使用它构建OpenCV:
`
cd c:
mkdir c:srccd c:src
git clone https://github.com/microsoft/vcpkgcd vcpkg
bootstrap-vcpkg.bat .vcpkg.exe integrate
install .vcpkg.exe integrate powershell.vcpkg.exe install opencv[contrib,dnn,freetype,jpeg,openmp,png,webp,world]:x64-windows
`
在最后一步中耐心等待,因为它可能需要很长时间才能运行。它需要下载并构建许多东西。
高级用户:
请注意,在构建OpenCV时,您可以添加许多其他可选模块。运行.vcpkg.exe search opencv查看完整列表。
可选:如果您拥有现代的NVIDIA GPU,则可以此时安装CUDA或CUDA+cuDNN。如果已安装,Darknet将使用您的GPU来加速图像(和视频)处理。
您必须从Darknet构建目录中删除CMakeCache.txt文件,以强制CMake重新查找所有必需的文件。
请记住重新构建Darknet。
Darknet可以在没有它的情况下运行,但是如果您想训练自定义网络,则需要CUDA或CUDA+cuDNN。
访问https://developer.nvidia.com/cuda-downloads下载并安装CUDA。
访问https://developer.nvidia.com/rdp/cudnn-download或https://docs.nvidia.com/deeplearning/cudnn/install-guide/index.html#download-windows下载并安装cuDNN。
安装CUDA后,确保可以运行nvcc.exe和nvidia-smi.exe。您可能需要修改PATH变量。
下载cuDNN后,将其解压缩并将bin、include和lib目录复制到C:/Program Files/NVIDIA GPU Computing Toolkit/CUDA/[version]/中。您可能需要覆盖一些文件。
如果您在稍后安装CUDA或CUDA+cuDNN,或者升级到NVIDIA软件的较新版本:
CUDA必须在Visual Studio之后安装。如果您升级Visual Studio,请记住重新安装CUDA。
所有先前的步骤成功完成之后,您需要克隆Darknet并构建它。在此步骤中,我们还需要告诉CMake vcpkg的位置,以便它可以找到OpenCV和其他依赖项:
`
cd c:src
git clone https://github.com/hank-ai/darknet.gitcd darknet
mkdir buildcd build
cmake -DCMAKEBUILDTYPE=Release -DCMAKETOOLCHAINFILE=C:/src/vcpkg/scripts/buildsystems/vcpkg.cmake ..
msbuild.exe /property:Platform=x64;Configuration=Release /target:Build -maxCpuCount -verbosity:normal -detailedSummary darknet.sln
msbuild.exe /property:Platform=x64;Configuration=Release PACKAGE.vcxproj
`
如果您收到有关某些缺失的CUDA或cuDNN DLL(如cublas64_12.dll)的错误,则手动将CUDA .dll文件复制到与Darknet.exe相同的输出目录中。例如:
`
copy "C:Program FilesNVIDIA GPU Computing ToolkitCUDAv12.2bin*.dll" src-cliRelease
`
(这是一个示例!请检查您正在运行的版本,并运行适合您已安装内容的命令。)
复制完文件后,重新运行最后一个msbuild.exe命令以生成NSIS安装包:
`
msbuild.exe /property:Platform=x64;Configuration=Release PACKAGE.vcxproj
`
高级用户:
请注意,cmake命令的输出是一个正常的Visual Studio解决方案文件,Darknet.sln。如果您是经常使用Visual Studio GUI而不是msbuild.exe来构建项目的软件开发人员,则可以忽略命令行并在Visual Studio中加载Darknet项目。
您现在应该拥有以下可以运行的文件:C:srcDarknetbuildsrc-cliReleasedarknet.exe。运行以下命令进行测试:C:srcDarknetbuildsrc-cliReleasedarknet.exe version。
要正确安装Darknet、库、包含文件和必要的DLL,请运行在最后一步中构建的NSIS安装向导。请查看构建目录中的darknet-VERSION.exe文件。例如:
`
darknet-2.0.31-win64.exe
`
安装NSIS安装包将:
创建一个名为Darknet的目录,例如C:Program FilesDarknet。
安装CLI应用程序,darknet.exe和其他示例应用程序。
安装所需的第三方.dll文件,例如来自OpenCV的那些文件。
安装必要的Darknet .dll、.lib和.h文件,以便从另一个应用程序中使用darknet.dll。
安装模板.cfg文件。
您现在完成了!安装向导完成后,Darknet将被安装到C:Program FilesDarknet中。运行以下命令进行测试:C:Program FilesDarknetbindarknet.exe version。
如果您没有C:/Program Files/darknet/bin/darknet.exe,则意味着您没有安装它,您只是构建了它!请确保完成上一步中NSIS安装向导的每个面板。
以下不是Darknet支持的所有命令的完整列表。
除了Darknet CLI之外,还要注意DarkHelp项目CLI,它提供了一个与Darknet/YOLO不同的CLI。DarkHelp CLI还具有几个在Darknet中不可直接使用的高级功能。您可以同时使用Darknet CLI和DarkHelp CLI,它们并不相互排斥。
对于下面显示的大多数命令,您将需要.weights文件以及对应的.names和.cfg文件。您可以自己训练网络(强烈推荐!),或者下载其他人已经训练并在互联网上免费提供的网络。预训练数据集的示例包括:
LEGO Gears(在图像中查找物体)
Rolodex(在图像中查找文本)
MSCOCO(标准80类目标检测)
可以运行的命令包括:
列出一些可以运行的命令和选项:
`
darknet help
`
检查版本:
`
darknet version
`
使用图像进行预测:
`
V2: darknet detector test cars.data cars.cfg cars_best.weights image1.jpg
V3: darknet02displayannotatedimages cars.cfg image1.jpg
DarkHelp: DarkHelp cars.cfg cars.cfg cars_best.weights image1.jpg
`
输出坐标:
`
V2: darknet detector test animals.data animals.cfg animalsbest.weights -extoutput dog.jpg
V3: darknet01inference_images animals dog.jpg
DarkHelp: DarkHelp --json animals.cfg animals.names animals_best.weights dog.jpg
`
使用视频:
`
V2: darknet detector demo animals.data animals.cfg animalsbest.weights -extoutput test.mp4
V3: darknet03display_videos animals.cfg test.mp4
DarkHelp: DarkHelp animals.cfg animals.names animals_best.weights test.mp4
`
从网络摄像头读取:
`
V2: darknet detector demo animals.data animals.cfg animals_best.weights -c 0
V3: darknet08display_webcam animals
`
将结果保存到视频:
`
V2: darknet detector demo animals.data animals.cfg animalsbest.weights test.mp4 -outfilename res.avi
V3: darknet05processvideosmultithreaded animals.cfg animals.names animals_best.weights test.mp4
DarkHelp: DarkHelp animals.cfg animals.names animals_best.weights test.mp4
`
JSON:
`
V2: darknet detector demo animals.data animals.cfg animalsbest.weights test50.mp4 -jsonport 8070 -mjpegport 8090 -extoutput
V3: darknet06imagestojson animals image1.jpg
DarkHelp: DarkHelp --json animals.names animals.cfg animals_best.weights image1.jpg
`
在特定GPU上运行:
`
V2: darknet detector demo animals.data animals.cfg animals_best.weights -i 1 test.mp4
`
检查神经网络的准确性:
`
darknet detector map driving.data driving.cfg driving_best.weights ...
Id Name AvgPrecision TP FN FP TN Accuracy ErrorRate Precision Recall Specificity FalsePosRate
-- ---- ------------ ------ ------ ------ ------ -------- --------- --------- ------ ----------- ------------
0 vehicle 91.2495 32648 3903 5826 65129 0.9095 0.0905 0.8486 0.8932 0.9179 0.0821
1 motorcycle 80.4499 2936 513 569 5393 0.8850 0.1150 0.8377 0.8513 0.9046 0.0954
2 bicycle 89.0912 570 124 104 3548 0.9475 0.0525 0.8457 0.8213 0.9715 0.0285
3 person 76.7937 7072 1727 2574 27523 0.8894 0.1106 0.7332 0.8037 0.9145 0.0855
4 many vehicles 64.3089 1068 509 733 11288 0.9087 0.0913 0.5930 0.6772 0.9390 0.0610
5 green light 86.8118 1969 239 510 4116 0.8904 0.1096 0.7943 0.8918 0.8898 0.1102
6 yellow light 82.0390 126 38 30 1239 0.9525 0.0475 0.8077 0.7683 0.9764 0.0236
7 red light 94.1033 3449 217 451 4643 0.9237 0.0763 0.8844 0.9408 0.9115 0.0885
`
检查mAP@IoU=75的准确性:
`
darknet detector map animals.data animals.cfg animalsbest.weights -iouthresh 0.75
`
重新计算锚点最好在DarkMark中完成,因为它会连续运行100次并从所有计算出的锚点中选择最佳锚点。但是,如果您想在Darknet中运行旧版本,请使用以下命令:
`
darknet detector calcanchors animals.data -numof_clusters 6 -width 320 -height 256
`
训练新网络:
`
darknet detector -map -dont_show train animals.data animals.cfg (另请参阅下面的训练部分)
`
与Darknet/YOLO常见问题解答相关部分的快速链接:
我应该如何设置我的文件和目录?
我应该使用哪个配置文件?
在训练自己的网络时,我应该使用哪个命令?
使用DarkMark注释和训练的最简单方法是创建所有必要的Darknet文件。这绝对是训练新神经网络的推荐方法。
如果您想手动设置各种文件以训练自定义网络:
1. 创建一个新的文件夹来存储这些文件。对于此示例,将创建一个检测动物的神经网络,因此将创建以下目录:~/nn/animals/。
2. 复制您想用作模板的Darknet配置文件之一。例如,请参阅cfg/yolov4-tiny.cfg。将其放置在您创建的文件夹中。对于此示例,我们现在有~/nn/animals/animals.cfg。
3. 在放置配置文件的同一文件夹中,创建一个animals.names文本文件。对于此示例,我们现在有~/nn/animals/animals.names。
4. 使用文本编辑器编辑animals.names文件。列出您要使用的类别。您需要每行正好有一个条目,没有空行也没有注释。对于此示例,.names文件将恰好包含4行:
`
dog
cat
bird
horse
`
5. 在同一文件夹中创建一个animals.data文本文件。对于此示例,.data文件将包含:
`
classes = 4
train = /home/username/nn/animals/animals_train.txt
valid = /home/username/nn/animals/animals_valid.txt
names = /home/username/nn/animals/animals.names
backup = /home/username/nn/animals
`
6. 创建一个文件夹来存储您的图像和注释。例如,这可以是~/nn/animals/dataset。每个图像都需要一个相应的.txt文件,其中描述了该图像的注释。.txt注释文件的格式非常特定。您不能手动创建这些文件,因为每个注释都需要包含注释的确切坐标。请参阅DarkMark或其他类似软件来注释您的图像。YOLO注释格式在Darknet/YOLO常见问题解答中有所描述。
7. 创建.data文件中命名的“train”和“valid”文本文件。这两个文本文件需要分别列出所有Darknet必须用于训练和验证的图像,以便计算mAP%。每行正好有一个图像。路径和文件名可以是相对路径或绝对路径。
8. 使用文本编辑器修改您的.cfg文件。
* 确保batch=64。
* 注意subdivisions。根据网络尺寸和GPU上的可用内存量,您可能需要增加subdivisions。最佳值是1,因此从1开始。如果您无法使用1,请参阅Darknet/YOLO常见问题解答。
注意maxbatches=.... 开始时使用的最佳值是类数的2000倍。对于此示例,我们有4种动物,因此4 2000 = 8000。这意味着我们将使用maxbatches=8000。
* 注意steps=.... 这应该设置为maxbatches的80%和90%。对于此示例,我们将使用steps=6400,7200,因为maxbatches设置为8000。
* 注意width=...和height=.... 这些是网络尺寸。Darknet/YOLO常见问题解答解释了如何计算要使用的最佳大小。
* 在[convolutional]部分中搜索classes=...行,并在每个[yolo]部分之前修改它,使其包含.names文件中的类别数。对于此示例,我们将使用classes=4。
在每个[yolo]部分之前的[convolutional]部分中搜索filters=...行。要使用的值为(类别数+5) 3。这意味着对于此示例,(4 + 5)* 3 = 27。因此,我们在适当的行上使用filters=27。
9. 开始训练!运行以下命令:
`
cd ~/nn/animals/
darknet detector -map -dont_show train animals.data animals.cfg
`
耐心等待。最佳权重将保存为animals_best.weights。并且可以通过查看chart.png文件来观察训练的进度。有关在训练新网络时可能想要使用的其他参数,请参阅Darknet/YOLO常见问题解答。
如果您想在训练期间查看更多详细信息,请添加--verbose参数。例如:
`
darknet detector -map -dont_show --verbose train animals.data animals.cfg
`
要管理您的Darknet/YOLO项目、注释图像、验证您的注释以及生成与Darknet一起训练的必要文件,请参阅DarkMark。
要获得一个强大的Darknet替代CLI、使用图像平铺、在您的视频中进行目标跟踪或使用可以轻松地用于商业应用程序的强大C++ API,请参阅DarkHelp。
请查看Darknet/YOLO常见问题解答,看看它是否可以帮助您解答问题。
在Stéphane的YouTube频道上观看许多教程和示例视频
如果您有支持问题或想与其他Darknet/YOLO用户聊天,请加入Darknet/YOLO Discord服务器。
最后更新时间:2024-10-30
将训练期间使用的qsort()替换为std::sort()(一些其他鲜为人知的仍然存在)
摆脱check_mistakes、getchar()和system()
将Darknet转换为使用C++编译器(Linux上的g++、Windows上的VisualStudio)
修复Windows构建
修复Python支持
构建darknet库
重新启用预测的标签(“alphabet”代码)
重新启用CUDA/GPU代码
重新启用CUDNN
重新启用CUDNN half
不要硬编码CUDA架构
更好的CUDA版本信息
重新启用AVX
删除旧的解决方案和Makefile
使OpenCV成为非可选
删除对旧pthread库的依赖
删除STB
重新编写CMakeLists.txt以使用新的CUDA检测
删除旧的“alphabet”代码,并删除data/labels中的700多张图像
构建源外
拥有更好的版本号输出
与训练相关的性能优化(正在进行的任务)
与推理相关的性能优化(正在进行的任务)
尽可能使用传值引用
清理.hpp文件
重新编写darknet.h
不要将cv::Mat转换为void,而应将其用作适当的C++对象
修复或保持内部图像结构的使用方式一致
修复ARM based Jetson设备的构建
* 由于NVIDIA不再支持原始的Jetson设备,因此它们不太可能被修复(没有C++17编译器)
* 新的Jetson Orin设备正在运行
修复V3中的Python API
* 需要更好的Python支持(有Python开发人员愿意帮助吗?)
将printf()替换为std::cout(正在进行中)
研究旧的zed相机支持
更好、更一致的命令行解析(正在进行中)
删除所有char代码并替换为std::string
不要隐藏警告并清理编译器警告(正在进行中)
更好地使用cv::Mat而不是C中的自定义图像结构(正在进行中)
将旧的列表功能替换为std::vector或std::list
修复对1通道灰度图像的支持
添加对N通道图像的支持,其中N > 3(例如,具有额外深度或热通道的图像)
正在进行的代码清理(正在进行中)
修复所有GPU的CUDA/CUDNN问题
重新编写CUDA+cuDNN代码
考虑添加对非NVIDIA GPU的支持
旋转的边界框,或某种“角度”支持
关键点/骨架
热图(正在进行中)
分割