/// <summary> /// Finds and classifies detections for all frames in a video. /// </summary> /// <param name="detect_path">Path to detect model file.</param> /// <param name="classify_path">Path to classify model file.</param> /// <param name="roi">Region of interest output from FindVideoRoi.</param> /// <param name="endpoints">Ruler endpoints output from FindVideoRoi.</param> /// <param name="detections">Detections for each frame.</param> /// <param name="scores">Cover and species scores for each detection.</param> static void DetectAndClassify( string detect_path, string classify_path, string vid_path, Rect roi, PointPair endpoints, out VectorVectorDetection detections, out VectorVectorClassification scores) { // Determined by experimentation with GPU having 8GB memory. const int kMaxImg = 32; // Initialize the outputs. detections = new VectorVectorDetection(); scores = new VectorVectorClassification(); // Create and initialize the detector. Detector detector = new Detector(); ErrorCode status = detector.Init(detect_path, 0.5); if (status != ErrorCode.kSuccess) { throw new Exception("Failed to initialize detector!"); } // Create and initialize the classifier. Classifier classifier = new Classifier(); status = classifier.Init(classify_path, 0.5); if (status != ErrorCode.kSuccess) { throw new Exception("Failed to initialize classifier!"); } // Initialize the video reader. VideoReader reader = new VideoReader(); status = reader.Init(vid_path); if (status != ErrorCode.kSuccess) { throw new Exception("Failed to open video!"); } // Iterate through frames. bool vid_end = false; while (true) { // Find detections. VectorVectorDetection dets = new VectorVectorDetection(); VectorImage imgs = new VectorImage(); for (int i = 0; i < kMaxImg; ++i) { Image img = new Image(); status = reader.GetFrame(img); if (status != ErrorCode.kSuccess) { vid_end = true; break; } img = openem.Rectify(img, endpoints); img = openem.Crop(img, roi); imgs.Add(img); status = detector.AddImage(img); if (status != ErrorCode.kSuccess) { throw new Exception("Failed to add frame to detector!"); } } status = detector.Process(dets); if (status != ErrorCode.kSuccess) { throw new Exception("Failed to process detector!"); } for (int i = 0; i < dets.Count; ++i) { } detections.AddRange(dets); for (int i = 0; i < detections.Count; ++i) { } // Classify detections. for (int i = 0; i < dets.Count; ++i) { VectorClassification score_batch = new VectorClassification(); for (int j = 0; j < dets[i].Count; ++j) { Image det_img = openem.GetDetImage(imgs[i], dets[i][j].location); status = classifier.AddImage(det_img); if (status != ErrorCode.kSuccess) { throw new Exception("Failed to add frame to classifier!"); } } status = classifier.Process(score_batch); if (status != ErrorCode.kSuccess) { throw new Exception("Failed to process classifier!"); } scores.Add(score_batch); } if (vid_end) { break; } } }