去年的1024我寫了一篇FairMOT實時多目標跟蹤,兜兜轉轉,一年過去了,最近FairMOT原作者發布了更快更強的ByteTrack,也就有了這篇文章,有種恍如隔世之感,
簡介
ByteTrack是近期公開的一個新的多目標跟蹤SOTA方法,第一次在MOT17資料集上到達80以上的MOTA并在多個榜單上排名第一,堪稱屠榜多目標跟蹤,本文主要介紹如何使用ByteTrack的原始碼進行實時跟蹤(包括視頻和攝像頭),本文均采用Ubuntu18.04進行環境配置,采用其他作業系統的在安裝一些庫時可能有所問題,需要自行解決,
ByteTrack的性能比較如下圖,橫軸表示推理速度、縱軸表示MOTA精度,圈的大小表示IDF1的數值,可以看到,ByteTrack超越了此前所有的跟蹤方法,

這里簡單介紹一下這個演算法的一些內容,Tracking-by-detection是MOT中的一個經典高效的流派,通過相似度(位置、外觀、運動等資訊)來關聯幀間的檢測框得到跟蹤軌跡,不過,由于實際場景的復雜性,檢測器往往無法得到完美的檢測結果,為了權衡真偽正例,目前大部分MOT方法會選擇一個閾值(threshold),只保留高于這個閾值的檢測結果來做關聯得到跟蹤結果,低于這個閾值的檢測框就直接丟棄,作者認為這種策略是不合理的,就如黑格爾所說:“存在即合理,” 低分檢測框往往預示著物體的存在(例如遮擋嚴重的物體),簡單地把這些物體丟棄會給MOT帶來不可逆轉的錯誤,包括大量的漏檢和軌跡中斷,降低整體跟蹤性能,因此,作者提出了一種新的資料關聯方法BYTE,將高分框和低分框分開處理,利用低分檢測框和跟蹤軌跡之間的相似性,從低分框中挖掘出真正的物體,過濾掉背景,簡單來說,是一個二次匹配的程序,具體演算法流程可以查看原論文,
這種策略行之有效的原因其實和此前一些針對遮擋的方法有很類似的地方,那就是當物體被遮擋的時候,這個程序肯定不是瞬時發生的,它必然伴隨著檢測框由明確到不明確的程序,也就是框的得分降低的程序,因此挖掘低分的檢測框有助于修補那些被破壞的軌跡并保持一個較高的運行速度,
環境配置
下面介紹該專案環境配置的程序,需要保證用戶已經安裝了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訓練集上測驗得到,
| Model | MOTA | IDF1 | IDs | FPS |
|---|---|---|---|---|
| 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) # float
height = cap.get(cv2.CAP_PROP_FRAME_HEIGHT) # float
fps = 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 = 0
results = []
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.tlwh
tid = t.track_id
vertical = tlwh[2] / tlwh[3] > 1.6
if 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"):
break
else:
break
frame_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,本文涉及的視頻僅作示例之用,如有侵權請聯系我洗掉,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/336338.html
標籤:其他
