public List <Item> Run(int frameIndex, List <Item> ltDNNItemList, List <Tuple <string, int[]> > lines, Dictionary <string, int> category, ref long teleCountsHeavyDNN, bool savePictures = false) { if (ltDNNItemList == null) { return(null); } List <Item> ccDNNItem = new List <Item>(); foreach (Item ltDNNItem in ltDNNItemList) { if (ltDNNItem.Confidence >= DNNConfig.CONFIDENCE_THRESHOLD) { ccDNNItem.Add(ltDNNItem); continue; } else { List <Item> analyzedTrackingItems = null; Console.WriteLine("** Calling Heavy DNN **"); analyzedTrackingItems = frameDNNOnnxYolo.Run(Cv2.ImDecode(ltDNNItem.RawImageData, ImreadModes.Color), frameIndex, category, System.Drawing.Brushes.Yellow, ltDNNItem.TriggerLineID, DNNConfig.MIN_SCORE_FOR_LINEBBOX_OVERLAP_LARGE); teleCountsHeavyDNN++; // object detected by heavy YOLO if (analyzedTrackingItems != null) { foreach (Item item in analyzedTrackingItems) { item.RawImageData = ltDNNItem.RawImageData; item.TriggerLine = ltDNNItem.TriggerLine; item.TriggerLineID = ltDNNItem.TriggerLineID; item.Model = "Heavy"; ccDNNItem.Add(item); // output heavy YOLO results if (savePictures) { string blobName_Heavy = $@"frame-{frameIndex}-Heavy-{item.Confidence}.jpg"; string fileName_Heavy = @OutputFolder.OutputFolderCcDNN + blobName_Heavy; File.WriteAllBytes(fileName_Heavy, item.TaggedImageData); File.WriteAllBytes(@OutputFolder.OutputFolderAll + blobName_Heavy, item.TaggedImageData); } return(ccDNNItem); // if we only return the closest object detected by heavy model } } else { Console.WriteLine("** Not detected by Heavy DNN **"); } } } return(ccDNNItem); }
public List <Item> Run(Mat frame, int frameIndex, Dictionary <string, int> counts, List <Tuple <string, int[]> > lines, Dictionary <string, int> category, ref long teleCountsCheapDNN, bool savePictures = false) { // buffer frame frameBufferLtDNNOnnxYolo.Buffer(frame); if (counts_prev.Count != 0) { foreach (string lane in counts.Keys) { int diff = Math.Abs(counts[lane] - counts_prev[lane]); if (diff > 0) //object detected by BGS { if (frameIndex >= DNNConfig.FRAME_SEARCH_RANGE) { // call onnx cheap model for crosscheck int lineID = Array.IndexOf(counts.Keys.ToArray(), lane); Mat[] frameBufferArray = frameBufferLtDNNOnnxYolo.ToArray(); int frameIndexOnnxYolo = frameIndex - 1; List <Item> analyzedTrackingItems = null; while (frameIndex - frameIndexOnnxYolo < DNNConfig.FRAME_SEARCH_RANGE) { Console.WriteLine("** Calling DNN on " + (DNNConfig.FRAME_SEARCH_RANGE - (frameIndex - frameIndexOnnxYolo))); Mat frameOnnx = frameBufferArray[DNNConfig.FRAME_SEARCH_RANGE - (frameIndex - frameIndexOnnxYolo)]; analyzedTrackingItems = frameDNNOnnxYolo.Run(frameOnnx, (DNNConfig.FRAME_SEARCH_RANGE - (frameIndex - frameIndexOnnxYolo)), category, System.Drawing.Brushes.Pink, lineID, DNNConfig.MIN_SCORE_FOR_LINEBBOX_OVERLAP_LARGE); teleCountsCheapDNN++; // object detected by cheap model if (analyzedTrackingItems != null) { List <Item> ltDNNItem = new List <Item>(); foreach (Item item in analyzedTrackingItems) { item.RawImageData = Utils.Utils.ImageToByteBmp(OpenCvSharp.Extensions.BitmapConverter.ToBitmap(frameOnnx)); item.TriggerLine = lane; item.TriggerLineID = lineID; item.Model = "Cheap"; ltDNNItem.Add(item); // output cheap onnx results if (savePictures) { string blobName_Cheap = $@"frame-{frameIndex}-DNN-{item.Confidence}.jpg"; string fileName_Cheap = @OutputFolder.OutputFolderLtDNN + blobName_Cheap; File.WriteAllBytes(fileName_Cheap, item.TaggedImageData); File.WriteAllBytes(@OutputFolder.OutputFolderAll + blobName_Cheap, item.TaggedImageData); } } updateCount(counts); return(ltDNNItem); } frameIndexOnnxYolo--; } } } } } updateCount(counts); return(null); }