public async Task <IEnumerable <ImageClassification> > Evalute(CoreMlInput source) { var tcs = new TaskCompletionSource <IEnumerable <ImageClassification> >(); var request = new VNCoreMLRequest(_model, (response, e) => { if (e != null) { tcs.SetException(new NSErrorException(e)); } else { var results = response.GetResults <VNClassificationObservation>(); tcs.SetResult(results.Select(r => new ImageClassification(r.Identifier, r.Confidence)).ToList()); } }); // Pre-process image (scale down) var buffer = source.Image.ToCVPixelBuffer(_targetImageSize); var requestHandler = new VNImageRequestHandler(buffer, new NSDictionary()); requestHandler.Perform(new[] { request }, out NSError error); var classifications = await tcs.Task; if (error != null) { throw new NSErrorException(error); } return(classifications); }
public async Task <IReadOnlyList <ImageClassification> > ClassifyImage(byte[] image) { if (!IsInitialized) { await Init(); } try { var input = CoreMlInput.CreateFrom(image); var results = await coreMlModel.Evalute(input); return(results .Where(p => p.Probability > 0.85) .ToList()); } catch (Exception ex) { throw new ImageClassifierException("Failed to classify image - check the inner exception for more details", ex); } }