HmacManager
Summary
Downcodes小编为您带来HmacManager,一款用于ASP.NET Core应用程序的HMAC身份验证工具,为您的应用程序提供无缝集成和强大的安全保障。
Features
HMAC 身份验证: HmacManager 提供HMAC身份验证,使您能够为ASP.NET Core API添加安全的身份验证层。
轻松配置: 通过简单的配置选项,您可以在应用程序中快速集成HMAC身份验证。
定制选项: HmacManager 提供定制选项,以便您根据自己的需求进行配置。
增强安全性: HMAC身份验证通过使用HMAC哈希算法来验证请求,从而增强了API的安全性。
Installation
HmacManager 可在 NuGet 上获取。
`bash
dotnet add package HmacManager
`
Resources
进一步阅读: 官方文档
示例代码: GitHub 仓库
Darknet Object Detection Framework and YOLO
!darknet and hank.ai logos
Darknet 是一个用 C、C++ 和 CUDA 编写的开源神经网络框架。
YOLO(You Only Look Once)是 Darknet 框架中运行的先进的实时目标检测系统。
1. Papers
YOLOv7: 论文链接
Scaled-YOLOv4: 论文链接
YOLOv4: 论文链接
YOLOv3: 论文链接
2. General Information
Darknet/YOLO 框架在速度和准确性上持续超越其他框架和 YOLO 版本。
该框架完全免费且开源。您可以将 Darknet/YOLO 集成到现有项目和产品中,包括商业产品,无需许可或付费。
Darknet V3(“Jazz”)于 2024 年 10 月发布,在使用 NVIDIA RTX 3090 GPU 时,可以以高达 1000 FPS 的速度准确运行 LEGO 数据集视频,这意味着每个视频帧在 1 毫秒或更短的时间内由 Darknet/YOLO 读取、调整大小和处理。
加入 Darknet/YOLO Discord 服务器: https://discord.gg/zSq8rtW
Darknet/YOLO 的 CPU 版本可以在 Raspberry Pi、云服务器、Colab 服务器、台式机、笔记本电脑和高端训练设备等简单设备上运行。Darknet/YOLO 的 GPU 版本需要 NVIDIA 的 CUDA 支持的 GPU。
Darknet/YOLO 已知在 Linux、Windows 和 Mac 上运行良好。请参阅下面的构建说明。
3. Darknet 版本
版本 0.x: Joseph Redmon 在 2013-2017 年编写的原始 Darknet 工具没有版本号。
版本 1.x: 由 Alexey Bochkovskiy 在 2017-2021 年间维护的下一个流行 Darknet 仓库也没有版本号。
版本 2.x (“OAK”): 由 Hank.ai 赞助并由 Stéphane Charette 从 2023 年开始维护的 Darknet 仓库是第一个具有版本命令的仓库。从 2023 年到 2024 年底,它返回版本 2.x “OAK”。
版本 3.x (“JAZZ”): 2024 年年中开始的下一阶段开发,于 2024 年 10 月发布。版本命令现在返回 3.x “JAZZ”。
4. MSCOCO 预训练权重
为了方便起见,几个流行版本的 YOLO 在 MSCOCO 数据集上进行了预训练。此数据集包含 80 个类别,可以在文本文件 cfg/coco.names 中看到。
还有一些其他更简单的用于测试 Darknet/YOLO 的数据集和预训练权重可用,例如 LEGO Gears 和 Rolodex。有关详细信息,请参阅 Darknet/YOLO FAQ。
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 预训练权重仅用于演示目的。相应的 .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 通常用于确认一切正常。
5. 构建
过去(2023 年之前)的各种构建方法已合并到一个统一的解决方案中。Darknet 需要 C++17 或更高版本、OpenCV,并使用 CMake 生成必要的项目文件。
您不需要了解 C++ 就能构建、安装或运行 Darknet/YOLO,就像您不需要成为机械师就能驾驶汽车一样。
5.1 Google Colab
Google Colab 说明与 Linux 说明相同。几个 Jupyter 笔记本显示了如何执行某些任务,例如训练新网络。
请参阅 colab 子目录中的笔记本,或按照下面的 Linux 说明进行操作。
5.2 Linux CMake 方法
Darknet 在 Linux 上的构建教程
`bash
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
`
5.3 Windows CMake 方法
这些说明假设全新安装 Windows 11 22H2。
`bash
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 开始”菜单,选择“用于 VS 2022 的开发人员命令提示符”。不要使用 PowerShell 执行这些步骤,否则会遇到问题!
高级用户:
* 除了运行开发人员命令提示符外,您还可以使用普通命令提示符或 ssh 到设备并手动运行“Program FilesMicrosoft Visual Studio2022CommunityCommon7ToolsVsDevCmd.bat”。
一旦您按照上述说明运行了开发人员命令提示符(不是 PowerShell!)运行以下命令来安装 Microsoft VCPKG,然后将使用它来构建 OpenCV:
`bash
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#cudnn-package-manager-installation-overview 下载并安装 cuDNN。
安装 CUDA 后,请确保您可以运行 nvcc.exe 和 nvidia-smi.exe。您可能需要修改 PATH 变量。
下载 cuDNN 后,将其解压缩并将 bin、include 和 lib 目录复制到 C:/Program Files/NVIDIA GPU Computing Toolkit/CUDA/[版本]/ 中。您可能需要覆盖一些文件。
如果您在稍后时间安装 CUDA 或 CUDA+cuDNN,或者您升级到 NVIDIA 软件的更新版本:
* CUDA 必须在 Visual Studio 之后安装。如果您升级了 Visual Studio,请记住重新安装 CUDA。
一旦所有之前的步骤都成功完成,您需要克隆 Darknet 并构建它。在此步骤中,我们还需要告诉 CMake vcpkg 的位置,以便它可以找到 OpenCV 和其他依赖项:
`bash
cd c:src git clone https://github.com/hank-ai/darknet.gitcd darknetmkdir 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 相同的输出目录中。例如:
`bash
copy "C:Program FilesNVIDIA GPU Computing ToolkitCUDAv12.2bin*.dll" src-cliRelease
`
(这是一个示例!检查您运行的版本,并运行适合您已安装版本的命令。)
文件复制完毕后,重新运行最后一个 msbuild.exe 命令来生成 NSIS 安装包:
`bash
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。例如:
`bash
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 安装向导的每个面板。
6. 使用 Darknet
6.1 CLI
以下不是 Darknet 支持的所有命令的完整列表。
除了 Darknet CLI 外,还要注意 DarkHelp 项目 CLI,它提供了一个替代 Darknet/YOLO 的 CLI。DarkHelp CLI 还具有一些 Darknet 中没有的增强功能。您可以将 Darknet CLI 和 DarkHelp CLI 结合使用,它们不是相互排斥的。
对于下面显示的大多数命令,您将需要具有对应 .names 和 .cfg 文件的 .weights 文件。您可以自己训练网络(强烈推荐!),也可以下载别人已经训练好的并免费提供在互联网上的神经网络。预训练数据集的示例包括:
* LEGO Gears(在图像中查找物体)
* Rolodex(在图像中查找文本)
* MSCOCO(标准 80 类目标检测)
要运行的命令包括:
* 列出一些可以运行的可能的命令和选项:
`bash
darknet help
`
* 检查版本:
`bash
darknet version
`
* 使用图像进行预测:
`bash
V2: darknet detector test cars.data cars.cfg cars_best.weights image1.jpg
V3: darknet02displayannotatedimages cars.cfg image1.jpg
DarkHelp: DarkHelp cars.cfg cars_best.weights image1.jpg
`
* 输出坐标:
`bash
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
`
* 使用视频:
`bash
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
`
* 从网络摄像头读取:
`bash
V2: darknet detector demo animals.data animals.cfg animals_best.weights -c 0
V3: darknet08display_webcam animals
`
* 将结果保存到视频:
`bash
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:
`bash
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 上运行:
`bash
V2: darknet detector demo animals.data animals.cfg animals_best.weights -i 1 test.mp4
`
* 检查神经网络的准确性:
`bash
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:
`bash
darknet detector map animals.data animals.cfg animalsbest.weights -iouthresh 0.75
`
* 重新计算锚点最好在 DarkMark 中完成,因为它将连续运行 100 次并从所有计算出的锚点中选择最佳锚点。但是,如果您想在 Darknet 中运行旧版本:
`bash
darknet detector calcanchors animals.data -numof_clusters 6 -width 320 -height 256
`
* 训练新网络:
`bash
cd ~/nn/animals/ darknet detector -map -dont_show train animals.data animals.cfg
`
6.2 训练
与 Darknet/YOLO FAQ 相关部分的快速链接:
* 我应该如何设置我的文件和目录?
* 我应该使用哪个配置文件?
* 我在训练自己的网络时应该使用哪个命令?
使用 DarkMark 创建所有必要的 Darknet 文件,这是注释和训练的最简单方法。这绝对是训练新神经网络的推荐方法。
如果您希望手动设置各种文件以训练自定义网络:
* 创建一个新文件夹来存储文件。对于此示例,将创建一个神经网络来检测动物,因此将创建以下目录:~/nn/animals/。
* 复制您想用作模板的 Darknet 配置文件之一。例如,请参阅 cfg/yolov4-tiny.cfg。将其放在您创建的文件夹中。对于此示例,我们现在拥有 ~/nn/animals/animals.cfg。
* 在您放置配置文件的同一文件夹中创建一个 animals.names 文本文件。对于此示例,我们现在拥有 ~/nn/animals/animals.names。
* 使用文本编辑器编辑 animals.names 文件。列出您要使用的类别。您需要每行恰好有一个条目,没有空行和注释。对于此示例,.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。
注意 maxbatches=....。开始时一个好的使用值是类别数的 2000 倍。对于此示例,我们有 4 种动物,因此 4 2000 = 8000。这意味着我们将使用 maxbatches=8000。
* 注意 steps=....。这应该设置为 maxbatches 的 80% 和 90%。对于此示例,我们将使用 steps=6400,7200,因为 maxbatches 被设置为 8000。
* 注意 width=... 和 height=....。这些是网络尺寸。Darknet/YOLO FAQ 解释了如何计算要使用的最佳尺寸。
* 搜索所有 classes=... 行的实例,并使用 .names 文件中类别的数量对其进行修改。对于此示例,我们将使用 classes=4。
搜索每个 [yolo] 部分之前 [convolutional] 部分中所有 filters=... 行的实例。要使用的值为 (类别数 + 5) 3。这意味着对于此示例,(4 + 5) * 3 = 27。因此,我们将在相应的行上使用 filters=27。
* 开始训练!运行以下命令:
`bash
cd ~/nn/animals/ darknet detector -map -dont_show train animals.data animals.cfg
`
* 请耐心等待。最佳权重将保存为 animals_best.weights。并且可以通过查看 chart.png 文件来观察训练的进度。有关您可能希望在训练新网络时使用的其他参数,请参阅 Darknet/YOLO FAQ。
* 如果您想在训练期间看到更多详细信息,请添加 --verbose 参数。例如:
`bash
darknet detector -map -dont_show --verbose train animals.data animals.cfg
`
7. 其他工具和链接
要管理您的 Darknet/YOLO 项目、注释图像、验证您的注释以及生成使用 Darknet 进行训练的必要文件,请参阅 DarkMark。
要获得强大的替代 Darknet CLI,要使用图像平铺、在视频中进行目标跟踪或获得可以在商业应用程序中轻松使用的强大的 C++ API,请参阅 DarkHelp。
请参阅 Darknet/YOLO FAQ,它可以帮助您解答问题。
请参阅 Stéphane 的 YouTube 频道上的众多教程和示例视频。
如果您有支持问题或想与其他 Darknet/YOLO 用户聊天,请加入 Darknet/YOLO Discord 服务器。
8. 路线图
最后更新时间 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 架构的 Jetson 设备的构建
* 原始 Jetson 设备不太可能得到修复,因为它们不再受 NVIDIA 支持(没有 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 的支持
* 旋转边界框,或某种形式的“角度”支持
* 关键点/骨架
* 热图(正在进行中)
* 分割