.net 多个dll 封装成一个dll_C#封装YOLOv4算法进行目标检测

(给DotNet加星标,提升.Net技能)

转自:叮咚z cnblogs.com/zypblog/p/13656366.html

概述

  • 官网:https://pjreddie.com/darknet/

  • Darknet:https://github.com/AlexeyAB/darknet

  • C#封装代码:https://github.com/zhang8043/YoloWrapper

YOLO: 是实现实时物体检测的系统,Darknet是基于YOLO的框架

采用C#语言对 YOLOv4 目标检测算法封装,将模型在实际应用系统中落地,实现模型在线远程调用。

环境准备

本章只讲解如何对YOLOv4封装进行详解,具体环境安装过程不做介绍

查看你的GPU计算能力是否支持 >= 3.0:https://en.wikipedia.org/wiki/CUDA#GPUs_supported

Windows运行要求

CMake >= 3.12: https://cmake.org/download/

CUDA >= 10.0: https://developer.nvidia.com/cuda-toolkit-archive

OpenCV >= 2.4: https://opencv.org/releases/

cuDNN >= 7.0: https://developer.nvidia.com/rdp/cudnn-archive

Visual Studio 2017/2019: https://visualstudio.microsoft.com

我所使用的环境

系统版本:Windows 10 专业版

显卡:GTX 1050 Ti

CMake版本:3.18.2

CUDA版本:10.1

OpenCV版本:4.4.0

cuDNN版本:10.1

MSVC 2017/2019: Visual Studio 2019

程序代码准备

源代码下载

下载地址:https://github.com/AlexeyAB/darknet

使用Git

clone https://github.com/AlexeyAB/darknet

代码结构

511f0e06b4d3d9c7bf7227da47fc4001.png

将YOLOv4编译为DLL

详细教程:https://zhuanlan.zhihu.com/p/97605980,这个教程描述的很详细。

进入 darknet\build\darknet 目录,打开解决方案 yolo_cpp_dll.sln

ef940cf5c4f42a20ebab018bf3196347.png

设置Windows SDK版本和平台工具集为当前系统安装版本

78a7b6c5e57ccb5e7002696f5d679c26.png

设置Release和x64

dccad63411355a6159adad9fb52deb60.png

然后执行以下操作:Build-> Build yolo_cpp_dll

已完成生成项目“yolo_cpp_dll.vcxproj”的操作。
========== 生成: 成功 1 个,失败 0 个,最新 0 个,跳过 0 个 ==========

在打包DLL的过程中可能遇到如下问题

C1041
MSB3721
命令“"C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.1\bin\nvcc.exe" -gencode=arch=compute_30,code=\"sm_30,compute_30\" -gencode=arch=compute_75,code=\"sm_75,compute_75\" --use-local-env -ccbin "C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.27.29110\bin\HostX86\x64" -x cu -IC:\opencv\build\include -IC:\opencv_3.0\opencv\build\include -I..\..\include -I..\..\3rdparty\stb\include -I..\..\3rdparty\pthreads\include -I"C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.1\include" -I"C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.1\include" -I\include -I\include -I"C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.1\include" --keep-dir x64\Release -maxrregcount=0 --machine 64 --compile -cudart static -DCUDNN_HALF -DCUDNN -DGPU -DLIB_EXPORTS -D_TIMESPEC_DEFINED -D_SCL_SECURE_NO_WARNINGS -D_CRT_SECURE_NO_WARNINGS -DWIN32 -DNDEBUG -D_CONSOLE -D_LIB -D_WINDLL -D_MBCS -Xcompiler "/EHsc /W3 /nologo /O2 /Fdx64\DLL_Release\vc142.pdb /Zi /MD " -o x64\DLL_Release\dropout_layer_kernels.cu.obj "D:\darknet\src\dropout_layer_kernels.cu"”已退出,返回代码为 2。yolo_cpp_dllC:\Program Files (x86)\Microsoft Visual Studio\2019\Community\MSBuild\Microsoft\VC\v160\BuildCustomizations\CUDA 10.1.targets757

解决方法

在VS 2019 工具》选项》项目和解决方案》生成并运行 中最大并行项目生成数设为 1

bcd278c5f6ee71d800219b9b42d67cc8.png

在VS 2019 项目-》属性-》配置属性-》常规 将Windows SDK版本设置为系统当前版本即可

5ca07ad8b3443dd6772eaeb228ee8017.png

封装YOLOv4编译后的DLL

1、进入 darknet\build\darknet\x64 目录,将 pthreadGC2.dll 和 pthreadVC2.dll 拷贝到项目 Dll 文件夹

2、将编译后的YOLOv4 DLL文件拷贝到项目 Dll 文件夹

3、进入 darknet\build\darknet\x64\cfg 目录,将 yolov4.cfg 拷贝到项目 Cfg 文件夹

4、进入 darknet\build\darknet\x64\data 目录,将 coco.names 拷贝到项目 Data 文件夹

5、下载 yolov4.weights 权重文件 拷贝到 Weights 文件夹,文件245 MB https://github.com/AlexeyAB/darknet/releases/download/darknet_yolo_v3_optimal/yolov4.weights

项目文件

代码下载:https://github.com/zhang8043/YoloWrapper

1、YoloWrapper - YOLOv4封装项目

  • Cfg - 配置文件夹

  • Data - label文件夹

  • Dll - YOLOv4 编译后的DLL文件夹

  • Weights - YOLOv4 权重文件夹

  • BboxContainer.cs

  • BoundingBox.cs

  • YoloWrapper.cs - 封装主文件,调用 YOLOv4 的动态链接库

2、YoloWrapperConsole - 调用封装DLL控制台程序

  • Program.cs - 控制台主程序,调用 YOLOv4 封装文件

7c5f3544ab78811f2d5ed878d95585d7.png

代码

YOLOv4封装项目

YoloWrapper.cs - 封装主文件,调用 YOLOv4 的动态链接库

using System;

BboxContainer.cs

using System.Runtime.InteropServices;

BoundingBox.cs

using System;

调用封装DLL控制台程序

BoundingBox.cs

using ConsoleTables;

测试返回结果

d690e013971f2d4c8935ff383b3604f2.png

97b21f07e91688a5523fde7e05777927.png

控制台

46f3858d03e30d100d8b5d9277c53b8b.png

- EOF -

0e5c05ae4add6ce5893ca644e74df953.png

推荐阅读   点击标题可跳转 C#网络编程的最佳实践 ASP.NET Core进程内与进程外的性能对比 .NET在Windows上使用Jenkins做CI/CD那些事 

看完本文有收获?请转发分享给更多人

关注「DotNet」加星标,提升.Net技能 

2b3930ae5092b95018cb59e37fae2129.png

好文章,我在看❤️

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值