我目前正在尝试使用https://github.com/AsuharietYgvar/AppleNeuralHash2ONNX/blob/master/nnhash.py将代码从Micrisoft.ML.OnnxRuntime移植到C#。对于图像加载,我使用SixLabors.ImageSharp。
到目前为止,加载onnx会话文件是可行的,但我认为我无法正确地预处理输入图像。原来的代码是这样的:
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])
现在,我很难找到如何转换图像数据数组。到目前为止,我的代码如下:
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构建输入图像张量呢?
发布于 2022-02-18 06:09:18
转置并不是必需的,因为你已经在创建正确形状的致密张量。在python代码中,我们使用一个数组,即360,360,3,并将其转换为1,3,360,360的数组。当您的dotnet代码从行中获取RGB值时,并将这些值直接放入张量。
下面是我们用来做这件事的代码:
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;
}
https://stackoverflow.com/questions/70880362
复制相似问题