Как изменить размер VideoFrame или ImageFeatureValue, указав размер c в соответствии с требованиями к форме ввода? - PullRequest
1 голос
/ 08 апреля 2020

Моя цель - использовать модель tinyYolov3 для обнаружения объектов в реальном времени с помощью HoloLens. Я хочу включить модель в виде файла ONNX непосредственно в проект и вычислить прогнозы внутри самого HoloLens. Для этого я планирую использовать библиотеки Windows .media и Windows .AI.MachineLearning в качестве конвейера между камерой и моими предсказаниями.

После этого учебника Я могу захватывать кадры как VideoFrame , и я могу конвертировать их в ImageFeatureValue в соответствии с моим требованием типа ввода. Моя проблема сейчас касается требований к форме. Для моделей Yolo требуется кадр размером 3x416x416, и я не могу найти в Интернете никаких документов об изменении размера VideoFrame или ImageFeatureValue.

Большое спасибо за помощь.

using (var frameReference = CameraFrameReader.TryAcquireLatestFrame())
using (var videoFrame = frameReference?.VideoMediaFrame?.GetVideoFrame())
await ModelHelper.EvaluateVideoFrameAsync(videoFrame).ConfigureAwait(false);

public async Task EvaluateVideoFrameAsync(VideoFrame frame)
{
    if (frame != null)
    {
        try
        {
            ModelInput inputData = new ModelInput();
            inputData.image = ImageFeatureValue.CreateFromVideoFrame(frame);
            //TODO: CHANGE SIZE FRAME
            var output = await Model.EvaluateAsync(inputData).ConfigureAwait(false);
        }
    }
}

1 Ответ

0 голосов
/ 04 мая 2020

У меня нет опыта использования Windows API машинного обучения и класса ImageFeatureValue. Но когда я попытался изменить размеры кадров из HoloLens, мне пришлось использовать SoftwareBitmap вместо VideoFrame. Затем я использую BitmapEncoder, чтобы изменить их размер и преобразовать обратно в VideoFrame:

    private async Task<SoftwareBitmap> ResizeBitmap(SoftwareBitmap softwareBitmap, uint width, uint height)
{
    using (InMemoryRandomAccessStream stream = new InMemoryRandomAccessStream())
    {
        BitmapEncoder encoder = await BitmapEncoder.CreateAsync(BitmapEncoder.BmpEncoderId, stream);

        encoder.SetSoftwareBitmap(softwareBitmap);

        encoder.BitmapTransform.ScaledWidth = width;
        encoder.BitmapTransform.ScaledHeight = height;
        encoder.BitmapTransform.InterpolationMode = BitmapInterpolationMode.NearestNeighbor;

        await encoder.FlushAsync();

        BitmapDecoder decoder = await BitmapDecoder.CreateAsync(stream);

        return await decoder.GetSoftwareBitmapAsync(softwareBitmap.BitmapPixelFormat, softwareBitmap.BitmapAlphaMode);
    }
}

var inputBitmap = frameReference.VideoMediaFrame.SoftwareBitmap;
var outputBitmap = ResizeBitmap(inputBitmap, your_width, your_height);

var outputVideoFrame = VideoFrame.CreateWithSoftwareBitmap(SoftwareBitmap);
...