高性能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_info 或 dlcv_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博客