Я хотел бы использовать предварительно обученный Mobil eNet, который ожидает изображения в диапазоне пикселей 0-1 с Windows ML в приложении UWP.
проблема в том, что ImageFeatureValue поддерживает только диапазон 0-255.
Поэтому мне нужна замена ImageFeatureValue, которая также может изменять размеры изображений, но способна использовать диапазон пикселей 0-1.
Я нашел такой подход на GitHub :
{
SoftwareBitmap bitmapBuffer = new SoftwareBitmap(BitmapPixelFormat.Bgra8, 224, 224, BitmapAlphaMode.Ignore))
VideoFrame buffer = VideoFrame.CreateWithSoftwareBitmap(bitmapBuffer))
await inputFrame.CopyToAsync(buffer);
SoftwareBitmap resizedBitmap = buffer.SoftwareBitmap;
WriteableBitmap innerBitmap = new WriteableBitmap(resizedBitmap.PixelWidth, resizedBitmap.PixelHeight);
resizedBitmap.CopyToBuffer(innerBitmap.PixelBuffer);
int[] pixels = innerBitmap.GetBitmapContext().Pixels;
float[] array = NormalizeImage(pixels);
}
private float[] NormalizeImage(int[] src)
{
var normalized = new float[src.Length * 3];
for (int i = 0; i < src.Length; i++)
{
var val = src[i];
normalized[i * 3 + 0] = (float)(val & 0xFF) / (float)255;
normalized[i * 3 + 1] = (float)((val >> 8) & 0xFF) / (float)255;
normalized[i * 3 + 2] = (float)((val >> 16) & 0xFF) / (float)255;
}
return normalized;
}
Проблема в том, что WritableBitmap не предлагает GetBitmapContext (). Пиксели в приложениях UWP (только в. NET).
Я не нашел другого способа преобразовать SoftwareBitmap / WritableBitmap в массив пикселей.
Как я мог бы сделать sh это?
Я думаю, TensorFoat может быть создан из массива следующим образом:
long[] shape = {1, 3, 224, 224};
TensorFloat tf = TensorFloat.CreateFromArray(shape, array);
Это правильно?
Спасибо!