ByteTrack实时多目标跟踪
去年的1024我寫了一篇FairMOT實時多目標跟蹤,兜兜轉轉,一年過去了,最近FairMOT原作者發布了更快更強的ByteTrack,也就有了這篇文章,有種恍如隔世之感。
簡介
ByteTrack是近期公開的一個新的多目標跟蹤SOTA方法,第一次在MOT17數據集上到達80以上的MOTA并在多個榜單上排名第一,堪稱屠榜多目標跟蹤。本文主要介紹如何使用ByteTrack的源碼進行實時跟蹤(包括視頻和攝像頭)。本文均采用Ubuntu18.04進行環境配置,采用其他操作系統的在安裝一些庫時可能有所問題,需要自行解決。
ByteTrack的性能比較如下圖,橫軸表示推理速度、縱軸表示MOTA精度,圈的大小表示IDF1的數值。可以看到,ByteTrack超越了此前所有的跟蹤方法。
這里簡單介紹一下這個算法的一些內容。Tracking-by-detection是MOT中的一個經典高效的流派,通過相似度(位置、外觀、運動等信息)來關聯幀間的檢測框得到跟蹤軌跡。不過,由于實際場景的復雜性,檢測器往往無法得到完美的檢測結果。為了權衡真假正例,目前大部分MOT方法會選擇一個閾值(threshold),只保留高于這個閾值的檢測結果來做關聯得到跟蹤結果,低于這個閾值的檢測框就直接丟棄。作者認為這種策略是不合理的,就如黑格爾所說:“存在即合理。” 低分檢測框往往預示著物體的存在(例如遮擋嚴重的物體)。簡單地把這些物體丟棄會給MOT帶來不可逆轉的錯誤,包括大量的漏檢和軌跡中斷,降低整體跟蹤性能。因此,作者提出了一種新的數據關聯方法BYTE,將高分框和低分框分開處理,利用低分檢測框和跟蹤軌跡之間的相似性,從低分框中挖掘出真正的物體,過濾掉背景。簡單來說,是一個二次匹配的過程,具體算法流程可以查看原論文。
這種策略行之有效的原因其實和此前一些針對遮擋的方法有很類似的地方,那就是當物體被遮擋的時候,這個過程肯定不是瞬時發生的,它必然伴隨著檢測框由明確到不明確的過程,也就是框的得分降低的過程,因此挖掘低分的檢測框有助于修補那些被破壞的軌跡并保持一個較高的運行速度。
本文主要介紹ByteTrack的源碼使用方式,關于理論的解讀可以參考這篇文章。
環境配置
下面介紹該項目環境配置的過程,需要保證用戶已經安裝了Git和Conda,且安裝了支持CUDA10.2以上的顯卡驅動。
逐行執行下面的命令即可,需要注意,這里通過conda安裝了Pytorch和Cuda,因此requirements.txt文件中的torch和torchvision兩行需要先行刪去。
git clone git@github.com:ifzhang/ByteTrack.git cd ByteTrack/ conda create -n bytetrack python=3.8 -y conda activate bytetrack conda install pytorch=1.7.1 torchvision cudatoolkit -y pip install -r requirements.txt python setup.py develop pip install cython pip install 'git+https://github.com/cocodataset/cocoapi.git#subdirectory=PythonAPI' pip install cython_bbox這時候關于模型推理的環境就安裝完成了,當然,官方也給了docker環境配置的教程,這里就不介紹了,感興趣的可以參考作者的README。
模型下載
使用在 CrowdHuman、MOT17、Cityperson 和 ETHZ 上訓練的模型, 下載地址如下表,表中指標在MOT17訓練集上測試得到。
| bytetrack_x_mot17 [google], [baidu(code:ic0i)] | 90.0 | 83.3 | 422 | 29.6 |
| bytetrack_l_mot17 [google], [baidu(code:1cml)] | 88.7 | 80.7 | 460 | 43.7 |
| bytetrack_m_mot17 [google], [baidu(code:u3m4)] | 87.0 | 80.1 | 477 | 54.1 |
| bytetrack_s_mot17 [google], [baidu(code:qflm)] | 79.2 | 74.3 | 533 | 64.5 |
本文以最輕量的s版本為例,下載bytetrack_s_mot17.pth.tar文件,下載后在項目的根目錄下新建models文件夾并將該文件放入其中。
實時跟蹤
經過上面的環境配置和模型下載,此時你可以通過下面的命令來推理作者提供的demo視頻文件。
視頻文件
python tools/demo_track.py video -f exps/example/mot/yolox_s_mix_det.py -c ./models/bytetrack_s_mot17.pth.tar --path ./videos/palace.mp4 --fp16 --fuse --save_result推理過程中會出現如下的日志,并在當前目錄下生成YOLOX_outputs目錄,推理生成的跟蹤結果就在其中。
其中部分選項符的含義如下。
- demo:任務類型,必選項,可選image、video和webcam
- -f:模型配置文件
- -c:模型文件
- --path:需要進行推理的文件路徑
- --save_result:是否保存推理結果
我們在VisDrone數據集中的一個場景下測試了這個s版本模型的效果,結果如下,由于我們采用的最輕量的s版本模型,因此精度不是很高,很多小目標沒有檢測出來,不過速度是非常快的。想要看到更準確的效果,可以嘗試更復雜的模型,即m、l、x版本的模型。
ByteTrack實時多目標跟蹤
攝像頭
接著就是使用攝像頭進行實時跟蹤了,我這里使用的是比較方便的USB攝像頭。由于作者已經提供了攝像頭數據流的接口,并會在推理完成后保存推理的結果視頻,但是我們使用攝像頭進行跟蹤的時候往往想要實時看到跟蹤效果,因此,需要將作者的tools/demo_track.py中的imageflow_demo函數修改如下。
def imageflow_demo(predictor, vis_folder, current_time, args):cap = cv2.VideoCapture(args.path if args.demo == "video" else args.camid)width = cap.get(cv2.CAP_PROP_FRAME_WIDTH) # floatheight = cap.get(cv2.CAP_PROP_FRAME_HEIGHT) # floatfps = cap.get(cv2.CAP_PROP_FPS)save_folder = os.path.join(vis_folder, time.strftime("%Y_%m_%d_%H_%M_%S", current_time))os.makedirs(save_folder, exist_ok=True)if args.demo == "video":save_path = os.path.join(save_folder, args.path.split("/")[-1])else:save_path = os.path.join(save_folder, "camera.mp4")logger.info(f"video save_path is {save_path}")vid_writer = cv2.VideoWriter(save_path, cv2.VideoWriter_fourcc(*"mp4v"), fps, (int(width), int(height)))tracker = BYTETracker(args, frame_rate=30)timer = Timer()frame_id = 0results = []while True:if frame_id % 20 == 0:logger.info('Processing frame {} ({:.2f} fps)'.format(frame_id, 1. / max(1e-5, timer.average_time)))ret_val, frame = cap.read()if ret_val:outputs, img_info = predictor.inference(frame, timer)online_targets = tracker.update(outputs[0], [img_info['height'], img_info['width']], exp.test_size)online_tlwhs = []online_ids = []online_scores = []for t in online_targets:tlwh = t.tlwhtid = t.track_idvertical = tlwh[2] / tlwh[3] > 1.6if tlwh[2] * tlwh[3] > args.min_box_area and not vertical:online_tlwhs.append(tlwh)online_ids.append(tid)online_scores.append(t.score)timer.toc()results.append((frame_id + 1, online_tlwhs, online_ids, online_scores))online_im = plot_tracking(img_info['raw_img'], online_tlwhs, online_ids, frame_id=frame_id + 1,fps=1. / timer.average_time)if args.save_result:vid_writer.write(online_im)cv2.imshow("demo", online_im)ch = cv2.waitKey(1)if ch == 27 or ch == ord("q") or ch == ord("Q"):breakelse:breakframe_id += 1此時通過下面的命令就可以實時看到攝像頭內拍攝到的內容的跟蹤效果(命令中的--camid表示攝像頭編號),我已經測試了代碼并成功運行,不過因為隱私問題我這里就不放跟蹤效果視頻了。
python tools/demo_track.py webcam -f exps/example/mot/yolox_s_mix_det.py -c ./models/bytetrack_s_mot17.pth.tar --fp16 --fuse --save_result --camid 0補充說明
本文對應用ByteTrack實現了基于視頻流的多目標實時跟蹤,是研究ByteTrack代碼閑暇之余的小demo,本文涉及的視頻僅作示例之用,如有侵權請聯系我刪除。
總結
以上是生活随笔為你收集整理的ByteTrack实时多目标跟踪的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 算法模板-双指针
- 下一篇: 动态规划算法-07背包问题进阶