static void Main(string[] args) { var mL = new MLContext(); try { IEnumerable <ImageNetData> images = ImageNetData.ReadFromFile(imagesFolder); IDataView imageDataView = mL.Data.LoadFromEnumerable(images); var modelScorer = new OnnxModelScorer(imagesFolder, modelPath, mL); IEnumerable <float[]> probabilities = modelScorer.Score(imageDataView); YoloOutputParser parser = new YoloOutputParser(); var boundingBoxes = probabilities .Select(x => parser.ParseOutputs(x)) .Select(x => parser.FilterBoundingBoxes(x, 5, .5f)); for (var i = 0; i < images.Count(); i++) { string imageFileName = images.ElementAt(i).Label; IList <YoloBoundingBox> detectedObjects = boundingBoxes.ElementAt(i); DrawBoundingBox(imagesFolder, outputFolder, imageFileName, detectedObjects); LogDetectedObjects(imageFileName, detectedObjects); } } catch (Exception ex) { Console.WriteLine(ex.ToString()); } }
public static List <(string ImageFilename, List <(string Label, float Score)> TagList)> GetObjectList(string imagesFolder, string modelFilePath) { List <(string ImageFilename, List <(string Label, float Score)> TagList)> result = new List <(string ImageFilename, List <(string Label, float Score)> TagList)>(); MLContext mlContext = new MLContext(); IEnumerable <ImageNetData> images = ImageNetData.ReadFromFile(imagesFolder); IDataView imageDataView = mlContext.Data.LoadFromEnumerable(images); var modelScorer = new OnnxModelScorer(imagesFolder, modelFilePath, mlContext); // Use model to score data IEnumerable <float[]> probabilities = modelScorer.Score(imageDataView); YoloOutputParser parser = new YoloOutputParser(); var boundingBoxes = probabilities .Select(probability => parser.ParseOutputs(probability)) .Select(boxes => parser.FilterBoundingBoxes(boxes, 5, .5F)); for (var i = 0; i < images.Count(); i++) { string imageFileName = images.ElementAt(i).Label; IList <YoloBoundingBox> detectedObjects = boundingBoxes.ElementAt(i); result.Add((imageFileName, ExtractDetectedObjects(detectedObjects))); } return(result); }
public static IList <BoundingBox> ObtainBoundingBoxes(string base64Image) { var opencvImage = Image.ConvertFromBase64ToMat(base64Image); var tensor = new DenseTensor <float>(new int[] { channels, opencvImage.Height, opencvImage.Width }); using (var mat = new MatOfByte3(opencvImage)) { var indexer = mat.GetIndexer(); for (int y = 0; y < opencvImage.Height; y++) { for (int x = 0; x < opencvImage.Width; x++) { Vec3b color = indexer[y, x]; tensor[0, y, x] = (float)color.Item2; tensor[1, y, x] = (float)color.Item1; tensor[2, y, x] = (float)color.Item0; } } } var transform = tensor.Reshape(new ReadOnlySpan <int>(new[] { channels *opencvImage.Height *opencvImage.Width })); var yoloParser = new YoloOutputParser(); var yoloModel = YoloModel.Instance; var results = yoloModel.Evaluate(new[] { transform }); return(yoloParser.ParseOutputs(results.First().ToArray())); }
public IDictionary <string, IList <YoloBoundingBox> > DetectObjectsFromImages(List <string> imageFilePaths, string uploadFolderPath, string outputFolderPath) { MLContext mlContext = new MLContext(); IDictionary <string, IList <YoloBoundingBox> > detectedObjectsDict = new Dictionary <string, IList <YoloBoundingBox> >(); try { IEnumerable <ImageNetData> images = ImageNetData.ReadFromFiles(imageFilePaths); IDataView imageDataView = mlContext.Data.LoadFromEnumerable(images); var modelScorer = new OnnxModelScorer(this.modelFilePath, mlContext); YoloOutputParser parser = new YoloOutputParser(); IEnumerable <float[]> probabilities = modelScorer.Score(imageDataView); // Use model to score data var boundingBoxes = probabilities .Select(probability => parser.ParseOutputs(probability)) .Select(boxes => parser.FilterBoundingBoxes(boxes, 5, .7F)); for (var i = 0; i < images.Count(); i++) { string imageFileName = images.ElementAt(i).Label; string imageFilePath = images.ElementAt(i).ImagePath; IList <YoloBoundingBox> detectedObjects = boundingBoxes.ElementAt(i); detectedObjectsDict.Add(imageFilePath, detectedObjects); DrawBoundingBox(imageFilePath, outputFolderPath, imageFileName, detectedObjects); } return(detectedObjectsDict); } catch { throw; } }
public JsonResult CheckImage() { string isPersonOnImage = "no"; var file = Request.Files[0]; var currentPath = System.Web.Hosting.HostingEnvironment.ApplicationPhysicalPath; var modelFilePath = currentPath + @"\Content\Model\TinyYolo2_model.onnx"; //var modelFilePath = @"C:\Users\Ragnus\Desktop\120819\praca\Thesis\Thesis\Content\Model\TinyYolo2_model.onnx"; var sourceImage = Image.FromStream(file.InputStream); var fileExt = Path.GetExtension(file.FileName); var filename = Guid.NewGuid() + fileExt; // Unikalny identyfikator + rozszerzenie var outputFolder = currentPath + @"\Content\ImageToReturn\"; //var outputFolder = @"C:\Users\Ragnus\Desktop\120819\praca\Thesis\Thesis\Content\ImageToReturn\"; var path = Path.Combine(Server.MapPath(AppConfig.ImagesUserFolder), filename); sourceImage.Save(path); MLContext mlContext = new MLContext(); IEnumerable <ImageNetData> images = ImageNetData.ReadFrom1File(path); IDataView imageDataView = mlContext.Data.LoadFromEnumerable(images); var modelScorer = new OnnxModelScorer(path, modelFilePath, mlContext); IEnumerable <float[]> probabilities = modelScorer.Score(imageDataView); YoloOutputParser parser = new YoloOutputParser(); var boundingBoxes = probabilities .Select(probability => parser.ParseOutputs(probability)) .Select(boxes => parser.FilterBoundingBoxes(boxes, 5, .5F)); // Draw bounding boxes for detected objects in each of the images for (var i = 0; i < images.Count(); i++) { string imageFileName = images.ElementAt(i).Label; IList <YoloBoundingBox> detectedObjects = boundingBoxes.ElementAt(i); if (detectedObjects.Count > 0 && detectedObjects[0].Label == "person") { isPersonOnImage = "yes"; } DrawBoundingBox(path, outputFolder, imageFileName, detectedObjects); LogDetectedObjects(imageFileName, detectedObjects); } var img = Image.FromFile(outputFolder + filename); System.GC.Collect(); System.GC.WaitForPendingFinalizers(); System.IO.File.Delete(path); img.Dispose(); System.IO.File.Delete(outputFolder + filename); return(Json(new { isPerson = isPersonOnImage } , JsonRequestBehavior.AllowGet)); }
public static void Main() { var assetsRelativePath = @"../../../assets"; string assetsPath = GetAbsolutePath(assetsRelativePath); var modelFilePath = Path.Combine(assetsPath, "Model", "TinyYolo2_model.onnx"); var imagesFolder = Path.Combine(assetsPath, "images"); var outputFolder = Path.Combine(assetsPath, "images", "output"); // Initialize MLContext MLContext mlContext = new MLContext(); try { // Load Data IEnumerable <ImageNetData> images = ImageNetData.ReadFromFile(imagesFolder); IDataView imageDataView = mlContext.Data.LoadFromEnumerable(images); // Create instance of model scorer var modelScorer = new OnnxModelScorer(imagesFolder, modelFilePath, mlContext); // Use model to score data IEnumerable <float[]> probabilities = modelScorer.Score(imageDataView) .ToList(); // remove!!! // Post-process model output YoloOutputParser parser = new YoloOutputParser(); var boundingBoxes = probabilities .Select(probability => parser.ParseOutputs(probability)) .Select(boxes => parser.FilterBoundingBoxes(boxes, 5, .5F)) .ToList(); // remove!!! // Draw bounding boxes for detected objects in each of the images for (var i = 0; i < images.Count(); i++) { string imageFileName = images.ElementAt(i).Label; IList <YoloBoundingBox> detectedObjects = boundingBoxes.ElementAt(i); DrawBoundingBox(imagesFolder, outputFolder, imageFileName, detectedObjects); LogDetectedObjects(imageFileName, detectedObjects); } } catch (Exception ex) { Console.WriteLine(ex.ToString()); } Console.WriteLine("========= End of Process..Hit any Key ========"); Console.ReadLine(); }
public string Detect() { List <DetectionResult> result = new List <DetectionResult>(); // Initialize MLContext MLContext mlContext = new MLContext(); try { // Load Data IEnumerable <ImageNetData> images = ImageNetData.ReadFromFile(_imagesFolder); IDataView imageDataView = mlContext.Data.LoadFromEnumerable(images); // Create instance of model scorer var modelScorer = new OnnxModelScorer(_imagesFolder, _modelFilePath, mlContext); // Use model to score data IEnumerable <float[]> probabilities = modelScorer.Score(imageDataView); // Post-process model output YoloOutputParser parser = new YoloOutputParser(); var boundingBoxes = probabilities .Select(probability => parser.ParseOutputs(probability)) .Select(boxes => parser.FilterBoundingBoxes(boxes, 5, .5F)); // Draw bounding boxes for detected objects in each of the images for (var i = 0; i < images.Count(); i++) { string imageFileName = images.ElementAt(i).Label; IList <YoloBoundingBox> detectedObjects = boundingBoxes.ElementAt(i); DrawBoundingBox(_imagesFolder, _outputFolder, imageFileName, detectedObjects); DetectionResult detectionResult = new DetectionResult(imageFileName); foreach (var detObject in detectedObjects) { detectionResult.DetectedObjects.Add(new DetectedObjects(detObject.Label, detObject.Confidence)); } LogDetectedObjects(imageFileName, detectedObjects); result.Add(detectionResult); } return(JsonConvert.SerializeObject(result)); } catch (Exception ex) { Console.WriteLine(ex.ToString()); return(null); } }
static void Main(string[] args) { Console.WriteLine("Hello World!"); var assetsRelativePath = @"../../../assets"; string assetsPath = GetAbsolutePath(assetsRelativePath); var modelFilePath = Path.Combine(assetsPath, "Model", "TinyYolo2_model.onnx"); var imagesFolder = Path.Combine(assetsPath, "images"); var outputFolder = Path.Combine(assetsPath, "images", "output"); //Create the Machine Learning context MLContext mlContext = new MLContext(); try { //Load the data into an IDataView IEnumerable <ImageNetData> images = ImageNetData.ReadFromFile(imagesFolder); IDataView imageDataView = mlContext.Data.LoadFromEnumerable(images); //Score the model var modelScorer = new OnnxModelScorer(imagesFolder, modelFilePath, mlContext); // Use model to score data IEnumerable <float[]> probabilities = modelScorer.Score(imageDataView); //Post-processing - understanding the results YoloOutputParser parser = new YoloOutputParser(); var boundingBoxes = probabilities .Select(probability => parser.ParseOutputs(probability)) .Select(boxes => parser.FilterBoundingBoxes(boxes, 5, .5F)); for (var i = 0; i < images.Count(); i++) { string imageFileName = images.ElementAt(i).Label; IList <YoloBoundingBox> detectedObjects = boundingBoxes.ElementAt(i); DrawBoundingBox(imagesFolder, outputFolder, imageFileName, detectedObjects); LogDetectedObjects(imageFileName, detectedObjects); } } catch (Exception ex) { Console.WriteLine(ex.ToString()); } Console.WriteLine("========= End of Process..Hit any Key ========"); Console.ReadLine(); }
public List <List <Predict> > Pipe(string imgPath, IWebHostEnvironment _env) { string assetsPath = GetAbsolutePath("assets"); var modelFilePath = Path.Combine(assetsPath, "Model", "Model.onnx"); var absolutePath = Path.Combine(_env.WebRootPath, "assets", imgPath); var imagesFolder = Path.Combine(assetsPath, "images"); var outputFolder = Path.Combine(assetsPath, "images", "output"); var predicted = new List <List <Predict> >(); MLContext mlContext = new MLContext(); try { ImageNetData[] img = new ImageNetData[] { new ImageNetData { ImagePath = absolutePath, Label = imgPath } }; IEnumerable <ImageNetData> images = ImageNetData.ReadFromFile(imagesFolder); IDataView imageDataView = mlContext.Data.LoadFromEnumerable(img); var modelScorer = new OnnxModelScorer(imagesFolder, modelFilePath, mlContext); // Use model to score data IEnumerable <float[]> probabilities = modelScorer.Score(imageDataView); YoloOutputParser parser = new YoloOutputParser(); var boundingBoxes = probabilities .Select(probability => parser.ParseOutputs(probability)) .Select(boxes => parser.FilterBoundingBoxes(boxes, 5, .5F)); for (var i = 0; i < images.Count(); i++) { string imageFileName = images.ElementAt(i).Label; IList <YoloBoundingBox> detectedObjects = boundingBoxes.ElementAt(i); //DrawBoundingBox(imagesFolder, outputFolder, imageFileName, detectedObjects); predicted.Add(LogDetectedObjects(imageFileName, detectedObjects)); } } catch (Exception ex) { Console.WriteLine(ex.ToString()); } Console.WriteLine("========= End of Process..Hit any Key ========"); //Console.ReadLine(); return(predicted); }
public List <string> GenerateAnalysis(string guidName) { List <string> stringsToReturn = new List <string>(); var assetsRelativePath = @"../../../../DemoMLNet.Task.ObjectDetection.Console/assets"; string assetsPath = ProgramService.GetAbsolutePath(assetsRelativePath); var modelFilePath = Path.Combine(assetsPath, "Model", "TinyYolo2_model.onnx"); var imagesFolder = Path.Combine(assetsPath, "images"); var outputFolder = Path.Combine(assetsPath, "images", "output"); MLContext mlContext = new MLContext(); try { IEnumerable <ImageNetData> images = ImageNetData.ReadFromFile(imagesFolder); IDataView imageDataView = mlContext.Data.LoadFromEnumerable(images); var modelScorer = new OnnxModelScorer(imagesFolder, modelFilePath, mlContext); // Use model to score data IEnumerable <float[]> probabilities = modelScorer.Score(imageDataView); YoloOutputParser parser = new YoloOutputParser(); var boundingBoxes = probabilities .Select(probability => parser.ParseOutputs(probability)) .Select(boxes => parser.FilterBoundingBoxes(boxes, 5, .5F)); for (var i = 0; i < images.Count(); i++) { if (images.ElementAt(i).Label == guidName + ".jpg") { string imageFileName = images.ElementAt(i).Label; IList <YoloBoundingBox> detectedObjects = boundingBoxes.ElementAt(i); ProgramService.DrawBoundingBox(imagesFolder, outputFolder, imageFileName, detectedObjects); stringsToReturn = ProgramService.LogDetectedObjects(imageFileName, detectedObjects); } //Console.WriteLine("========= End of Process..Hit any Key ========"); } } catch (Exception ex) { Console.WriteLine(ex.ToString()); } return(stringsToReturn); }
static void Main(string[] args) { try { var relativePath = @"../../../assets"; var filehelper = new FileHelper(relativePath); var images = ImageNetData.ReadFromFile(filehelper.ImagesFolder); var mlContext = new MLContext(); // Загруэаем данные var imageDataView = mlContext.Data.LoadFromEnumerable(images); // Создаем экземпляр OnnxModelScorer и используем его для оценки загруженных данных var modelScorer = new OnnxModelScorer(filehelper.ImagesFolder, filehelper.ModelFilePath, mlContext); var probabilities = modelScorer.Score(imageDataView); // Создаем экземпляр YoloOutputParser и используем его для обработки выходных данных модели YoloOutputParser parser = new YoloOutputParser(); var boundingBoxes = probabilities.Select(probability => parser.ParseOutputs(probability)) .Select(boxes => parser.FilterBoundingBoxes(boxes, 5, .5F)); for (var i = 0; i < images.Count(); i++) { string imageFileName = images.ElementAt(i).Label; var detectedObjects = boundingBoxes.ElementAt(i); var imageWithLabels = ImageHelper.DrawBoundingBox(filehelper.ImagesFolder, filehelper.OutputFolder, imageFileName, detectedObjects); if (!Directory.Exists(filehelper.OutputFolder)) { Directory.CreateDirectory(filehelper.OutputFolder); } imageWithLabels.Save(Path.Combine(filehelper.OutputFolder, imageFileName)); LogDetectedObjects(imageFileName, detectedObjects); } } catch (Exception ex) { Console.WriteLine(ex.ToString()); } Console.WriteLine("========= End of Process..Hit any Key ========"); Console.ReadLine(); }
public byte[] Classify(string imagePath, string imageName) { var modelFilePath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "..\\..\\..", "assets", "Model", "TinyYolo2_model.onnx"); MLContext mlContext = new MLContext(); try { // Load Data ImageNetData data = new ImageNetData() { ImagePath = Path.Combine(imagePath, imageName), Label = imageName }; IEnumerable <ImageNetData> image = new List <ImageNetData>() { data }; IDataView imageDataView = mlContext.Data.LoadFromEnumerable(image); // Create instance of model scorer var modelScorer = new OnnxModelScorer(modelFilePath, mlContext); // Use model to score data IEnumerable <float[]> probabilities = modelScorer.Score(imageDataView); // Post-process model output YoloOutputParser parser = new YoloOutputParser(); var boundingBoxes = probabilities .Select(probability => parser.ParseOutputs(probability)) .Select(boxes => parser.FilterBoundingBoxes(boxes, 5, .5F)).First(); // Draw bounding boxes for detected objects in each of the images IList <YoloBoundingBox> detectedObjects = boundingBoxes; return(DrawBoundingBox(imagePath, imageName, detectedObjects)); } catch (Exception) { return(null); //TODO } }
internal static void Start() { //var assetsRelativePath = @"../../../assets"; //string assetsPath = GetAbsolutePath(assetsRelativePath); var modelFilePath = Path.Combine(projectDirectory, "Model", "TinyYolo2_model.onnx"); var imagesFolder = Path.Combine(projectDirectory, "images"); var outputFolder = Path.Combine(projectDirectory, "images", "output"); MLContext mlContext = new MLContext(); try { IEnumerable <ImageNetData> images = ImageNetData.ReadFromFile(imagesFolder); IDataView imageDataView = mlContext.Data.LoadFromEnumerable(images); //Затем создайте экземпляр OnnxModelScorer и используйте его для оценки загруженных данных. var modelScorer = new OnnxModelScorer(imagesFolder, modelFilePath, mlContext); // Use model to score data IEnumerable <float[]> probabilities = modelScorer.Score(imageDataView); /* * Теперь пора выполнить шаг постобработки. Создайте экземпляр YoloOutputParser и используйте его для обработки выходных данных модели. */ YoloOutputParser parser = new YoloOutputParser(); var boundingBoxes = probabilities .Select(probability => parser.ParseOutputs(probability)) .Select(boxes => parser.FilterBoundingBoxes(boxes, 5, .5F)); for (var i = 0; i < images.Count(); i++) { string imageFileName = images.ElementAt(i).Label; IList <YoloBoundingBox> detectedObjects = boundingBoxes.ElementAt(i); DrawBoundingBox(imagesFolder, outputFolder, imageFileName, detectedObjects); LogDetectedObjects(imageFileName, detectedObjects); } } catch (Exception ex) { Console.WriteLine(ex.ToString()); } }
public void TestYoloOutputParserCorrectlyNamesCat() { var cat_jpg = File.ReadAllBytes("assets/001-cat.jpg"); var result = scorer.Score(new[] { cat_jpg }); Assert.NotNull(result); YoloOutputParser parser = new YoloOutputParser(); var boundingBoxes = result .Select(probability => parser.ParseOutputs(probability)) .Select(boxes => parser.FilterBoundingBoxes(boxes, 5, .5F)); Assert.NotNull(boundingBoxes); var first_setOfBoxes = boundingBoxes.First(); Assert.NotNull(first_setOfBoxes); Assert.AreEqual(first_setOfBoxes[0].Label, "cat"); }
public byte[] Predict(string fileName) { var imageDataView = MlContext.Data.LoadFromEnumerable(new List <ImageDataInputItem> { new ImageDataInputItem { ImagePath = fileName } }); var scoredData = _model.Transform(imageDataView); var probabilities = scoredData.GetColumn <float[]>(TinyYoloModelSettings.ModelOutput); var parser = new YoloOutputParser(); var boundingBoxes = probabilities .Select(probability => parser.ParseOutputs(probability)) .Select(boxes => parser.FilterBoundingBoxes(boxes, 5, .5F)); return(DrawBoundingBox(fileName, boundingBoxes.FirstOrDefault())); }
static void Main(string[] args) { var assetsRelativePath = @"../../../assets"; string assetsPath = GetAbsolutePath(assetsRelativePath); var modelFilePath = Path.Combine(assetsPath, "Model", "TinyYolo2_model.onnx"); var imagesFolder = Path.Combine(assetsPath, "images"); var outputFolder = Path.Combine(assetsPath, "images", "output"); MLContext mlContext = new MLContext(); try { IEnumerable <ImageNetData> images = ImageNetData.ReadFromFile(imagesFolder); IDataView imageDataView = mlContext.Data.LoadFromEnumerable(images); var modelScorer = new OnnxModelScorer(imagesFolder, modelFilePath, mlContext); YoloOutputParser parser = new YoloOutputParser(); IEnumerable <float[]> probabilities = modelScorer.Score(imageDataView); var boundingBoxes = probabilities .Select(probability => parser.ParseOutputs(probability)) .Select(boxes => parser.FilterBoundingBoxes(boxes, 5, .5F)); for (var i = 0; i < images.Count(); i++) { string imageFileName = images.ElementAt(i).Label; IList <YoloBoundingBox> detectedObjects = boundingBoxes.ElementAt(i); DrawBoundingBox(imagesFolder, outputFolder, imageFileName, detectedObjects); LogDetectedObjects(imageFileName, detectedObjects); } } catch (Exception ex) { Console.WriteLine(ex.ToString()); } Console.WriteLine("Does it work? ... Hit Any Key ======"); Console.ReadLine(); }
public CameraFrameProcessingResult Process(byte[] image) { if (image == null || image.Length == 0) { return(null); } try { // This is a list of float arrays, one per image. // We are set up to only process 1 image at a time. IEnumerable <float[]> probabilities = scorer.Score(new[] { image }); // This is the minimum confidence we consider returning for any bounding box. var thresholdConfidence = 0.5f; YoloOutputParser parser = new YoloOutputParser(); var boundingBoxSets = probabilities .Select(probability => parser.ParseOutputs(probability)) .Select(boxes => parser.FilterBoundingBoxes(boxes, 10, thresholdConfidence)); FramesProcessed++; return(new CameraFrameProcessingResult() { Processor = this, // the processor that generated this result. Image = image, // the original image for reference. Boxes = boundingBoxSets.First() // bounding boxes for the first (only) image. }); } catch (Exception ex) { Console.WriteLine(ex.ToString()); return(null); } }
private void btnStart_Click(object sender, EventArgs e) { // Frame image buffer Mat image = new Mat(); _isRunning = true; btnStart.Enabled = false; var mlContext = new MLContext(); // Create instance of model scorer var modelScorer = new OnnxModelScorer(modelFilePath, mlContext); // Load model only once var model = modelScorer.LoadModel(); while (_isRunning) { _capture.Read(image); // read frame from webcam if (image.Empty()) { break; } // Store frame as in-memory source for ML.NET ImageNetData[] inMemoryCollection = new ImageNetData[] { new ImageNetData { InputImage = OpenCvSharp.Extensions.BitmapConverter.ToBitmap(image), Label = "", } }; var imageDataView = mlContext.Data.LoadFromEnumerable <ImageNetData>(inMemoryCollection); // Make another copy of the frame. We will use it to draw bounding boxes on it _mySharpImage = (Image)OpenCvSharp.Extensions.BitmapConverter.ToBitmap(image); // Use model to score data IEnumerable <float[]> probabilities = modelScorer.Score(model, imageDataView); // Post-process model output YoloOutputParser parser = new YoloOutputParser(); var boundingBoxes = probabilities .Select(probability => parser.ParseOutputs(probability)) .Select(boxes => parser.FilterBoundingBoxes(boxes, 5, .5F)); // Since we only have a single frame, it is OK to have i = 0. Otherwise we would need // to iterate through images. var i = 0; IList <YoloBoundingBox> detectedObjects = boundingBoxes.ElementAt(i); DrawBoundingBox(ref _mySharpImage, detectedObjects); pictureBox1.SizeMode = PictureBoxSizeMode.StretchImage; pictureBox1.Image = _mySharpImage; Cv2.WaitKey(1); _mySharpImage.Dispose(); inMemoryCollection[0].InputImage.Dispose(); } btnStart.Enabled = true; }
public RecognitionStage(ObjectRecognizer objectRecognizer, YoloOutputParser outputParser) { _objectRecognizer = objectRecognizer ?? throw new ArgumentNullException(nameof(objectRecognizer)); _outputParser = outputParser ?? throw new ArgumentNullException(nameof(outputParser)); }