1

我的目标是使用 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);
        }
    }
}
4

1 回答 1

1

我没有使用 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);
于 2020-05-04T07:56:00.317 回答