目录
Darknet目标检测框架和YOLO
Darknet是一个用C、C++和CUDA编写的开源神经网络框架。
YOLO(You Only Look Once)是一个最先进的实时目标检测系统,在Darknet框架中运行。
- 了解Hank.ai如何帮助Darknet/YOLO社区
- 访问Darknet/YOLO网站:https://darknetcv.ai/
- 请阅读Darknet/YOLO常见问题解答:https://www.ccoderun.ca/programming/darknet_faq/
- 加入Darknet/YOLO Discord服务器:https://discord.gg/zSq8rtW
论文
- 论文 YOLOv7:https://arxiv.org/abs/2207.02696
- 论文 Scaled-YOLOv4:https://openaccess.thecvf.com/content/CVPR2021/html/Wang_Scaled-YOLOv4_Scaling_Cross_Stage_Partial_Network_CVPR_2021_paper.html
- 论文 YOLOv4:https://arxiv.org/abs/2004.10934
- 论文 YOLOv3:https://arxiv.org/abs/1804.02767
基本信息
YOLOv7的准确性和速度比YOLOv5快120% FPS,比YOLOX快180% FPS,比Dual-Swin-T快1200% FPS,比ConvNext快550% FPS,比SWIN-L快500% FPS,比PPYOLOE-X快150% FPS。
在5 FPS到160 FPS的范围内,YOLOv7在速度和准确性方面都超过了所有已知的目标检测器,并且在GPU V100上,batch=1,30 FPS或更高的所有已知实时目标检测器中具有最高的准确性56.8% AP。
MSCOCO预训练权重
为了方便起见,YOLO的几个流行版本在MSCOCO数据集上进行了预训练。该数据集有80个类别,可以在文本文件cfg/coco.names
中查看。
预训练权重可以从多个不同的位置下载,也可以从本仓库下载:
- YOLOv2,2016年11月
- YOLOv3,2018年5月
- YOLOv4,2020年5月
- YOLOv7,2022年8月
MSCOCO预训练权重仅供演示使用。人们应该训练自己的网络。
构建
过去可用的各种构建方法已合并为一个统一的解决方案。Darknet需要OpenCV,并使用CMake生成必要的项目文件。
**注意,如果你正在按照旧教程进行更复杂的构建步骤,或者构建步骤与本readme中的不一致,请小心。**新的构建步骤如下所述,始于2023年8月。
鼓励软件开发人员访问https://darknetcv.ai/ 获取有关Darknet/YOLO目标检测框架内部的信息。
Linux CMake方法
- 可选:如果你有现代NVIDIA GPU,你可以在此时安装CUDA或CUDA+cuDNN。如果安装了,Darknet将使用你的GPU来加速图像(和视频)处理。
- 访问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软件:
- 你必须删除Darknet
build
目录中的CMakeCache.txt
文件,以强制CMake重新查找所有必要的文件。 - 记得重新构建Darknet。
- 你必须删除Darknet
这些说明假设系统运行Ubuntu 22.04。
sudo apt-get install build-essential git libopencv-dev cmake
mkdir ~/src
cd ~/src
git clone https://github.com/hank-ai/darknet
cd darknet
mkdir build
cd build
cmake -DCMAKE_BUILD_TYPE=Release ..
make -j4 package
sudo dpkg -i darknet-VERSION.deb
如果你使用的是较旧版本的CMake,那么在运行上述cmake
命令之前,你需要升级CMake。在Ubuntu上升级CMake可以通过以下命令完成:
sudo apt-get purge cmake
sudo snap install cmake --classic
高级用户:
如果你想构建RPM安装文件而不是DEB文件,请查看
CM_package.cmake
中的相关行。在运行make -j4 package
之前,你需要编辑这两行:
SET (CPACK_GENERATOR "DEB")
# SET (CPACK_GENERATOR "RPM")
对于Centos和OpenSUSE等发行版,你需要将
CM_package.cmake
中的这两行切换为:
# SET (CPACK_GENERATOR "DEB")
SET (CPACK_GENERATOR "RPM")
要安装安装包,请使用你的发行版通常使用的包管理器。例如,在基于Debian的系统(如Ubuntu)上:
sudo dpkg -i darknet-2.0.1-Linux.deb
安装软件包将复制以下文件:
/usr/bin/darknet
是常用的 Darknet 可执行文件。从命令行运行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 CMake 方法
这些说明假设是全新安装的 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++ 应用程序的支持:
- 点击"Windows 开始"菜单并运行"Visual Studio Installer"
- 点击
修改
- 选择
使用 C++ 的桌面开发
- 点击右下角的
修改
,然后点击是
一切下载安装完成后,再次点击"Windows 开始"菜单并选择Developer Command Prompt for VS 2022
。不要使用 PowerShell 进行这些步骤,否则会遇到问题!
高级用户:
不运行
Developer Command Prompt
的话,您可以使用普通命令提示符或 ssh 到设备上,然后手动运行"\Program Files\Microsoft Visual Studio\2022\Community\Common7\Tools\VsDevCmd.bat"
。
按上述说明运行 Developer Command Prompt 后,运行以下命令安装 Microsoft VCPKG,然后用它来构建 OpenCV:
cd c:\
mkdir c:\src
cd c:\src
git clone https://github.com/microsoft/vcpkg
cd 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 来加速图像(和视频)处理。
- 访问 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
和nvidia-smi
。您可能需要修改PATH
变量。 - 下载 cuDNN 后,解压缩并将 bin、include 和 lib 目录复制到
C:/Program Files/NVIDIA GPU Computing Toolkit/CUDA/[版本]/
。可能需要覆盖一些文件。 - 如果您在之后安装 CUDA 或 CUDA+cuDNN,或升级到更新版本的 NVIDIA 软件:
- 您必须删除 Darknet
build
目录中的CMakeCache.txt
文件,以强制 CMake 重新查找所有必要的文件。 - 记得重新构建 Darknet。
- 您必须删除 Darknet
- CUDA 必须在 Visual Studio 之后安装。如果您升级 Visual Studio,记得重新安装 CUDA。
前面所有步骤成功完成后,您需要克隆 Darknet 并构建它。在这一步中,我们还需要告诉 CMake vcpkg 的位置,以便它可以找到 OpenCV 和其他依赖项:
cd c:\src
git clone https://github.com/hank-ai/darknet.git
cd darknet
mkdir build
cd build
cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_TOOLCHAIN_FILE=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 Files\NVIDIA GPU Computing Toolkit\CUDA\v12.2\bin\*.dll" src-cli\Release\
(这只是一个示例!请确认您正在运行的版本,并运行适合您安装内容的命令。)
文件复制完成后,重新运行最后一个 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:\src\Darknet\build\src-cli\Release\darknet.exe
。运行以下命令进行测试: C:\src\Darknet\build\src-cli\Release\darknet.exe version
。
要正确安装 Darknet、库文件、包含文件和必要的 DLL,请运行在最后一步构建的 NSIS 安装向导。查看 build
目录中的 darknet-VERSION.exe
文件。例如:
darknet-2.0.31-win64.exe
安装 NSIS 安装包将:
- 创建一个名为
Darknet
的目录,例如C:\Program Files\Darknet\
。 - 安装 CLI 应用程序
darknet.exe
。 - 安装所需的第三方
.dll
文件,例如来自 OpenCV 的文件。 - 安装必要的 Darknet
.dll
、.lib
和.h
文件,以便从其他应用程序使用darknet.dll
。 - 安装模板
.cfg
文件。
现在您已完成! 安装向导完成后,Darknet 将被安装到 C:\Program Files\Darknet\
。运行以下命令进行测试: C:\Program Files\Darknet\bin\darknet.exe version
。
如果您没有
C:/Program Files/darknet/bin/darknet.exe
,这意味着您只是构建了它,而没有安装它! 确保完成前面步骤中 NSIS 安装向导的每个面板。
使用 Darknet
CLI
以下并非 Darknet 支持的所有命令的完整列表。有关其他详细信息和示例,请参阅之前的自述文件。
除了 Darknet CLI 之外,还请注意 DarkHelp 项目 CLI,它提供了 Darknet/YOLO 的替代 CLI。DarkHelp CLI 还具有 Darknet 中不直接提供的一些高级功能。您可以同时使用 Darknet CLI 和 DarkHelp CLI,它们并不互斥。
对于下面显示的大多数命令,您需要 .weights
文件以及相应的 .names
和 .cfg
文件。您可以训练自己的网络(强烈推荐!)或下载 MSCOCO 预训练 .weights
文件。.cfg
和 .names
文件位于仓库中的 cfg 目录。
- 检查版本:
darknet version
- 获取一些(非常有限的!)命令运行帮助:
darknet help
- 使用图像进行预测:
darknet detector test animals.data animals.cfg animals_best.weights dog.jpg
- 下载YOLOv4-tiny权重并使用
artwork
目录中的样本图像进行预测:
cd src/darknet/
wget --no-clobber https://github.com/hank-ai/darknet/releases/download/v2.0/yolov4-tiny.weights
darknet detector test cfg/coco.data cfg/yolov4-tiny.cfg yolov4-tiny.weights artwork/dog.jpg
- 使用DarkHelp时的等效命令为:
cd src/darknet/
DarkHelp cfg/coco.names cfg/yolov4-tiny.cfg yolov4-tiny.weights artwork/dog.jpg
# DarkHelp对.names、.cfg和.weights文件的列出顺序并不重要。
- 输出坐标:
darknet detector test animals.data animals.cfg animals_best.weights -ext_output dog.jpg
- 处理视频:
darknet detector demo animals.data animals.cfg animals_best.weights -ext_output test.mp4
- 从网络摄像头读取:
darknet detector demo animals.data animals.cfg animals_best.weights -c 0
- 智能网络摄像头:
darknet detector demo animals.data animals.cfg animals_best.weights http://192.168.0.80:8080/video?dummy=param.mjpg
- 将结果保存到视频:
darknet detector demo animals.data animals.cfg animals_best.weights test.mp4 -out_filename res.avi
- JSON和MJPEG服务器:
darknet detector demo animals.data animals.cfg animals_best.weights test50.mp4 -json_port 8070 -mjpeg_port 8090 -ext_output
- 在特定GPU上运行:
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 名称 平均精度 TP FN FP TN 准确率 错误率 精确度 召回率 特异性 假阳性率
-- ---- ------------ ------ ------ ------ ------ -------- --------- --------- ------ ----------- ------------
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 animals_best.weights -iou_thresh 0.75
- 重新计算锚点最好在DarkMark中进行,因为它会连续运行100次并从所有计算出的锚点中选择最佳的。但如果你想在Darknet中运行旧版本:
darknet detector calc_anchors animals.data -num_of_clusters 6 -width 320 -height 256
- 训练新网络:
darknet detector -map -dont_show train animals.data animals.cfg
(另请参阅下面的训练部分)
训练
Darknet/YOLO常见问题解答相关部分的快速链接:
最简单的注释和训练方法是使用DarkMark来创建所有必要的Darknet文件。这绝对是训练新神经网络的推荐方法。
如果你更愿意手动设置各种文件来训练自定义网络:
- 创建一个新文件夹来存储文件。在这个例子中,将创建一个用于检测动物的神经网络,因此创建以下目录:
~/nn/animals/
。 - 复制一个你想用作模板的Darknet配置文件。例如,参见
cfg/yolov4-tiny.cfg
。将其放在你创建的文件夹中。在这个例子中,我们现在有了~/nn/animals/animals.cfg
。 - 在放置配置文件的同一文件夹中创建一个
animals.names
文本文件。在这个例子中,我们现在有了~/nn/animals/animals.names
。 - 用文本编辑器编辑
animals.names
文件。列出你想使用的类别。每行必须恰好有1个条目,没有空行和注释。在这个例子中,.names
文件将包含恰好4行:
dog
cat
bird
horse
- 在同一文件夹中创建一个
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
-
创建一个文件夹来存储你的图像和标注。例如,可以是
~/nn/animals/dataset
。每张图像都需要一个对应的 .txt 文件来描述该图像的标注。.txt 标注文件的格式非常特殊。你不能手动创建这些文件,因为每个标注都需要包含精确的坐标。请使用 DarkMark 或其他类似软件来标注你的图像。YOLO 标注格式在 Darknet/YOLO FAQ 中有描述。 -
创建 .data 文件中指定的"train"和"valid"文本文件。这两个文本文件需要分别列出 Darknet 必须用于训练和验证时计算 mAP% 的所有图像。每行一个图像。路径和文件名可以是相对路径或绝对路径。
-
用文本编辑器修改你的 .cfg 文件。
- 确保
batch=64
。 - 注意 subdivisions。根据网络尺寸和 GPU 可用内存量,你可能需要增加 subdivisions。最佳值是
1
,所以从这个开始。如果1
不适合你,请参阅 Darknet/YOLO FAQ。 - 注意
max_batches=...
。开始时使用的一个好值是类别数量的 2000 倍。在这个例子中,我们有 4 种动物,所以 4 * 2000 = 8000。意味着我们将使用max_batches=8000
。 - 注意
steps=...
。这应该设置为max_batches
的 80% 和 90%。对于这个例子,我们将使用steps=6400,7200
,因为max_batches
设置为 8000。 - 注意
width=...
和height=...
。这些是网络尺寸。Darknet/YOLO FAQ 解释了如何计算最佳使用尺寸。 - 搜索所有
classes=...
行的实例,并修改为 .names 文件中的类别数。对于这个例子,我们将使用classes=4
。 - 搜索每个
[yolo]
部分之前的[convolutional]
部分中所有filters=...
行的实例。使用的值是 (类别数 + 5) * 3。意味着对于这个例子,(4 + 5) * 3 = 27。所以我们在适当的行上使用filters=27
。
- 确保
-
开始训练! 运行以下命令:
cd ~/nn/animals/
darknet detector -map -dont_show train animals.data animals.cfg
请耐心等待。最佳权重将保存为 animals_best.weights
。训练进度可以通过查看 chart.png
文件观察。有关训练新网络时可能想要使用的其他参数,请参阅 Darknet/YOLO FAQ。
如果你想在训练期间看到更多细节,添加 --verbose
参数。例如:
darknet detector -map -dont_show --verbose train animals.data animals.cfg
其他工具和链接
- 要管理你的 Darknet/YOLO 项目、标注图像、验证标注并生成必要的文件以使用 Darknet 进行训练,请参阅 DarkMark。
- 对于 Darknet 的强大替代 CLI、使用图像分块、视频中的对象跟踪,或易于在商业应用中使用的强大 C++ API,请参阅 DarkHelp。
- 看看 Darknet/YOLO FAQ 是否能帮助回答你的问题。
- 查看 Stéphane 的 YouTube 频道 上的许多教程和示例视频。
- 如果你有支持问题或想与其他 Darknet/YOLO 用户聊天,加入 Darknet/YOLO discord 服务器。
路线图
最后更新 2024-05-13:
已完成
- 将训练中使用的 qsort() 替换为 std::sort()(一些其他obscure的仍然保留)
- 去除 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 多张图像
- 源外构建
- 有更好的版本号输出
短期目标
- 将 printf() 替换为 std::cout(进行中)
- 清理 .hpp 文件
- 重写 darknet.h
- 查看旧的 zed 相机支持
- 更好更一致的命令行解析
中期目标
- 修复基于 ARM 的 Jetson 设备的构建
- 更好地使用
cv::Mat
而不是 C 中的自定义image
结构 - 不将
cv::Mat
转换为void*
,而是将其作为proper的 C++ 对象使用 - 完全移除内部/过时的
image
结构 - 修复对 1 通道灰度图像的支持
- 添加对 N 通道图像的支持,其中 N > 3(例如,具有额外深度或热通道的图像)
- 持续代码清理
长期目标
- 修复所有 GPU 的 CUDA/CUDNN 问题
- 研究添加对非 NVIDIA GPU 的支持
- 旋转边界框,或某种 "角度" 支持