跳到主要内容

高性能SDK套件 - C#接口

软件预览

使用 C#测试程序,可以快速熟悉各个接口的调用,建议先把这个代码拉下来,运行看看效果:

接口概览

C# 接口有以下几个:

namespace dlcv_infer_csharp
{
public class Model : IDisposable
{
public Model();
public Model(string modelPath, int device_id, bool rpc_mode = false, bool enableCache = false);

JObject GetModelInfo();

Utils.CSharpResult Infer(Mat image, JObject params_json = null);
Utils.CSharpResult InferBatch(List<Mat> image_list, JObject params_json = null);

// 返回适合直接序列化/打印的 JSON(mask 会被统一为点集或空对象)
dynamic InferOneOutJson(Mat image, JObject params_json = null);

void FreeModel();
void Dispose();

bool IsDvpMode { get; }
static void ClearModelCache();
}
public partial class Utils
{
public static void FreeAllModels(); // 全局释放(释放 dlcv_infer.dll 中所有已加载模型)
public static JObject GetDeviceInfo(); // 优先 dlcv_get_gpu_info,其次 dlcv_get_device_info
public static JObject GetGpuInfo(); // 直接 NVML(不依赖 dlcv_infer.dll 的导出符号)

public static Utils.CSharpResult OcrInfer(Model detectModel, Model recognizeModel, Mat image);
}
}

加载模型

  • modelPath,模型文件路径
  • device_id,设备id,如果有多张显卡,可以传入此参数,从0开始,设置为-1则是使用CPU推理,仅dvo支持

模式选择(按实际代码自动切换)

Model 会根据模型后缀与参数自动选择推理模式:

  • DVP 模式:后缀为 .dvp,通过 HTTP 后端服务推理(默认 http://127.0.0.1:9890,必要时会自动启动本地后端程序)
  • DVS 模式:后缀为 .dvst / .dvso / .dvsp,使用 DlcvModules.DvsModel 推理
  • RPC 模式:当 rpc_mode=true 且非 DVP/DVS 后缀时,通过本地 AIModelRPC.exe(命名管道 + 共享内存)推理
  • DVT 模式(默认):其余情况走 dlcv_infer.dll 的原生接口(C 接口)

参考代码:

Model model = new Model(selectedFilePath, device_id, rpc_mode: false, enableCache: false);
说明
  • 构造函数内部会完成加载,失败会抛异常。
  • enableCache=true 会按 modelPath 复用已加载的 model_index(主要用于 DVT/DLL 模式的复用场景)。如需清空缓存可调用 Model.ClearModelCache()

获取模型信息

JObject result = model.GetModelInfo();

样例结果:

{
"code": 0,
"message": "Successfully got model info.",
"model_info": {
"category_map": {
"划痕": "划痕",
"斑点": "斑点",
"油污": "油污"
},
"classes": [
"划痕",
"斑点",
"油污"
],
"in_channels": 3,
"num_classes": 3,
"task_type": "实例分割"
}
}

推理结果

模型推理输入的格式是 OpenCV 的 Mat,通道顺序是 RGB

注意

Cv2.ImRead 读出来默认是 BGR,需要自行转换为 RGB 再推理(否则结果会异常):

Mat bgr = Cv2.ImRead(imagePath);
Mat rgb = new Mat();
Cv2.CvtColor(bgr, rgb, ColorConversionCodes.BGR2RGB);

Utils.CSharpResult result = model.Infer(rgb);

如果相机直接获取到 RGB 格式的图像,则可以直接输入到模型中:

Utils.CSharpResult result = model.Infer(image);

推理结果的格式:

public struct CSharpObjectResult
{
public CSharpObjectResult(
int categoryId, string categoryName, float score, float area,
List<double> bbox, bool withMask, Mat mask,
bool withBbox = false, bool withAngle = false, float angle = -100);

public int CategoryId { get; set; }
public string CategoryName { get; set; }
public float Score { get; set; }
public float Area { get; set; }

public bool WithBbox { get; set; }
public List<double> Bbox { get; set; }
public bool WithMask { get; set; }
public Mat Mask { get; set; }

public bool WithAngle { get; set; }
public float Angle { get; set; }
}
public struct CSharpSampleResult
{
public CSharpSampleResult(List<CSharpObjectResult> results);

public List<CSharpObjectResult> Results { get; set; }
}
public struct CSharpResult
{
public CSharpResult(List<CSharpSampleResult> sampleResults);

public List<CSharpSampleResult> SampleResults { get; set; }
}
  • CSharpResult 表示本次推理的结果,可以是n张图的结果,存储在 sampleResults 中
  • CSharpSampleResult 表示某一张图的推理结果,结果可以有多个检测框,每个检测结果存储在 Results 中
  • 每个 CSharpObjectResult 表示一个类的结果,有类型、分数、面积、检测框、Mask结果等类型
    • CategoryId,类别索引
    • CategoryName,类别名称
    • Score,置信度分数
    • Area,面积
    • WithBbox,是否包含检测框
    • Bbox,检测框:
      • 常见为 [x, y, w, h](左上角 + 宽高)
      • 旋转框可能为 [cx, cy, w, h, angle](中心点 + 宽高 + 角度,弧度制)
    • WithMask / Mask,检测框内的 mask 矩阵(0/255),尺寸通常与 bbox 的宽高一致
    • WithAngle / Angle,是否包含角度信息(弧度制);非旋转框一般为 -100

关于模型的类型和任务类型,有以下几种:

  • 实例分割、语义分割,所有结果都有
  • 目标检测,没有mask,没有面积,有检测框和类别
  • 分类,只有类别和分数

获取显卡信息

优先推荐使用 Utils.GetDeviceInfo()(会自动选择 dlcv_get_gpu_infodlcv_get_device_info):

JObject device_info = Utils.GetDeviceInfo();

返回结果样例:

{
"code": 0,
"devices": [
{
"device_id": 0,
"device_name": "NVIDIA GeForce RTX 4090"
},
{
"device_id": 1,
"device_name": "NVIDIA GeForce GTX 1050"
}
]
}

常见问题

在证书存储区中找不到清单签名证书

解决办法:右击项目属性—>签名—>为ClickOnce清单签名,将勾掉的选项去掉

参考链接: 解决Visual Studio编译错误:在证书存储区中找不到清单签名证书_vs在证书存储区中找不到清单签名证书-CSDN博客