c语⾔封装dll_C#封装YOLOv4算法进⾏⽬标检测C#封装YOLOv4算法进⾏⽬标检测
概述
YOLO: 是实现实时物体检测的系统,Darknet是基于YOLO的框架
采⽤C#语⾔对 YOLOv4 ⽬标检测算法封装,将模型在实际应⽤系统中落地,实现模型在线远程调⽤。
环境准备
c语言下载什么本章只讲解如何对YOLOv4封装进⾏详解,具体环境安装过程不做介绍
查看你的GPU计算能⼒是否⽀持 >= 3.0:【点击查看】
Windows运⾏要求
CMake >= 3.12: 【点击下载】
CUDA >= 10.0: 【点击下载】
OpenCV >= 2.4: 【点击下载】
cuDNN >= 7.0: 【点击下载】
Visual Studio 2017/2019: 【点击下载】
我所使⽤的环境
系统版本: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
程序代码准备
源代码下载
下载地址:【Darknet】
使⽤Git
git clone github/AlexeyAB/darknet
cd darknet
代码结构
将YOLOv4编译为DLL
详细教程:【点击查看】,这个教程描述的很详细。
进⼊ darknetbuilddarknet ⽬录,打开解决⽅案 yolo_cpp_dll.sln
设置Windows SDK版本和平台⼯具集为当前系统安装版本
设置Release和x64
然后执⾏以下操作:Build-> Build yolo_cpp_dll
已完成⽣成项⽬“yolo_cpp_dll.vcxproj”的操作。
========== ⽣成: 成功 1 个,失败 0 个,最新 0 个,跳过 0 个 ==========
在打包DLL的过程中可能遇到如下问题
C1041
⽆法打开程序数据库“D:代码管理Cdarknetbuilddarknetx64DLL_Releasevc142.pdb”;如果要将多个 CL.EXE 写⼊同⼀个 .PDB ⽂件,请使⽤ /FS yolo_cpp_dll C: MSB3721
命令“"C:Program FilesNVIDIA GPU Computing " -gencode=arch=compute_30,code="sm_30,compute_30" -gencode=arch=compute
解决⽅法
在VS 2019 ⼯具》选项》项⽬和解决⽅案》⽣成并运⾏ 中最⼤并⾏项⽬⽣成数设为 1
在VS 2019 项⽬-》属性-》配置属性-》常规 将Windows SDK版本设置为系统当前版本即可
封装YOLOv4编译后的DLL
1、进⼊ darknetbuilddarknetx64 ⽬录,将 pthreadGC2.dll 和 pthreadVC2.dll 拷贝到项⽬ Dll ⽂件夹
2、将编译后的YOLOv4 DLL⽂件拷贝到项⽬ Dll ⽂件夹
3、进⼊ darknetbuilddarknetx64cfg ⽬录,将 yolov4.cfg 拷贝到项⽬ Cfg ⽂件夹
4、进⼊ darknetbuilddarknetx64data ⽬录,将 coco.names 拷贝到项⽬ Data ⽂件夹
5、下载 yolov4.weights 权重⽂件 拷贝到 Weights ⽂件夹,⽂件245 MB 【点击下载】
项⽬⽂件
代码下载:【Github】
YoloWrapper - YOLOv4封装项⽬
Cfg - 配置⽂件夹
Data - label⽂件夹
Dll - YOLOv4 编译后的DLL⽂件夹
Weights - YOLOv4 权重⽂件夹
BboxContainer.cs
BoundingBox.cs
YoloWrapper.cs - 封装主⽂件,调⽤ YOLOv4 的动态链接库
YoloWrapperConsole - 调⽤封装DLL控制台程序
Program.cs - 控制台主程序,调⽤ YOLOv4 封装⽂件
代码
YOLOv4封装项⽬
YoloWrapper.cs - 封装主⽂件,调⽤ YOLOv4 的动态链接库
using System;
using System.Runtime.InteropServices;
namespace YoloWrapper
{
public class YoloWrapper : IDisposable
{
private const string YoloLibraryName = @"Dllsyolo_cpp_dll.dll";
[DllImport(YoloLibraryName, EntryPoint = "init")]
private static extern int InitializeYolo(string configurationFilename, string weightsFilename, int gpu);
[DllImport(YoloLibraryName, EntryPoint = "detect_image")]
private static extern int DetectImage(string filename, ref BboxContainer container);
[DllImport(YoloLibraryName, EntryPoint = "detect_mat")]
private static extern int DetectImage(IntPtr pArray, int nSize, ref BboxContainer container);
[DllImport(YoloLibraryName, EntryPoint = "dispose")]
private static extern int DisposeYolo();
public YoloWrapper(string configurationFilename, string weightsFilename, int gpu)
{
InitializeYolo(configurationFilename, weightsFilename, gpu);
}
public void Dispose()
{
DisposeYolo();
}
public BoundingBox[] Detect(string filename)
{
var container = new BboxContainer();
var count = DetectImage(filename, ref container);
return container.candidates;
}
public BoundingBox[] Detect(byte[] imageData)
{
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论