暗网目标检测框架和 YOLO
Darknet 是一个用 C、C++ 和 CUDA 编写的开源神经网络框架。
YOLO(You Only Look Once)是一种在 Darknet 框架内运行的最先进的实时对象检测系统。
了解 Hank.ai 如何为 Darknet/YOLO 社区提供支持!
宣布暗网 V3“爵士乐”
访问暗网/YOLO 网站
探索暗网/YOLO 常见问题解答
加入 Darknet/YOLO Discord 服务器
文件
1.论文YOLOv7:论文链接
2. Paper Scaled-YOLOv4:论文链接
3.论文YOLOv4:论文链接
4.论文YOLOv3:论文链接
一般信息
Darknet/YOLO 框架在速度和准确性方面始终优于其他框架和 YOLO 版本。
该框架是完全免费且开源的。您可以将 Darknet/YOLO 无缝集成到您现有的项目和产品中,包括商业项目和产品,而无需任何许可费用。
Darknet V3(“Jazz”)于 2024 年 10 月发布,实现了卓越的性能,在 NVIDIA RTX 3090 GPU 上以高达 1000 FPS 的速度运行乐高数据集视频。这意味着 Darknet/YOLO 在不到 1 毫秒的时间内处理每个视频帧,包括调整大小和处理。
加入 Darknet/YOLO Discord 服务器以获得支持和讨论:https://discord.gg/zSq8rtW
Darknet/YOLO 的 CPU 版本可在各种设备上高效运行,包括 Raspberry Pi、云和 Colab 服务器、台式机、笔记本电脑和高端训练设备。然而,Darknet/YOLO 的 GPU 版本需要 NVIDIA 提供的支持 CUDA 的 GPU。
Darknet/YOLO 兼容 Linux、Windows 和 Mac 操作系统。请参阅下面的构建说明以获取详细指导。
暗网版本
Joseph Redmon 在 2013 年至 2017 年期间开发的原始暗网工具缺少版本号。我们将此版本称为 0.x。
随后由 Alexey Bochkovskiy 在 2017 年至 2021 年维护的流行暗网存储库也缺少版本号。我们认为这个版本是 1.x。
由 Hank.ai 赞助并由 Stéphane Charette 维护的 Darknet 存储库从 2023 年开始首次引入版本命令。从 2023 年到 2024 年底,它返回了版本 2.x“OAK”。
开发团队专注于最大限度地减少对现有功能的干扰,同时熟悉代码库。
在此期间实施的主要变化包括:
1. 统一构建流程:重写构建步骤,以简化 Windows 和 Linux 上使用 CMake 的流程。
2. C++ 转换:代码库已转换为使用 C++ 编译器。
3. 图表增强:在训练过程中,chart.png 可视化得到增强。
4. 错误修复和优化:实施了许多错误修复和与性能相关的优化,主要集中在减少训练时间。
该代码库的最后一个分支是版本 2.1,位于 v2 分支中。
下一个开发阶段于 2024 年中期开始,并最终于 2024 年 10 月发布了版本 3.x“JAZZ”。版本命令现在返回 3.x。
如果您需要执行该版本的特定命令,您可以随时恢复到之前的 v2 分支。如果您遇到任何丢失的命令,请告知开发团队,他们将调查将其添加回来。
版本 3.x“JAZZ”中引入的重大更改:
1.命令删除:删除了许多过时且不受支持的命令。
2. 性能优化:对训练和推理进行了大量性能优化。
3. API 修改:旧版 C API 进行了修改。使用原始 Darknet API 的应用程序可能需要进行细微调整。 https://darknetcv.ai/api/api.html
4.新的C/C++ API:Darknet V3引入了新的C和C++ API。 https://darknetcv.ai/api/api.html
5. 增强的示例代码:src-examples 中提供了新的应用程序和示例代码。 https://darknetcv.ai/api/files.html
MSCOCO 预训练权重
为了方便起见,几个流行的 YOLO 版本已经在 MSCOCO 数据集上进行了预训练。该数据集包含 80 个类,这些类列在 cfg/coco.names 文本文件中。
除了 MSCOCO 之外,还可以使用各种更简单的数据集和预训练权重来测试 Darknet/YOLO,例如 LEGO Gears 和 Rolodex。有关更多详细信息,请参阅 Darknet/YOLO 常见问题解答。
MSCOCO 预训练权重可以从各种来源下载,包括此存储库:
YOLOv2(2016 年 11 月)
yolov2-tiny.weights
yolov2-full.weights
YOLOv3(2018 年 5 月)
yolov3-tiny.weights
yolov3-full.权重
YOLOv4(2020 年 5 月)
yolov4-tiny.weights
yolov4-full.weights
YOLOv7(2022 年 8 月)
yolov7-tiny.weights
yolov7-full.权重
MSCOCO 预训练权重仅用于演示目的。 MSCOCO 相应的 .cfg 和 .names 文件位于 cfg 目录中。
以下是一些示例命令:
`bash
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 生成所需的项目文件。
构建 Darknet/YOLO 不需要 C++ 知识。这类似于无需成为机械师即可驾驶汽车。
谷歌合作实验室
Google Colab 说明反映了 Linux 的说明。多个 Jupyter 笔记本可用于演示特定任务,例如训练新网络。
浏览 colab 子目录中的笔记本或按照下面的 Linux 说明进行操作。
Linux CMake方法
Linux 暗网构建教程
1. 先决条件:确保您已安装以下软件包:
`bash
sudo apt-get install build-essential git libopencv-dev cmake
`
2.克隆Darknet:克隆Darknet存储库:
`bash
mkdir ~/srccd ~/src
git 克隆 https://github.com/hank-ai/darknet
CD暗网
`
3.创建构建目录:创建构建目录:
`bash
mkdir 构建
光盘构建
`
4. 使用 CMake 配置:运行 CMake 来配置构建:
`bash
cmake -DCMAKEBUILDTYPE=发布 ..
`
5. 构建:构建项目:
`bash
使-j4
`
6. 打包:创建Debian包:
`bash
制作包
`
7.安装:安装包:
`bash
sudo dpkg -i darknet-VERSION.deb
`
可选:用于 GPU 加速的 CUDA/cuDNN
1. 安装 CUDA:如果您有现代 NVIDIA GPU,则可以安装 CUDA 进行 GPU 加速。从 https://developer.nvidia.com/cuda-downloads 下载并安装 CUDA。
2. 安装 cuDNN:从 https://developer.nvidia.com/rdp/cudnn-download 或 https://docs.nvidia.com/deeplearning/cudnn/install-guide/index.html#cudnn- 下载并安装 cuDNN包管理器安装概述。
3. 验证 CUDA 安装:确保安装 CUDA 后可以运行 nvcc 和 nvidia-smi。您可能需要调整 PATH 变量。
4. CMake 配置(如果在 CMake 之后安装了 CUDA):如果在配置 CMake 后安装了 CUDA 或 CUDA+cuDNN,则需要删除 Darknet 构建目录中的 CMakeCache.txt 文件,以强制 CMake 重新查找必要的文件。然后,重新运行 CMake 并重建 Darknet。
高级用户
RPM 包:要构建 RPM 安装文件而不是 DEB 文件,请修改 CM_package.cmake 中的以下行:
`cmake
# 设置(CPACK_GENERATOR“DEB”)
设置(CPACK_GENERATOR“RPM”)
`
Centos 和 OpenSUSE 等发行版:对于 Centos 和 OpenSUSE 等发行版,请将 CM_package.cmake 中的行更改为:
`cmake
# 设置(CPACK_GENERATOR“DEB”)
设置(CPACK_GENERATOR“RPM”)
`
安装包:要在构建后安装包,请使用您的发行版的包管理器。例如,在基于 Debian 的系统(如 Ubuntu)上,使用 sudo dpkg -i darknet-2.0.1-Linux.deb。
安装的关键文件:
/usr/bin/darknet:主要的 Darknet 可执行文件。通过在 CLI 中运行 darknet 版本来确认安装。
/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 模板。
Windows CMake方法
Windows 构建教程(假设全新安装 Windows 11 22H2)
1.安装先决条件:使用winget安装必要的组件:
`bash
winget 安装 Git.Git
winget 安装 Kitware.CMake
winget安装nsis.nsis
winget安装Microsoft.VisualStudio.2022.社区
`
2. 安装 Visual Studio C++ 支持:修改 Visual Studio 安装以包括 C++ 支持:
* 打开“Windows 开始”菜单并运行“Visual Studio 安装程序”。
* 点击“修改”。
* 选择“使用C++进行桌面开发”。
* 单击右下角的“修改”,然后单击“是”。
3. 开发人员命令提示符:从“Windows 开始”菜单启动“VS 2022 开发人员命令提示符”。请勿使用 PowerShell 执行这些步骤!
4.安装Microsoft VCPKG:安装VCPKG来构建OpenCV:
`bash
CDC:
mkdir c:src
cd c:src
git 克隆 https://github.com/microsoft/vcpkg
cd vcpkg
bootstrap-vcpkg.bat
.vcpkg.exe集成安装
.vcpkg.exe 集成 powershell
.vcpkg.exe 安装 opencv[contrib,dnn,freetype,jpeg,openmp,png,webp,world]:x64-windows
`
* 请耐心等待,此步骤可能需要大量时间,因为它需要下载和构建大量组件。
5. 可选:用于 GPU 加速的 CUDA/cuDNN:遵循 Linux 部分中概述的相同步骤。
6. 克隆 Darknet:克隆 Darknet 存储库:
`bash
cd c:src
git 克隆 https://github.com/hank-ai/darknet.git
CD暗网
mkdir 构建
光盘构建
`
7. 使用 CMake 配置:使用 CMake 配置构建:
`bash
cmake -DCMAKEBUILDTYPE=发布-DCMAKETOOLCHAINFILE=C:/src/vcpkg/scripts/buildsystems/vcpkg.cmake ..
`
8. 使用 msbuild 构建:使用 msbuild 构建项目:
`bash
msbuild.exe /property:Platform=x64;Configuration=Release /target:Build -maxCpuCount -verbosity:normal -detailedSummary darknet.sln
msbuild.exe /property:平台=x64;配置=发布 PACKAGE.vcxproj
`
故障排除:缺少 CUDA/cuDNN DLL
如果您遇到有关缺少 CUDA 或 cuDNN DLL(例如 cublas64_12.dll)的错误,请手动将 CUDA .dll 文件复制到 darknet.exe 所在的输出目录中。例如:
`bash
复制“C:Program FilesNVIDIA GPU计算工具包CUDAv12.2bin * .dll”src-cliRelease
`
* 请记住根据您的 CUDA 版本调整命令。
复制 DLL 后重新运行 msbuild.exe 命令。
高级用户
Visual Studio 解决方案:CMake 生成 Visual Studio 解决方案文件 (Darknet.sln)。喜欢使用 Visual Studio GUI 的软件开发人员可以在 Visual Studio 中加载 Darknet 项目,而不是使用命令行。
验证和安装
验证:运行以下命令检查Darknet是否正确构建:
`bash
C:srcDarknetbuildsrc-cliReleasedarknet.exe 版本
`
安装:运行上一步生成的NSIS安装向导,正确安装Darknet、库、包含文件和必要的DLL。在构建目录中找到 darknet-VERSION.exe 文件。例如:darknet-2.0.31-win64.exe。
安装的关键文件:
C:Program FilesDarknetbin/darknet.exe:Darknet CLI 应用程序。
C:Program FilesDarknet/bin:包含其他示例应用程序。
C:Program FilesDarknet:包括所需的第三方 .dll 文件 (OpenCV)、Darknet .dll、.lib 和 .h 文件以及模板 .cfg 文件。
使用暗网
命令行界面
以下列表并未详尽列出 Darknet 支持的所有命令。
除了 Darknet CLI 之外,还可以考虑 DarkHelp 项目 CLI,它提供了替代 CLI,其中包含 Darknet 中不直接提供的一些高级功能。您可以同时使用这两个 CLI。
基本先决条件:
对于大多数命令,您需要一个 .weights 文件以及相应的 .names 和 .cfg 文件。
训练您自己的网络(强烈推荐!)或从互联网下载预先训练的网络。
预训练数据集示例:
LEGO Gears:图像中的对象检测。
Rolodex:图像中的文本检测。
MSCOCO:标准80级物体检测。
命令示例:
1. 获取帮助:
`bash
暗网帮助
`
2. 检查版本:
`bash
暗网版本
`
3. 图像预测:
V2:
`bash
暗网探测器测试 cars.data cars.cfg cars_best.weights image1.jpg
`
V3:
`bash
darknet02displayannotatedimages cars.cfg image1.jpg
`
黑暗帮助:
`bash
DarkHelp cars.cfg cars.cfg cars_best.weights image1.jpg
`
4.输出坐标:
V2:
`bash
暗网探测器测试animals.dataanimals.cfganimalsbest.weights-extoutputdog.jpg
`
V3:
`bash
darknet01inference_images 动物 狗.jpg
`
黑暗帮助:
`bash
DarkHelp --json Animals.cfg Animals.names Animals_best.weights Dog.jpg
`
5、视频处理:
V2:
`bash
暗网探测器演示 Animals.data Animals.cfg Animalbest.weights -extoutput test.mp4
`
V3:
`bash
darknet03display_videos Animals.cfg test.mp4
`
黑暗帮助:
`bash
DarkHelp Animals.cfg Animals.names Animals_best.weights test.mp4
`
6. 网络摄像头处理:
V2:
`bash
暗网探测器演示 Animals.data Animals.cfg Animals_best.weights -c 0
`
V3:
`bash
darknet08display_网络摄像头动物
`
7. 视频输出:
V2:
`bash
暗网探测器演示 Animals.data Animals.cfg Animalbest.weights test.mp4 -outfilename res.avi
`
V3:
`bash
darknet05processvideos多线程animals.cfganimals.namesanimals_best.weightstest.mp4
`
黑暗帮助:
`bash
DarkHelp Animals.cfg Animals.names Animals_best.weights test.mp4
`
8.JSON输出:
V2:
`bash
暗网探测器演示 Animals.data Animals.cfg Animalbest.weights test50.mp4 -jsonport 8070 -mjpegport 8090 -extoutput
`
V3:
`bash
darknet06imagestojson 动物 image1.jpg
`
黑暗帮助:
`bash
DarkHelp --json Animals.names Animals.cfg Animals_best.weights image1.jpg
`
9.特定GPU:
V2:
`bash
暗网探测器演示 Animals.data Animals.cfg Animals_best.weights -i 1 test.mp4
`
10. 准确度评估:
地图:
`bash
暗网探测器地图 Driving.data Driving.cfg moving_best.weights ...
`
映射@IoU=75:
`bash
暗网探测器地图animals.dataanimals.cfganimalsbest.weights-iothresh 0.75
`
11. 锚点计算:
DarkMark:使用 DarkMark 重新计算锚点以获得最佳性能。
暗网(旧方法):
`bash
暗网探测器 calcanchors Animals.data -numof_clusters 6 -宽度 320 -高度 256
`
12. 训练新网络:
DarkMark(推荐):使用DarkMark进行注释和训练。
手动设置:
1. 创建目录:为您的项目创建一个文件夹(例如~/nn/animals/)。
2.配置文件:复制Darknet配置文件作为模板(例如cfg/yolov4-tiny.cfg)。
3. .names 文件:创建一个 .names 文本文件,列出您的类(例如 ~/nn/animals/animals.names)。
4. .data 文件:在与配置文件相同的文件夹中创建.data 文本文件(例如~/nn/animals/animals.data)。
5. 数据集文件夹:为图像和注释创建一个文件夹(例如~/nn/animals/dataset)。
6. .txt注释:为每个图像生成.txt文件,包含注释坐标。使用 DarkMark 或其他注释工具。
7. train/valid 文件:创建列出训练和验证图像的animalstrain.txt 和animalsvalid.txt 文件。
8. 修改.cfg 文件:根据您的数据集调整配置文件。
* 设置批次=64。
* 根据您的 GPU 内存调整细分。
将 max_batches 设置为 2000 个类。
* 将步长设置为 max_batches 的 80% 和 90%。
* 根据网络尺寸调整宽度和高度。
* 将classes=... 设置为.names 文件中的类数。
将每个[yolo]部分之前的[卷积]部分中的filters=...调整为(numberofclasses + 5) 3。
9. 培训:开始培训:
`bash
cd ~/nn/动物/
暗网探测器-map-dont_show火车animals.dataanimals.cfg
`
* 最佳权重将保存为animals_best.weights。
* 查看chart.png文件以监控训练进度。
其他工具和链接
关键资源:
DarkMark:用于管理 Darknet/YOLO 项目、注释图像、验证注释以及生成训练文件。
DarkHelp:Darknet 的强大替代 CLI,具有图像平铺、视频中的对象跟踪等功能,以及适合商业应用程序的强大 C++ API。
Darknet/YOLO 常见问题解答:查找常见问题的答案和解决方案。
Stéphane 的 YouTube 频道:探索教程和示例视频。
Darknet/YOLO Discord 服务器:与其他 Darknet/YOLO 用户联系以获得支持和讨论。
路线图
最后更新于 2024 年 10 月 30 日:
已完成的任务:
1. 在相关训练部分将 qsort() 替换为 std::sort()。
2. 删除了 check_mistakes、getchar() 和 system()。
3. 将 Darknet 转换为使用 C++ 编译器(Linux 上为 g++,Windows 上为 VisualStudio)。
4.修复了Windows构建。
5.修复了Python支持。
6. 构建暗网库。
7. 重新启用预测标签(“字母”代码)。
8. 重新启用 CUDA/GPU 代码。
9. 重新启用CUDNN。
10. 重新启用 CUDNN 一半。
11.删除了硬编码的CUDA架构。
12.改进了CUDA版本信息。
13.重新启用AVX。
14.删除了旧的解决方案和Makefile。
15. 使 OpenCV 成为非可选。
16. 删除了对旧 pthread 库的依赖。
17. 删除机顶盒。
18.重写CMakeLists.txt以使用新的CUDA检测。
19.删除了旧的“字母”代码并删除了数据/标签中的图像。
20.启用外源构建。
21.增强版本号输出。
22. 与培训相关的性能优化(正在进行)。
23. 与推理相关的性能优化(正在进行)。
24. 在适用的情况下实施了引用传递。
25. 清理.hpp 文件。
26.重写darknet.h。
27. 消除了 cv::Mat 到 void* 的转换,将其用作正确的 C++ 对象。
28. 提高了内部图像结构使用方式的一致性。
29. 修复了基于 ARM 的 Jetson 设备的构建。
30.修复了V3中的Python API。
短期目标:
1. 将 printf() 替换为 std::cout(正在进行中)。
2.调查旧的 zed 相机支持。
3. 改进和标准化命令行解析(正在进行中)。
中期目标:
1. 删除所有 char* 代码并替换为 std::string。
2. 消除编译器警告(正在进行中)。
3.改进cv::Mat的使用,而不是C中的自定义图像结构(正在进行中)。
4. 用 std::vector 或 std::list 替换旧的列表功能。
5. 修复对 1 通道灰度图像的支持。
6. 添加对 N 通道图像(其中 N > 3)的支持(例如,具有附加深度或热通道的图像)。
7. 持续的代码清理(正在进行中)。
长期目标:
1. 解决所有 GPU 上的 CUDA/CUDNN 问题。
2.重写CUDA+cuDNN代码。
3. 探索对非 NVIDIA GPU 的支持。
4. 实现旋转边界框或“角度”支持。
5. 支持关键点/骨架。
6. 支持热图(正在进行中)。
7. 细分。