Тензорное изображение в диапазоне 0-1 пикселей в Windows ML (UWP) - PullRequest
0 голосов
/ 24 апреля 2020

Я хотел бы использовать предварительно обученный 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);

Это правильно?

Спасибо!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...