public List <Item> Run(Mat frame, int frameIndex, Dictionary <string, bool> occupancy, List <Tuple <string, int[]> > lines, Dictionary <string, int> category)
        {
            // buffer frame
            frameBufferLtDNNYolo.Buffer(frame);

            foreach (string lane in occupancy.Keys)
            {
                if (occupancy[lane]) //object detected by BGS
                {
                    if (frameIndex >= DNNConfig.FRAME_SEARCH_RANGE)
                    {
                        // call yolo for crosscheck
                        int lineID    = Array.IndexOf(occupancy.Keys.ToArray(), lane);
                        int subLineID = lines[lineID].Item2.Length;
                        frameDNNYolo.SetTrackingPoint(new System.Drawing.Point((int)((lines[lineID].Item2[subLineID - 4] + lines[lineID].Item2[subLineID - 2]) / 2),
                                                                               (int)((lines[lineID].Item2[subLineID - 3] + lines[lineID].Item2[subLineID - 1]) / 2))); //only needs to check the last line in each row
                        Mat[]    frameBufferArray = frameBufferLtDNNYolo.ToArray();
                        int      frameIndexYolo   = frameIndex - 1;
                        DateTime start            = DateTime.Now;
                        List <YoloTrackingItem> analyzedTrackingItems = null;

                        while (frameIndex - frameIndexYolo < DNNConfig.FRAME_SEARCH_RANGE)
                        {
                            Console.WriteLine("** Calling Cheap on " + (DNNConfig.FRAME_SEARCH_RANGE - (frameIndex - frameIndexYolo)));
                            Mat    frameYolo = frameBufferArray[DNNConfig.FRAME_SEARCH_RANGE - (frameIndex - frameIndexYolo)];
                            byte[] imgByte   = Utils.Utils.ImageToByteBmp(OpenCvSharp.Extensions.BitmapConverter.ToBitmap(frameYolo));

                            analyzedTrackingItems = frameDNNYolo.Detect(imgByte, category, lineID, System.Drawing.Brushes.Pink, DNNConfig.MIN_SCORE_FOR_LINEBBOX_OVERLAP_LARGE, frameIndexYolo);

                            // object detected by cheap YOLO
                            if (analyzedTrackingItems != null)
                            {
                                List <Item> ltDNNItem = new List <Item>();
                                foreach (YoloTrackingItem yoloTrackingItem in analyzedTrackingItems)
                                {
                                    Item item = Item(yoloTrackingItem);
                                    item.RawImageData  = imgByte;
                                    item.TriggerLine   = lane;
                                    item.TriggerLineID = lineID;
                                    item.Model         = "Cheap";
                                    ltDNNItem.Add(item);

                                    // output cheap YOLO results
                                    string blobName_Cheap = $@"frame-{frameIndex}-Cheap-{yoloTrackingItem.Confidence}.jpg";
                                    string fileName_Cheap = @OutputFolder.OutputFolderLtDNN + blobName_Cheap;
                                    File.WriteAllBytes(fileName_Cheap, yoloTrackingItem.TaggedImageData);
                                    File.WriteAllBytes(@OutputFolder.OutputFolderAll + blobName_Cheap, yoloTrackingItem.TaggedImageData);
                                }
                                return(ltDNNItem);
                            }
                            frameIndexYolo--;
                        }
                    }
                }
            }

            return(null);
        }