首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >DenseTensor在Microsoft.ML.OnnxRuntime中的转换

DenseTensor在Microsoft.ML.OnnxRuntime中的转换
EN

Stack Overflow用户
提问于 2022-01-27 14:32:31
回答 1查看 995关注 0票数 0

我目前正在尝试使用https://github.com/AsuharietYgvar/AppleNeuralHash2ONNX/blob/master/nnhash.py将代码从Micrisoft.ML.OnnxRuntime移植到C#。对于图像加载,我使用SixLabors.ImageSharp。

到目前为止,加载onnx会话文件是可行的,但我认为我无法正确地预处理输入图像。原来的代码是这样的:

代码语言:javascript
运行
复制
image = Image.open(sys.argv[3]).convert('RGB')
image = image.resize([360, 360])
arr = np.array(image).astype(np.float32) / 255.0
arr = arr * 2.0 - 1.0
arr = arr.transpose(2, 0, 1).reshape([1, 3, 360, 360])

现在,我很难找到如何转换图像数据数组。到目前为止,我的代码如下:

代码语言:javascript
运行
复制
img.Mutate(x =>
{
     x.Resize(new ResizeOptions
     {
         Size = new SixLabors.ImageSharp.Size(360, 360),
         Mode = SixLabors.ImageSharp.Processing.ResizeMode.Stretch
     });
});

Tensor<float> arr = new DenseTensor<float>(new int[] { 1, 3, 360, 360 });

for (int y = 0; y < img.Height; y++)
{
    Span<Rgb24> pixelSpan = img.GetPixelRowSpan(y);
    for (int x = 0; x < img.Width; x++)
    {
        arr[0, 0, y, x] = (pixelSpan[x].R / 255f * 2) - 1;
        arr[0, 1, y, x] = (pixelSpan[x].G / 255f * 2) - 1;
        arr[0, 2, y, x] = (pixelSpan[x].B / 255f * 2) - 1;
    }
}

但似乎设置张量的顺序/布局是错误的。问题是,我在transform库中找不到任何类似于原始代码中的最后一行(arr.transpose(2, 0, 1).reshape([1, 3, 360, 360]))的arr.transpose(2, 0, 1).reshape([1, 3, 360, 360])函数。

那么,如何才能正确地为Microsoft.ML.OnnxRuntime构建输入图像张量呢?

EN

回答 1

Stack Overflow用户

发布于 2022-02-18 06:09:18

转置并不是必需的,因为你已经在创建正确形状的致密张量。在python代码中,我们使用一个数组,即360,360,3,并将其转换为1,3,360,360的数组。当您的dotnet代码从行中获取RGB值时,并将这些值直接放入张量。

下面是我们用来做这件事的代码:

代码语言:javascript
运行
复制
public virtual Tensor<float> ConvertImageToTensor(ref List<Image<Rgb48>> images, int[] inputDimension)
{
    inputDimension[0] = images.Count;

    Tensor<float> input = new DenseTensor<float>(inputDimension);
    for (var i = 0; i < images.Count; i++)
    {
        var image = images[i];

        for (var y = 0; y < image.Height; y++)
        {
            var pixelSpan = image.GetPixelRowSpan(y);
            for (var x = 0; x < image.Width; x++)
            {
                input[i, 0, y, x] = pixelSpan[x].R;
                input[i, 1, y, x] = pixelSpan[x].G;
                input[i, 2, y, x] = pixelSpan[x].B;
            }
        }
    }
    return input;
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70880362

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档