数据复制:
拆箱需要将堆上的数据复制回栈上。这同样涉及数据的复制操作,带来了额外的性能开销。
使用泛型:泛型可以减少装箱和拆箱的需要,因为泛型可以在编译时确定类型,而不需要在运行时进行类型转换,但是泛型带来另一个问题,即转换为il2cpp的时候,代码会膨胀,这个后面可以再说
// 使用泛型避免装箱和拆箱List<intnumbers = new List<int(); numbers.Add(42);int number = numbers[0];
避免频繁的值类型到引用类型的转换:在设计程序时,尽量减少值类型与引用类型之间的转换。如果可能,尽量使用值类型本身来进行计算和处理。
使用struct而不是类:在某些情况下,可以使用struct来代替类,因为struct是值类型,不需要装箱和拆箱。
避免接口调用:接口调用通常需要装箱,特别是在接口接受值类型参数时。尽量避免在接口方法中使用值类型参数
11.GameObject.Instantiate 和 SetParent
1 public class ESDRoadEdgePool 2 { 3 //public int amountToPool = 100; // 池中对象的数量 4 public int amountToPool = 25; 5 6 pooledObjects = new List<GameObject>(); 7 8 for (int i = 0; i < amountToPool; i++) 9 {10 GameObject obj = Instantiate(objectToPool); // 实例化可以缩减11 obj.SetActive(false); // 可以预先设置预制体的activeSelf12 obj.transform.parent = this.transform; // 可以合并到Instantiate中13 pooledObjects.Add(obj);14 15 16 GameObject obj = Instantiate(objectToPool, transform);17 pooledObjects.Add(obj);18 }19 }
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27 |
1
for
(
int
i = 0; i < count; i++)
2 {
3 ...
4 Vector2 p1l_uv =
new
Vector2(offest.x, uvStart / 10f);
5 Vector2 p1r_uv =
new
Vector2(offest.y, uvStart / 10f);
6 Vector2 p2l_uv =
new
Vector2(offest.x, (uvStart + distance) / 10);
7 Vector2 p2r_uv =
new
Vector2(offest.y, (uvStart + distance) / 10);
8 ...
9 }1011
// 可以将对象创建挪到循环外进行复用1213 Vector2 p1l_uv =
new
Vector2();14 Vector2 p1r_uv =
new
Vector2();15 Vector2 p2l_uv =
new
Vector2();16 Vector2 p2r_uv =
new
Vector2();1718
for
(
int
i = 0; i < count; i++)19 {20 ...21
// 同时可以使用Vector3.Set来一次性对向量的每个分量进行赋值22 p1l_uv.Set(offest.x, uvStart / 10f);23 p1r_uv.Set(offest.y, uvStart / 10f);24 p2l_uv.Set(offest.x, (uvStart + distance) / 10);25 p2r_uv.Set ttkqw.com(offest.y, (uvStart + distance) / 10);26 ...27 } |
1 for (int i = 0; i < len - 1; i++) 2 { 3 ... 4 SquareCell cell = new SquareCell(); 5 ... 6 } 7 8 // 加入对象池 9 public class SquareCellPool10 {11 public static SquareCell Allocate()12 {13 if (pool.TryDequeue(out var cell))14 {15 totalCount--;16 return cell;17 }18 19 for (int i = 0; i < poolInterval; i++)20 {21 SquareCell newCell = new SquareCell();22 pool.Enqueue(newCell);23 totalCount++;24 }25 26 if (totalCount > 65535)27 {28 Debug.LogError("Pool Out of Count!" + totalCount);29 return null;30 }31 cell = pool.Dequeue();32 totalCount--;33 return cell;34 }
DeploySharp 为 YOLOv26 提供了三层架构设计:
在核心库
DeploySharp 中定义了统一的接口:
// YOLOv26 检测接口// IYolov26DetModel 继承自 IYolov10DetModel// 这种设计使得 YOLOv26 可以复用 YOLOv10 的成熟实现public abstract class IYolov26DetModel : IYolov10DetModel{ /// <summary>
/// 构造函数,接收模型配置
/// </summary>
/// <param name="config">YOLOv26 检测模型配置对象</param>
public IYolov26DetModel(Yolov26DetConfig config) : base(config)
{ // 使用日志系统记录模型初始化信息
MyLogger.Log.Info($"Initializing {this.GetType().Name}, Config:\n{config}");
}
}
每种模型类型都有对应的配置类,提供灵活的参数设置:
// YOLOv26 检测配置类// 继承自 Yolov10DetConfig,复用 YOLOv10 的成熟配置public class Yolov26DetConfig : Yolov10DetConfig{ /// <summary>
/// 默认构造函数
/// </summary>
public Yolov26DetConfig() { } /// <summary>
/// 带模型路径的构造函数
/// 自动设置合理的默认参数
/// </summary>
/// <param name="modelPath">模型文件路径</param>
public Yolov26DetConfig(string modelPath)
{
...
}
}
分别提供 ImageSharp 和 OpenCvSharp 两种实现,开发者可以根据需求选择。
YoloDetConfig (基类) ├── Yolov8DetConfig ├── Yolov10DetConfig └── Yolov26DetConfig (继承自 Yolov10DetConfig) YoloModel (基类) ├── Yolov8DetModel ├── Yolov10DetModel └── Yolov26DetModel (继承自 Yolov10DetModel)
这种继承设计的优势:
使用 ImageSharp 作为图像处理库、TensorRT 作为推理后端时,需要安装以下核心包:
DeploySharp 基础库及扩展库:
JYPPX.DeploySharpJYPPX.DeploySharp.ImageSharp
TensorRT Runtime 库:
JYPPX.TensorRT.CSharp.API.runtime.win-x64.cuda11或JYPPX.TensorRT.CSharp.API.runtime.win-x64.cuda12
注意:TensorRT Runtime 库的版本需根据本地设备安装的 CUDA 版本进行选择。
以下代码可直接复制运行:
using DeploySharp.Model; // 引入模型相关定义using DeploySharp.Data; // 引入数据处理相关using DeploySharp.Engine; // 引入推理引擎核心using DeploySharp; // 引入 DeploySharp 主库using SixLabors.ImageSharp; // ImageSharp 图像处理库using SixLabors.ImageSharp.PixelFormats; // ImageSharp 像素格式namespace DeploySharp.ImageSharp.Demo{ /// <summary>
/// YOLO26目标检测演示类
/// 该类展示了如何加载 TensorRT 引擎文件,对图像进行推理并可视化结果。
/// </summary>
public class YOLOv26DetDemo
{ public static void Run()
{ // ==========================================
// 1. 路径配置
// ==========================================
// 模型下载提示:模型和测试图片可以前往QQ群(945057948)下载
// 设置 .engine 文件路径。
// 注意:TensorRT 的 .engine 文件是硬件相关的,即在 RTX 3090 上生成的 engine 通常不能在 RTX 4090 上运行。
string modelPath = @"D:\Program Files\TensorRT-10.13.0.35-cu11\bin\yolo26s.engine";
// 设置待推理的图片路径
string imagePath = @"E:\Data\image\bus.jpg"; // ==========================================
// 2. 模型配置初始化
// ==========================================
// 创建 YOLO26 的配置对象,传入模型路径
Yolov26DetConfig config = new Yolov26DetConfig(modelPath);
// 设置最大批处理大小。
// 即使只推理一张图片,设置适当的 BatchSize 有时也能利用 GPU 并行能力。
// 此处设为 2 表示引擎内部最大可以一次处理 2 张图,但要首先保证模型支持。
config.MaxBatchSize = 2;
// 显式指定推理后端为 TensorRT。
// DeploySharp 支持多种后端(如 ONNX Runtime, OpenVINO 等),这里强制使用 TensorRT 以获得最佳性能。
config.SetTargetInferenceBackend(InferenceBackend.TensorRT); // ==========================================
// 3. 类别字典定义
// ==========================================
// COCO 数据集的 80 个类别名称列表
// YOLO 模型通常输出的是类别的索引(0-79),我们需要将其映射为人类可读的字符串。
List<string> d = new List<string> { "person", "bicycle", "car", "motorcycle", "airplane", "bus", "train", "truck", "boat", "traffic light", "fire hydrant", "stop sign", "parking meter", "bench", "bird", "cat", "dog", "horse", "sheep", "cow", "elephant", "bear", "zebra", "giraffe", "backpack", "umbrella", "handbag", "tie", "suitcase", "frisbee", "skis", "snowboard", "sports ball", "kite", "baseball bat", "baseball glove", "skateboard", "surfboard", "tennis racket", "bottle", "wine glass", "cup", "fork", "knife", "spoon", "bowl", "banana", "apple", "sandwich", "orange", "broccoli", "carrot", "hot dog", "pizza", "donut", "cake", "chair", "couch", "potted plant", "bed", "dining table", "toilet", "tv", "laptop", "mouse", "remote", "keyboard", "cell phone", "microwave", "oven", "toaster", "sink", "refrigerator", "book", "clock", "vase", "scissors", "teddy bear", "hair drier", "toothbrush" }; // 将列表转换为字典,Key 为索引,Value 为类别名称
Dictionary<int, string> CategoryDict = new Dictionary<int, string>(); for (int i = 0; i < d.Count; i++)
{
CategoryDict[i] = d[i];
}
// 将类别字典赋值给配置对象,用于后续结果解析
config.CategoryDict = CategoryDict; // ==========================================
// 4. 模型实例化
// ==========================================
// 根据配置初始化检测器模型。
// 此步骤会加载 engine 文件到内存,并初始化 GPU 上下文。
Yolov26DetModel model = new Yolov26DetModel(config);
// 使用 SixLabors.ImageSharp 加载图片。
// Image.Load 会自动根据文件扩展名解码图片。
var img = Image.Load(imagePath); // ==========================================
// 5. 模型推理与性能测试
// ==========================================
// 执行第一次推理。
// 注意:TensorRT 的推理通常包含 Kernel 初始化等开销,速度会比后续推理慢。
DetResult[] result = model.Predict(img);
// 执行第二次推理。
// 这次推理的时间更能代表模型在实际场景中的平均推理速度。
result = model.Predict(img);
// 执行第三次推理(可选),用于进一步取平均值或确保稳定性。
result = model.Predict(img);
// 打印推理性能分析记录。
// 这通常会输出预处理、推理、后端处理各阶段的耗时(毫秒级)。
model.ModelInferenceProfiler.PrintAllRecords();
// 初始化一个列表,虽然本例未直接使用,但在处理多图结果时可能会用到。
List<Image<Rgb24>> resultsMat = new List<Image<Rgb24>>(); // ==========================================
// 6. 结果可视化与保存
// ==========================================
// 将推理结果绘制在原图上。
// Visualize.DrawDetResult 会根据 DetResult 中的坐标和置信度画框和文字。
// 需要将 img 强制转换为 Image<Rgb24>,因为 DrawDetResult 通常需要特定的像素格式。
var resultImg = Visualize.DrawDetResult(result, (Image<Rgb24>)img, new VisualizeOptions(1.0f)); // 保存带有检测框的图片到当前目录下。
// 文件名包含配置的模型类型,便于区分不同模型的结果。
resultImg.Save(@$"./result_{config.ModelType}.jpg");
}
}
}
配置模型参数:
Yolov26DetConfig config = new Yolov26DetConfig(modelPath); config.MaxBatchSize = 2; config.SetTargetInferenceBackend(InferenceBackend.TensorRT);
创建模型实例:
Yolov26DetModel model ttkq-163.cn= new Yolov26DetModel(config);
模型实例化时会自动加载 .engine 文件并初始化 TensorRT 引擎。
执行推理:
DetResult[] result = model.Predict(img);
Predict() 方法返回检测结果数组,每个元素包含边界框、置信度和类别信息。
using DeploySharp.Model; // 引入模型定义和配置类 using DeploySharp.Data; // 引入数据处理相关的类 using DeploySharp.Engine;zggren.com // 引入推理引擎核心接口和枚举 using DeploySharp; // 引入 DeploySharp 主库和可视化工具 namespace DeploySharp.OpenCvSharp.Demo { /// <summary> /// YOLO26 目标检测演示 (基于 ONNX Runtime + OpenCvSharp) /// 本示例展示了如何加载 ONNX 模型,并配置使用 DirectML 在 GPU 上进行推理。 /// </summary> public class Yolov26DetDemo { public static void Run() { // ========================================== // 1. 路径配置 // ========================================== // 模型下载提示:模型和测试图片可以前往QQ群(945057948)下载 // 注意:此处加载的是标准的 .onnx 模型文件,而不是 TensorRT 的 .engine 文件。 // ONNX 模型具有良好的跨平台特性。 string modelPath = @"E:\Model\yolov28\yolo26s.onnx" ; // 设置待检测的图片路径 string imagePath huluzhibo.cn= @"E:\Data\image\bus.jpg" ; // ========================================== // 2. 模型配置与推理后端设置 // ========================================== // 创建 YOLO26 的配置对象,传入模型路径 Yolov26DetConfig config = new Yolov26DetConfig(modelPath); // [关键步骤] 设置推理后端为 ONNX Runtime。 // 这意味着模型将通过 ONNX Runtime 进行加载和执行,而不是 TensorRT。 config.SetTargetInferenceBackend(InferenceBackend.OnnxRuntime); // 设置目标设备类型为 GPU 0。 // 这是一个逻辑设定,具体执行取决于 ONNX Runtime 的提供程序。 config.SetTargetDeviceType(DeviceType.GPU0); // [关键步骤] 设置 ONNX Runtime 的具体执行提供程序为 DML (DirectML)。 // DirectML 是 Windows 上的高性能硬件加速接口,支持 AMD、NVIDIA 和 Intel 显卡。 // 如果不加这一行,ONNX Runtime 可能默认使用 CPU 进行推理,速度较慢。 config.SetTargetOnnxRuntimeDeviceType(OnnxRuntimeDeviceType.DML); // ========================================== // 3. 类别字典定义 (COCO 80类) // ========================================== // 定义 COCO 数据集的 80 个类别名称 // 这些名称将用于在结果可视化时标注检测到的物体 List< string > d = new List< string > { "person" , "bicycle" , "car" , "motorcycle" , "airplane" , "bus" , "train" , "truck" , "boat" , "traffic light" , "fire hydrant" , "stop sign" , "parking meter" , "bench" , "bird" , "cat" , "dog" , "horse" ,cqpryk.com "sheep" , "cow" , "elephant" , "bear" , "zebra" , "giraffe" , "backpack" , "umbrella" , "handbag" , "tie" , "suitcase" , "frisbee" , "skis" , "snowboard" , "sports ball" , "kite" , "baseball bat" , "baseball glove" , "skateboard" , "surfboard" , "tennis racket" , "bottle" , "wine glass" , "cup" , "fork" , "knife" , "spoon" , "bowl" , sportsurge.cn "banana" , "apple" , "sandwich" , "orange" , "broccoli" , c20paper.com "carrot" , "hot dog" , "pizza" , "donut" , "cake" ,sky-sports.cn "chair" , "couch" , "potted plant" , "bed" , "dining table" , "toilet" , "tv" , "laptop" , "mouse" , "remote" , "keyboard" , "cell phone" , "microwave" , "oven" , "toaster" , "sink" , "refrigerator" , "book" , "clock" , "vase" , "scissors" , "teddy bear" , "hair drier" , "toothbrush" }; // 构建<索引, 类别名>字典 Dictionary< int , string > CategoryDict = new Dictionary< int , string >(); for ( int i = 0 ; i < d.Count; i++) { CategoryDict[i] = d[i]; } // 将类别字典赋值给配置对象 config.CategoryDict = CategoryDict; // ========================================== // 4. 模型初始化 // ========================================== // 实例化模型,传入配置。 // 此时 DeploySharp 会根据配置加载 ONNX 模型,并初始化 DirectML 会话。 Yolov26DetModel model = new Yolov26DetModel(config); // 使用 OpenCvSharp 读取图片到 Mat 对象中 // Mat 是 OpenCV 中用于存储图像数据的核心矩阵结构 Mat img = Cv2.ImRead(imagePath); // ========================================== // 5. 模型推理 (预热与测试) // ========================================== // 执行多次推理。 // 第一次推理通常包含模型加载、内存分配等初始化开销,耗时较长。 Result[] result = model.Predict(img); // 后续推理用于测试稳定的推理速度。 result = model.Predict(img); result = model.Predict(img); result = model.Predict(img); // 打印性能分析记录。 // 这将输出推理过程中各阶段(如预处理、推理执行、后处理)的耗时统计。 model.ModelInferenceProfiler.PrintAllRecords(); // 初始化列表,用于存储处理后的图像(本例主要用于演示) List<Mat> resultsMat = new List<Mat>(); // ========================================== // 6. 结果可视化与显示 // ========================================== // 调用可视化工具,将检测框(矩形框)和类别标签绘制在原图上。 // VisualizeOptions(1.0f) 可能指定了缩放比例或字体大小等参数。 var resultImg ttzbapp.com= Visualize.DrawDetResult(result, img, new VisualizeOptions( 1.0f )); // 将绘制好的图像加入列表 resultsMat.Add(resultImg); // 使用 OpenCV 的窗口显示结果图像。 // "image" 是窗口的标题。 Cv2.ImShow( "image" , resultImg); // 等待按键输入。 // 参数 0 表示无限期等待,直到用户按下键盘任意键。 // 这是为了防止控制台程序执行完毕后窗口立即闪退。
使用 OpenCvSharp 作为图像处理库、OpenVINO 作为推理后端时,需要安装以下核心包:
DeploySharp 基础库及扩展库:
JYPPX.DeploySharpJYPPX.DeploySharp.OpenCvSharp
Runtime 库:
OpenCvSharp4.runtime.win OpenVINO.runtime.win
推理代码如下所示,可直接复制运行:
using OpenCvSharp; // 引入 OpenCvSharp,用于图像的读取、显示和矩阵操作using DeploySharp.Model; // 引入模型定义和配置类using DeploySharp.Data; // 引入数据处理相关的类using DeploySharp.Engine; // 引入推理引擎核心接口和枚举using DeploySharp; // 引入 DeploySharp 主库和可视化工具namespace DeploySharp.OpenCvSharp.Demo{ /// <summary>
/// YOLO26 目标检测演示 (基于OpenVINO + OpenCvSharp)
/// </summary>
public class Yolov26DetDemo
{ public static void Run()
{ // ==========================================
// 1. 路径配置
// ==========================================
// 模型下载提示:模型和测试图片可以前往QQ群(945057948)下载
// 注意:此处加载的是标准的 .onnx 模型文件,而不是 TensorRT 的 .engine 文件。
// ONNX 模型具有良好的跨平台特性。
string modelPath = @"E:\Model\yolov28\yolo26s.onnx";
// 设置待检测的图片路径
string imagePath = @"E:\Data\image\bus.jpg"; // ==========================================
// 2. 模型配置
// ==========================================
// 创建 YOLO26Det 的配置对象,传入模型路径
Yolov26DetConfig config = new Yolov26DetConfig(modelPath);
// ==========================================
// 3. 类别字典定义 (COCO 80类)
// ==========================================
// 定义 COCO 数据集的 80 个类别名称
// 这些名称将用于在结果可视化时标注检测到的物体
List<string> d = new List<string> { "person", "bicycle", "car", "motorcycle", "airplane", "bus", "train", "truck", "boat", "traffic light", "fire hydrant", "stop sign", "parking meter", "bench", "bird", "cat", "dog", "horse", "sheep", "cow", "elephant", "bear", "zebra", "giraffe", "backpack", "umbrella", "handbag", "tie", "suitcase", "frisbee", "skis", "snowboard", "sports ball", "kite", "baseball bat", "baseball glove", "skateboard", "surfboard", "tennis racket", "bottle", "wine glass", "cup", "fork", "knife", "spoon", "bowl", "banana", "apple", "sandwich", "orange", "broccoli", "carrot", "hot dog", "pizza", "donut", "cake", "chair", "couch", "potted plant", "bed", "dining table", "toilet", "tv", "laptop", "mouse", "remote", "keyboard", "cell phone", "microwave", "oven", "toaster", "sink", "refrigerator", "book", "clock", "vase", "scissors", "teddy bear", "hair drier", "toothbrush" }; // 构建<索引, 类别名>字典
Dictionary<int, string> CategoryDict = new Dictionary<int, string>(); for (int i = 0; i < d.Count; i++)
{
CategoryDict[i] ttzb.gs.cn= d[i];
}
// 将类别字典赋值给配置对象
config.CategoryDict = CategoryDict; // ==========================================
// 4. 模型初始化
// ==========================================
// 实例化模型,传入配置。
// 此时 DeploySharp 会根据配置加载 ONNX 模型,并初始化 DirectML 会话。
Yolov26DetModel model = new Yolov26DetModel(config);
// 使用 OpenCvSharp 读取图片到 Mat 对象中
// Mat 是 OpenCV 中用于存储图像数据的核心矩阵结构
Mat img = Cv2.ImRead(imagePath); // ==========================================
// 5. 模型推理 (预热与测试)
// ==========================================
// 执行多次推理。
// 第一次推理通常包含模型加载、内存分配等初始化开销,耗时较长。
Result[] result = model.Predict(img);
// 后续推理用于测试稳定的推理速度。
result = model.Predict(img);
result = model.Predict(img);
result = model.Predict(img);
// 打印性能分析记录。
// 这将输出推理过程中各阶段(如预处理、推理执行、后处理)的耗时统计。
model.ModelInferenceProfiler.PrintAllRecords();
// 初始化列表,用于存储处理后的图像(本例主要用于演示)
List<Mat> resultsMat = new List<Mat>(); // ==========================================
// 6. 结果可视化与显示
// ==========================================
// 调用可视化工具,将检测框(矩形框)和类别标签绘制在原图上。
// VisualizeOptions(1.0f) 可能指定了缩放比例或字体大小等参数。
var resultImg = Visualize.DrawDetResult(result, img, new VisualizeOptions(1.0f));
// 将绘制好的图像加入列表
resultsMat.Add(resultImg);
// 使用 OpenCV 的窗口显示结果图像。
// "image" 是窗口的标题。
Cv2.ImShow("image", resultImg);
// 等待按键输入。
// 参数 0 表示无限期等待,直到用户按下键盘任意键。
// 这是为了防止控制台程序执行完毕后窗口立即闪退。
Cv2.WaitKey();
}
}
}
上述代码与 3.2 节的代码结构基本相似。使用 OpenVINO 作为推理后端时,通常无需额外设置,因为 DeploySharp 默认支持 OpenVINO。
若设备配备英特尔的集成显卡、独立显卡或 NPU,可通过以下代码指定推理设备以获得更好的性能:
config.SetTargetInferenceBackend(InferenceBackend.OpenVINO); config.SetTargetDeviceType(DeviceType.GPU0); // 设置设备为集显// 或config.SetTargetDeviceType(DeviceType.GPU1); // 设置推理设备为独立显卡// 或config.SetTargetDeviceType(DeviceType.NPU); // 设置推理设备为 NPU
控制台输出如下。使用 OpenVINO 在 CPU 上进行推理时,虽因设备限制推理速度有限,但 OpenVINO 已是 CPU 环境下推理速度最快的工具之一,且配置简单,全面支持英特尔全系设备,欢迎开发者使用。
using
DeploySharp.Model;
// 引入模型配置相关的类
using
DeploySharp.Data;
// 引入数据结果定义相关的类
using
DeploySharp.Engine;espnzhibo.cn
// 引入推理引擎核心接口
using
DeploySharp;
// 引入 DeploySharp 主库及可视化工具
namespace
DeploySharp.OpenCvSharp.Demo
{
///
<summary>
/// YOLO26Seg 实例分割演示类
/// 本示例展示如何加载 TensorRT 引擎文件,对图像进行实例分割推理,并将掩码绘制在原图上。
///
</summary>
public
class ttzbapp.com
Yolov26SegDemo
{
public
static
void
Run()
{
// ==========================================
// 1. 路径配置
// ==========================================
// 模型下载提示:模型和测试图片可以前往QQ群(945057948)下载
// 设置 TensorRT 引擎文件路径。
// 注意:这里使用的是 footzhibo.com.engine 文件,它是针对特定 GPU 和 TensorRT 版本编译的。
// 文件名中的 '-seg' 表示这是一个带有分割头的实例分割模型。
string
modelPath =
@"D:\Program Files\TensorRT-10.13.0.35-cu11\bin\yolo26s-seg.engine"
;
// 设置待推理的图片路径
string
imagePath =
@"E:\Data\image\bus.jpg"
;
// ==========================================
// 2. 模型配置与初始化
// ==========================================
// 创建 YOLO26Seg (实例分割) 的配置对象,传入模型路径
Yolov26SegConfig config =
new
Yolov26SegConfig(modelPath);
// [关键设置] 指定推理后端为 TensorRT。
// 利用 TensorRT 可以在 NVIDIA GPU 上获得极高的推理速度。
config.SetTargetInferenceBackend(InferenceBackend.TensorRT);
// 实例化模型。
// 此时会加载引擎文件,初始化 GPU 显存上下文。
Yolov26SegModel model =
new
Yolov26SegModel(config);
// ==========================================
// 3. 图像加载
// ==========================================
// 使用 OpenCvSharp 读取图片。
// img 是一个 Mat 对象,包含了图像的像素数据。
Mat img = Cv2.ImRead(imagePath);
// ==========================================
// 4. 模型推理 (预热与性能测试)
// ==========================================
// 执行第一次推理。
// 运行通常包含模型加载、显存分配等开销,耗时较长。
var
result =livesoccerzb.cn model.Predict(img);
// 执行后续多次推理。
// 这是为了排除初始化开销,测试模型在稳定状态下的推理速度。
result = model.Predict(img);
result = model.Predict(img);
result = model.Predict(img);
// 打印推理性能分析记录。
// 这将输出预处理、推理计算、后处理(包括掩码生成)各阶段的耗时。
model.ModelInferenceProfiler.PrintAllRecords();
// ==========================================
// 5. 结果可视化
// ==========================================
// 调用可视化工具,绘制分割结果。
// 注意这里使用的是 DrawSegResult (绘制分割结果),而不是 DrawDetResult (绘制检测框)。
// 该函数会将检测到的物体框、类别标签以及彩色的半透明掩码绘制在原图上。
var
resultImg basketzhibo.cn= Visualize.DrawSegResult(result, img,
new
VisualizeOptions(
1.0f
));
// 使用 OpenCV 窗口显示渲染后的结果图像。
Cv2.ImShow(
"image"
, resultImg);
// 等待按键输入,防止窗口闪退。
创建分割配置:
Yolov26SegConfig config = new Yolov26SegConfig(modelPath); config.SetTargetInferenceBackend(InferenceBackend.TensorRT);
Yolov26SegConfig 是 YOLOv26 分割模型的配置类。
执行分割推理:
var result = model.Predict(img);
分割推理返回
SegResult[] 数组,每个元素包含边界框、置信度、类别和分割掩码。
可视化分割结果:
var resultImg = Visualize.DrawSegResult(result, img, new VisualizeOptions(1.0f));
DrawSegResult 会为每个检测到的对象绘制不同颜色的掩码,叠加在原图上。
以下三张截图分别展示了在 TensorRT GPU、ONNX Runtime(DirectML) GPU、OpenVINO CPU 设备下的推理性能。不同引擎各有优势,开发者可根据自身硬件环境选择最适合的方案。
using
DeploySharp.Model;
// 引入模型定义和配置类
using
DeploySharp.Data;
// 引入数据结果相关的类
using
DeploySharp.Engine; spacexzhibo.com
// 引入推理引擎核心接口
using
DeploySharp;
// 引入 DeploySharp 主库和可视化工具
using
System;
// 引入 System 命名空间以使用 Console
namespace
DeploySharp.OpenCvSharp.Demo
{
///
<summary>
/// YOLO26Pose 姿态估计演示类
/// 本示例展示了如何加载 ONNX 模型进行人体关键点检测,并可视化骨骼连接。
///
</summary>
public
class
Yolov26PoseDemo
{
public
static
void
Run()
{
// ==========================================
// 1. 路径配置
// ==========================================
// 模型下载提示:模型和测试图片可以前往QQ群(945057948)下载
// 设置 ONNX 模型文件路径。
// '-pose' 后缀表示这是一个专门用于姿态估计(关键点检测)的模型。
string
modelPath =
@"E:\Model\yolov28\yolo26s-pose.onnx"
;
// 设置待推理的图片路径
string
imagePath =
@"E:\Data\image\demo_9.jpg"
;
// ==========================================
// 2. 模型配置与初始化
// ==========================================
// 创建 YOLO26Pose (姿态估计) 的配置对象,传入模型路径
Yolov26PoseConfig config =
new
Yolov26PoseConfig(modelPath);
// [关键设置] 设置推理后端为 ONNX Runtime。
// 这使得模型可以跨平台运行,不仅限于 NVIDIA GPU(取决于 ONNX Runtime 的安装提供程序)。
config.SetTargetInferenceBackend(InferenceBackend.OnnxRuntime);
// 实例化姿态估计模型。
// 模型加载时会解析 ONNX 图结构,准备好输入输出节点。
Yolov26PoseModel model =
new
Yolov26PoseModel(config);
// ==========================================
// 3. 图像加载
// ==========================================
// 使用 OpenCvSharp 读取图片。
Mat img =xzhibo.com.cn Cv2.ImRead(imagePath);
// ==========================================
// 4. 模型推理与结果查看
// ==========================================
// 执行推理。
// 第一次推理通常较慢,包含初始化开销。
var
result = model.Predict(img);
// 执行多次推理以测试稳定状态下的性能。
result = model.Predict(img);
result = model.Predict(img);
result = model.Predict(img);
// 打印第一个结果的详细信息到控制台。
// 姿态估计的 Result 对象通常包含检测框信息以及一个关键点数组。
// 这一行有助于开发者调试,查看模型输出的原始数据结构。
Console.WriteLine(result[
0
].ToString());
// 打印性能分析记录,查看各阶段耗时。
model.ModelInferenceProfiler.PrintAllRecords();
// ==========================================
// 5. 结果可视化
// ==========================================
// 调用可视化工具,绘制姿态估计结果。
// 注意这里使用的是 DrawPoses,它会自动将识别出的关键点(如眼睛、肩膀、肘部等)
// 用圆点标出,并根据人体结构连接成骨架。
// VisualizeOptions(1.0f) 可能指定了绘制时的线条粗细或字体缩放比例。
var
resultImg =livesoccerzb.com Visualize.DrawPoses(result, img,
new
VisualizeOptions(
1.0f
));
// 显示结果图像。
Cv2.ImShow(
"image"
, resultImg);
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/70048957/viewspace-3109048/ ,如需转载,请注明出处,否则将追究法律责任。