C# 调用 onnx格式的YOLOv11n模型
//推理
var ort_outputs = onnx_session.Run(input_container).ToArray();
float[] data = ort_outputs[0].AsTensor<float>().ToArray(); //从Microsoft.ML.OnnxRuntime.DisposableNamedOnnxValue格式的数据中,提取预测框相关的数据。
得到的data为1维数组。
对YOLOv8、v11,前8400个数值为8400个预测框(边界框)的x坐标的cx,第2组8400个值是预测框的cy,然后是ow和oh;
也就是说,使用
Mat result_data = new Mat(class_names.Length + 4, 8400, MatType.CV_32F, data);
得到的(class_names.Length + 4)* 8400的 result_data的前4行,是边界框坐标相关的数值。
然后使用
result_data = result_data.T();
得到8400 *(class_names.Length + 4)的result_data,其中每一行的前4个数值为边界框坐标相关的数值,后面的class_names.Length(比如coco的80个类的80)个数值是每个类的置信度值(或称为概率值)。
i.e. data[8400*4] 及其之后的数值,才是置信度值,8400*4之前的都是坐标值。
OpenCV 中 Mat 类
Mat mat = new Mat(rows, cols, type, data);
- rows :矩阵行数
- cols :矩阵列数
- type :数据类型,如 MatType.CV_8UC1 , MatType.CV_32FC3 等
type 参数是 Mat 构造函数中最重要的参数之一,表示矩阵中元素的数据类型,格式为
CV_[位数][符号][类型]C[通道数]
常见类型包括:
- CV_8UC1 :8位无符号单通道(灰度图像)
- CV_8UC3 :8位无符号3通道(彩色图像,BGR格式)
- CV_32FC1 :32位浮点型单通道
- CV_32FC3 :32位浮点型3通道