extern alias CoreDrawing; using System.Collections.Generic; using System.IO; using ZeroLevel.ML.DNN.Models; namespace ZeroLevel.ML.DNN.Detectors { internal sealed class Detector : IDetector { private readonly IImageConverter _imageConverter; private readonly IObjectDetector _model; private readonly float _threshold; private readonly bool _invertAxes = false; internal Detector(IObjectDetector model, float threshold, ImageToTensorConversionOptions imageConverterOptions, bool invertAxes = false) { _imageConverter = new ImageConverter(imageConverterOptions); _model = model; _threshold = threshold; _invertAxes = invertAxes; } public FastTensorPool CreateInput(string filePath) { FastTensorPool input; if (_invertAxes) input = _imageConverter.ImageToFastTensorsV2Inverted(filePath); else input = _imageConverter.ImageToFastTensorsV2(filePath); input.Name = Path.GetFileNameWithoutExtension(filePath); input.Path = filePath; return input; } public FastTensorPool CreateInput(CoreDrawing.System.Drawing.Bitmap image, string filePath = null!) { var input = _imageConverter.ImageToFastTensorsV2(image); if (string.IsNullOrWhiteSpace(filePath) == false) { input.Name = Path.GetFileNameWithoutExtension(filePath); input.Path = filePath; } return input; } public List Detect(string filePath) { var input = _imageConverter.ImageToFastTensorsV2(filePath); input.Name = Path.GetFileNameWithoutExtension(filePath); input.Path = filePath; return _model.Predict(input, _threshold); } public List Detect(CoreDrawing.System.Drawing.Bitmap image, string filePath = null!) { var input = _imageConverter.ImageToFastTensorsV2(image); if (string.IsNullOrWhiteSpace(filePath) == false) { input.Name = Path.GetFileNameWithoutExtension(filePath); input.Path = filePath; } return _model.Predict(input, _threshold); } public List Detect(FastTensorPool input) => _model.Predict(input, _threshold); public void Dispose() { _model.Dispose(); } } }