C#在工業(yè)上軟件開發(fā)使用很多羡宙,但是如果要做深度學習的話薄扁,C#明顯力不從心,為了解決C#在目標追蹤中短缺捧挺,封裝了一個bytrack的.NET庫,可以通過這個庫和yolov3/yolov4/yolov5/yolox/yolov7等目標檢測框架對接尿瞭,實現(xiàn)了two stage最優(yōu)方法闽烙,目前測試發(fā)現(xiàn)bytetrck性能要優(yōu)于當前所有追蹤框架,而且精度也很高声搁,因此使用bytrack作為追蹤不失為一個比較好的方法黑竞。實現(xiàn)的追蹤主框架代碼如下:
const string Cfg = @"mydata\\yolov7-tiny.cfg";
? ? ? ? ? ? const string Weight = @"mydata\\yolov7-tiny.weights";
? ? ? ? ? ? const string Names = @"mydata\\coco.names";
? ? ? ? ? ? var detector = new DarknetManager(Weight, Cfg, Names);
? ? ? ? ? ? VideoCapture capture = new VideoCapture(@"D:\car.mp4");
? ? ? ? ? ? ByteTrackerWrapper track = new ByteTrackerWrapper(20);
? ? ? ? ? ? if (!capture.IsOpened())
? ? ? ? ? ? {
? ? ? ? ? ? ? ? Console.WriteLine("video not open!");
? ? ? ? ? ? ? ? return;
? ? ? ? ? ? }
? ? ? ? ? ? Mat frame = new Mat();
? ? ? ? ? ? Mat resultImg = new Mat();
? ? ? ? ? ? var sw = new Stopwatch();
? ? ? ? ? ? int fps = 0;
? ? ? ? ? ? while (true)
? ? ? ? ? ? {
? ? ? ? ? ? ? ? capture.Read(frame);
? ? ? ? ? ? ? ? if (frame.Empty())
? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? Console.WriteLine("data is empty!");
? ? ? ? ? ? ? ? ? ? break;
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? sw.Start();
? ? ? ? ? ? ? ? var result = detector.InferenceImage(frame);
? ? ? ? ? ? ? ? string data = detector.MakeResultString(result);
? ? ? ? ? ? ? ? //Console.WriteLine(data);
? ? ? ? ? ? ? ? if(!string.IsNullOrEmpty(data))
? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? var trackerResult = track.Update(data);
? ? ? ? ? ? ? ? ? ? resultImg = detector.DrawImage(frame,trackerResult);
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? else
? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? resultImg = detector.DrawImage(frame, result);
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? sw.Stop();
? ? ? ? ? ? ? ? fps = Convert.ToInt32(1 / sw.Elapsed.TotalSeconds);
? ? ? ? ? ? ? ? sw.Reset();
? ? ? ? ? ? ? ? Cv2.PutText(resultImg, "FPS=" + fps, new OpenCvSharp.Point(30, 30), HersheyFonts.HersheyComplex, 1.0, new Scalar(255, 0, 0), 3);
? ? ? ? ? ? ? ? //顯示結果
? ? ? ? ? ? ? ? Cv2.ImShow("Result", resultImg);
? ? ? ? ? ? ? ? int key = Cv2.WaitKey(10);
? ? ? ? ? ? ? ? if (key == 27)
? ? ? ? ? ? ? ? ? ? break;
? ? ? ? ? ? }
? ? ? ? ? ? track.Dispose();
? ? ? ? ? ? capture.Release();
? ? ? ? ? ? detector.Dispose();
更多的請參考視頻教程演示:基于C#實現(xiàn)yolov7+bytetrack目標追蹤的算法結果演示_嗶哩嗶哩_bilibili