private (IEnumerable <string>, IReadOnlyList <float>) Classify(WinMLSamplesGalleryNative.OpenCVImage image) { long start, stop; PerformanceMetricsMonitor.ClearLog(); start = HighResolutionClock.UtcNow(); object input = image.AsTensor(); stop = HighResolutionClock.UtcNow(); var pixelAccessDuration = HighResolutionClock.DurationInMs(start, stop); // Tensorize start = HighResolutionClock.UtcNow(); object tensorizedOutput = input; var tensorizationResults = Evaluate(_tensorizationSession, input); tensorizedOutput = tensorizationResults.Outputs.First().Value; stop = HighResolutionClock.UtcNow(); var tensorizeDuration = HighResolutionClock.DurationInMs(start, stop); // Inference start = HighResolutionClock.UtcNow(); var inferenceResults = Evaluate(_inferenceSession, tensorizedOutput); var inferenceOutput = inferenceResults.Outputs.First().Value; stop = HighResolutionClock.UtcNow(); var inferenceDuration = HighResolutionClock.DurationInMs(start, stop); // PostProcess start = HighResolutionClock.UtcNow(); var postProcessedOutputs = Evaluate(_postProcessingSession, inferenceOutput); var topKValues = (TensorFloat)postProcessedOutputs.Outputs["TopKValues"]; var topKIndices = (TensorInt64Bit)postProcessedOutputs.Outputs["TopKIndices"]; // Return results var probabilities = topKValues.GetAsVectorView(); var indices = topKIndices.GetAsVectorView(); var labels = indices.Select((index) => ClassificationLabels.ImageNet[index]); stop = HighResolutionClock.UtcNow(); var postProcessDuration = HighResolutionClock.DurationInMs(start, stop); PerformanceMetricsMonitor.Log("Pixel Access (CPU)", pixelAccessDuration); PerformanceMetricsMonitor.Log("Tensorize", tensorizeDuration); PerformanceMetricsMonitor.Log("Pre-process", 0); PerformanceMetricsMonitor.Log("Inference", inferenceDuration); PerformanceMetricsMonitor.Log("Post-process", postProcessDuration); return(labels, probabilities); }
private void TryPerformInference(bool reloadImages = true) { if (CurrentImagePath != null) { if (reloadImages) { Original = WinMLSamplesGalleryNative.OpenCVImage.CreateFromPath(CurrentImagePath); Noisy = WinMLSamplesGalleryNative.OpenCVImage.AddSaltAndPepperNoise(Original); Denoised = WinMLSamplesGalleryNative.OpenCVImage.DenoiseMedianBlur(Noisy); var baseImageBitmap = Original.AsSoftwareBitmap(); RenderingHelpers.BindSoftwareBitmapToImageControl(InputImage, baseImageBitmap); RenderingHelpers.BindSoftwareBitmapToImageControl(NoisyImage, Noisy.AsSoftwareBitmap()); RenderingHelpers.BindSoftwareBitmapToImageControl(DenoisedImage, Denoised.AsSoftwareBitmap()); var tensorizationModel = TensorizationModels.CastResizeAndTranspose11(Height, Width, 1, 3, baseImageBitmap.PixelHeight, baseImageBitmap.PixelWidth, "nearest"); _tensorizationSession = CreateLearningModelSession(tensorizationModel, SelectedDeviceKind); } WinMLSamplesGalleryNative.OpenCVImage classificationImage = null; switch (InferenceChoice) { case ClassifyChoice.Original: classificationImage = Original; break; case ClassifyChoice.Noisy: classificationImage = Noisy; break; case ClassifyChoice.Denoised: classificationImage = Denoised; break; } // Classify var(labels, probabilities) = Classify(classificationImage); // Render the classification and probabilities RenderInferenceResults(labels, probabilities); } }