C# 使用 Yolov5 模型识别物品

@zgcwkj  2023年08月20日

分类:

网站 代码 

C# 使用 ONNX 格式的模型,完成 AI 识别(机器学习笔记

模型查看

  1. Netron

模型输入(图片转张量)

/// <summary>
/// 计算张量(RRRR GGGG BBBB)
/// </summary>
/// <param name="source">图像</param>
/// <returns></returns>
public static Tensor<float> FastToOnnxTensor(SKBitmap source)
{
    var tensorShape = new int[] { 1, 3, source.Height, source.Width };
    var tensor = new DenseTensor<float>(tensorShape);

    for (int y = 0; y < source.Height; y++)
    {
        for (int x = 0; x < source.Width; x++)
        {
            var pixel = source.GetPixel(x, y);
            tensor[0, 0, y, x] = pixel.Red / 255f; // R
            tensor[0, 1, y, x] = pixel.Green / 255f; // G
            tensor[0, 2, y, x] = pixel.Blue / 255f; // B
        }
    }

    return tensor;
}

模型输出(张量计算坐标)

/// <summary>
/// 解析结果
/// </summary>
/// <param name="results">计算后的张量</param>
/// <returns></returns>
private List<Prediction> ParseResults(float[] results)
{
    //边界框长度
    int confidenceIndex = 4;
    //置信度长度
    int labelStartIndex = 5;
    //标签数量
    int labelLength = _YoloLabes.Length;
    //每个分区长度
    int dimensions = labelLength + 5;
    //分区数量
    int rows = results.Length / dimensions;
    //
    var detections = new List<Prediction>();
    for (int i = 0; i < rows; ++i)
    {
        var index = i * dimensions;
        //不要置信度低的
        if (results[index + confidenceIndex] <= 0.4f) continue;
        //对每个预测类别的置信度进行缩放
        for (int j = labelStartIndex; j < dimensions; ++j)
        {
            results[index + j] = results[index + j] * results[index + confidenceIndex];
        }
        //分析每个预测类别
        for (int k = labelStartIndex; k < dimensions; ++k)
        {
            //不要过低的预测类别
            if (results[index + k] <= 0.5f) continue;

            var value_0 = results[index];
            var value_1 = results[index + 1];
            var value_2 = results[index + 2];
            var value_3 = results[index + 3];

            var bbox = new BBox(
                (value_0 - value_2 / 2) / _YoloWidth,
                (value_1 - value_3 / 2) / _YoloWidth,
                (value_0 + value_2 / 2) / _YoloHeight,
                (value_1 + value_3 / 2) / _YoloHeight);

            var l_index = k - labelStartIndex;
            detections.Add(new Prediction()
            {
                Box = bbox,
                Confidence = results[index + k],
                LabelIndex = l_index,
                LabelName = _YoloLabes[l_index]
            });
        }
    }

    return Prediction.NMS(detections);
}

示例项目

  1. 源码:AiYoloV5Onnx.7z
    内容已隐藏,需要评论并且审核通过后,才能阅读隐藏内容


评论已关闭

Top