聯(lián)器(Tracker)與 TraDeS_BYTE 兩階段追蹤方案)
計(jì)算機(jī)視覺深度學(xué)習(xí)人工智能【免費(fèi)下載鏈接】ByteTrack[ECCV 2022] ByteTrack: Multi-Object Tracking by Associating Every Detection Box項(xiàng)目地址https://gitcode.com/GitHub_Trending/by/ByteTrack點(diǎn)擊查看免費(fèi)下載本篇技術(shù)指南以本倉庫 tutorials/trades/README.md 為核心完整講解如何把 ByteTrack 的多目標(biāo)追蹤關(guān)聯(lián)器集成進(jìn) TraDeS 代碼庫包括直接替換 tracker.py 與 opts.py的原始方案以及用 byte_tracker.py mot_online 模塊替換的 TraDeS_BYTE 方案并給出可直接復(fù)制的 MOT17 推理命令與關(guān)鍵閾值參數(shù)詳解。讀完本文你將掌握兩類追蹤器motion reid 與 motion Kalman Filter的關(guān)聯(lián)策略差異以及如何結(jié)合 byte_tracker.py、tracker.py、opts.py 源碼定位和調(diào)優(yōu)每一個(gè)追蹤參數(shù)。集成背景為什么要在 TraDeS 中替換追蹤器TraDeSTrack to Detect and Segment是一個(gè)基于 CenterTrack 思想、通過成本量cost volume傳播目標(biāo)嵌入embedding來輔助檢測(cè)的在線多目標(biāo)追蹤框架其默認(rèn)追蹤器 tracker.py 采用運(yùn)動(dòng) 重識(shí)別特征motion reid聯(lián)合關(guān)聯(lián)策略。而 ByteTrack本倉庫核心項(xiàng)目的核心思想是關(guān)聯(lián)每一個(gè)檢測(cè)框——不僅關(guān)聯(lián)高置信度檢測(cè)框還利用低置信度檢測(cè)框通常是遮擋目標(biāo)進(jìn)行二次關(guān)聯(lián)從而顯著降低漏檢導(dǎo)致的軌跡斷裂。因此把 ByteTrack 的關(guān)聯(lián)器嵌入 TraDeS可以讓 TraDeS 的檢測(cè)結(jié)果直接受益于 ByteTrack 的兩階段關(guān)聯(lián)策略這是本教程要解決的核心問題。原文檔將集成分為兩條路線TraDeS原始方案替換tracker.py與opts.py仍使用 TraDeS 自己的 motion reid 追蹤器TraDeS_BYTEByteTrack 方案用本倉庫的byte_tracker.py替換tracker.py并新增mot_online模塊包含basetrack.py、kalman_filter.py、matching.py采用運(yùn)動(dòng) 卡爾曼濾波的純幾何關(guān)聯(lián)。兩條路線共用同一套 MOT17 半數(shù)據(jù)集half推理命令框架區(qū)別僅在于參數(shù)取值與關(guān)聯(lián)機(jī)制下面逐一展開。Step 1獲取 TraDeS 代碼庫兩條路線都以 TraDeS 官方倉庫為基礎(chǔ)。第一步均為克隆 TraDeS 代碼原文檔指向JialianW/TraDeS倉庫git clone https://github.com/JialianW/TraDeS.git克隆完成后后續(xù)所有替換與新增文件操作都在該倉庫的src/lib/utils目錄下進(jìn)行。本文以下命令均假定已在 TraDeS 倉庫根目錄下執(zhí)行且模型權(quán)重../models/mot_half.pth已按 TraDeS 的說明放置就緒。方案一TraDeS 原始追蹤器motion reidStep 2替換 tracker.py 與 opts.py將 TraDeS 倉庫src/lib/utils/tracker.py替換為本倉庫提供的 tutorials/trades/tracker.py與 TraDeS 默認(rèn) tracker 行為等價(jià)同時(shí)將src/lib/opts.py替換為本倉庫的 tutorials/trades/opts.py。opts.py是 CenterTrack/TraDeS 風(fēng)格的參數(shù)解析器負(fù)責(zé)把命令行參數(shù)整理成opt對(duì)象替換它的目的是讓追蹤相關(guān)參數(shù)track_thresh、new_thresh、pre_thresh等與 byte_tracker 兼容的默認(rèn)值和解析邏輯保持一致。需要特別注意的是 opts.py 中的解析邏輯當(dāng)task包含tracking時(shí)opt.tracking被置為True同時(shí)opt.pre_img默認(rèn)為開啟除非指定--no_pre_img并對(duì) MOT 類數(shù)據(jù)集自動(dòng)設(shè)置overlap_thresh 0.05。這意味著追蹤閾值tracking threshold會(huì)參與后續(xù)關(guān)聯(lián)距離的判定而非僅由檢測(cè)分?jǐn)?shù)決定。Step 3運(yùn)行原始 TraDeS 推理在 TraDeS 倉庫根目錄執(zhí)行python3 test.py tracking --exp_id mot17_half --dataset mot --dataset_version 17halfval --pre_hm --ltrb_amodal --inference --load_model ../models/mot_half.pth --gpus 0 --clip_len 3 --trades --track_thresh 0.4 --new_thresh 0.4 --out_thresh 0.2 --pre_thresh 0.5各參數(shù)含義如下括號(hào)內(nèi)為 opts.py 中定義的默認(rèn)值命令中均為顯式覆蓋參數(shù)命令取值默認(rèn)值作用tracking位置參數(shù)—聲明任務(wù)為多目標(biāo)追蹤觸發(fā)opt.tracking True--exp_idmot17_halfdefault實(shí)驗(yàn)標(biāo)識(shí)決定輸出目錄exp/task/exp_id--dataset/--dataset_versionmot/17halfvalcoco/ 空使用 MOT 數(shù)據(jù)集及 half-val 版本--pre_hm開啟—使用前一幀熱圖pre heatmap作為追蹤線索--ltrb_amodal開啟—使用 ltrb_amodal 輸出頭4 通道見 opts.py 的heads注冊(cè)--inference開啟—推理模式--load_model../models/mot_half.pth空加載訓(xùn)練好的半數(shù)據(jù)集模型權(quán)重--gpus00使用的 GPU 編號(hào)--clip_len31TraDeS 使用的幀數(shù)含當(dāng)前幀成本量聚合的時(shí)序窗口長度--trades開啟—啟用 TraDeS 模型結(jié)構(gòu)見 opts.py--track_thresh0.40.3第一輪關(guān)聯(lián)的高分檢測(cè)置信度閾值--new_thresh0.40.0新建軌跡的檢測(cè)置信度閾值僅高于該分?jǐn)?shù)的檢測(cè)可開新軌跡--out_thresh0.2-1參與關(guān)聯(lián)的最低檢測(cè)置信度下限--pre_thresh0.5-1前一幀檢測(cè)結(jié)果的置信度閾值在原始 TraDeS 追蹤器中tracker.py 的step()首先只保留score track_thresh的檢測(cè)進(jìn)入第一輪關(guān)聯(lián)第一輪用檢測(cè)中心 運(yùn)動(dòng)偏移量與已有軌跡的距離疊加 IoU、類別等 invalid 懲罰見 tracker.py做貪心匹配第二輪tracker.py再把score track_thresh的低分檢測(cè)與仍未匹配上的軌跡進(jìn)行二次關(guān)聯(lián)。這正是關(guān)聯(lián)每一個(gè)檢測(cè)框思想在 TraDeS 代碼庫中的體現(xiàn)——即便使用原始 tracker兩輪關(guān)聯(lián)的骨架也已具備區(qū)別在于關(guān)聯(lián)度量依賴 reid embedding 與運(yùn)動(dòng)偏移而非純幾何。方案二TraDeS_BYTEByteTrack 關(guān)聯(lián)器Step 2替換為 byte_tracker.py 并新增 mot_online 模塊在方案一的基礎(chǔ)上TraDeS_BYTE 進(jìn)一步把追蹤器本體替換為 ByteTrack 的實(shí)現(xiàn)用本倉庫的 tutorials/trades/byte_tracker.py 替換 TraDeS 倉庫src/lib/utils/tracker.py用 tutorials/trades/opts.py 替換src/lib/opts.py將 tutorials/trades/mot_online 整個(gè)目錄basetrack.py、kalman_filter.py、matching.py復(fù)制到 TraDeS 倉庫src/lib/utils下作為mot_online包。mot_online是 ByteTrack 追蹤器的運(yùn)行時(shí)依賴basetrack.py定義TrackStateNew / Tracked / Lost / Removed與BaseTrack基類提供track_id全局自增、mark_lost()、mark_removed()等狀態(tài)管理接口kalman_filter.py8 維狀態(tài)空間x, y, a, h, vx, vy, va, vh的常速度卡爾曼濾波器提供initiate / predict / multi_predict / update / gating_distance其中multi_predict是向量化批量預(yù)測(cè)版本用于step()中對(duì)整池軌跡一次性前向預(yù)測(cè)matching.py提供iou_distanceIoU 代價(jià)矩陣cost 1 - IoU、linear_assignment基于lap.lapjv的匈牙利匹配支持cost_limit門限與fuse_motion運(yùn)動(dòng) 外觀融合本方案中未啟用。Step 3運(yùn)行 TraDeS_BYTE 推理python3 test.py tracking --exp_id mot17_half --dataset mot --dataset_version 17halfval --pre_hm --ltrb_amodal --inference --load_model ../models/mot_half.pth --gpus 0 --clip_len 3 --trades --track_thresh 0.4 --new_thresh 0.5 --out_thresh 0.1 --pre_thresh 0.5與方案一的命令相比閾值配置發(fā)生了變化--new_thresh從0.4提升到0.5--out_thresh從0.2降低到0.1。這兩個(gè)值直接決定 byte_tracker.py 中兩階段關(guān)聯(lián)的檢測(cè)劃分track_thresh 0.4score 0.4的檢測(cè)進(jìn)入第一輪關(guān)聯(lián)高置信度檢測(cè)out_thresh 0.1out_thresh score track_thresh即0.1 ~ 0.4區(qū)間的檢測(cè)進(jìn)入第二輪關(guān)聯(lián)低置信度檢測(cè)用于找回遮擋目標(biāo)new_thresh 0.5新建軌跡的門檻只有第一輪關(guān)聯(lián)結(jié)束后仍未匹配、且score 0.5的檢測(cè)才有資格激活新軌跡見 byte_tracker.py。注意當(dāng)task含tracking時(shí)opts.py 會(huì)把tracking任務(wù)強(qiáng)制opt.pre_img True除非--no_pre_img因此 TraDeS_BYTE 同樣會(huì)利用前一幀熱圖ByteTrack 只替換關(guān)聯(lián)器部分檢測(cè)頭與熱圖傳播仍由 TraDeS 負(fù)責(zé)。源碼解析byte_tracker.py 的兩階段關(guān)聯(lián)流程byte_tracker.py 是本方案的核心其BYTETracker.step()第 179 行起按以下五步執(zhí)行檢測(cè)分層按track_thresh與out_thresh把檢測(cè)分為高分池dets進(jìn)入detections與低分池dets_second進(jìn)入detections_second見 byte_tracker.py第一輪關(guān)聯(lián)Kalman IoU把 tracked 與 lost 軌跡合并為strack_pool調(diào)用STrack.multi_predict用卡爾曼濾波批量預(yù)測(cè)當(dāng)前位置然后matching.iou_distance計(jì)算代價(jià)矩陣、linear_assignment閾值為0.9求解匹配見 byte_tracker.py。代碼中fuse_motion一行被注釋掉說明本方案刻意只使用純幾何關(guān)聯(lián)不混入外觀特征第二輪關(guān)聯(lián)低分檢測(cè)純 IoU對(duì)第一輪未匹配的 tracked 軌跡r_tracked_stracks與低分檢測(cè)detections_second再次做 IoU 匹配門限放寬到0.4從而把被遮擋、低置信度的目標(biāo)續(xù)上軌跡見 byte_tracker.py未確認(rèn)軌跡處理對(duì)只出現(xiàn)一幀的unconfirmed軌跡與剩余高分檢測(cè)做閾值為0.7的 IoU 匹配仍未匹配的未確認(rèn)軌跡直接mark_removed()見 byte_tracker.py狀態(tài)更新與軌跡維護(hù)超過max_time_lost由track_buffer換算而來的 lost 軌跡被移除最終輸出所有已激活軌跡含tracking_id、bbox、ct、score等字段見 byte_tracker.py。其中STrack是軌跡的最小單元它把檢測(cè)框從tlbr轉(zhuǎn)成tlwh存儲(chǔ)通過tlwh_to_xyah轉(zhuǎn)成卡爾曼濾波所需的(center x, center y, aspect ratio, height)表示activate / re_activate / update分別對(duì)應(yīng)開新軌跡、重新找回與逐幀更新byte_tracker.py。remove_duplicate_stracksbyte_tracker.py還會(huì)按軌跡存活時(shí)長清理 IoU 小于0.15的重復(fù)軌跡對(duì)避免同一目標(biāo)產(chǎn)生雙 ID。值得留意的是BYTETracker.__init__中buffer_size int(frame_rate / 30.0 * args.track_buffer)byte_tracker.py即軌跡丟失后的保留幀數(shù)會(huì)按幀率自適應(yīng)縮放而init_track/reset中的id_count等字段在注釋中明確標(biāo)注對(duì)最終輸出無影響僅為兼容原代碼庫接口byte_tracker.py——這意味著byte_tracker.py被設(shè)計(jì)成可直接嵌入 TraDeS 的test.py調(diào)用流程而不需要改動(dòng)檢測(cè)結(jié)果的輸出格式。核心對(duì)比motion reid 與 motion Kalman Filter原文檔 Notes 部分給出了一行高度凝練的結(jié)論這正是理解兩種方案差異的關(guān)鍵tracker.py: motion reid byte_tracker.py: motion with kalman filter對(duì)照兩份源碼可以進(jìn)一步展開原始 TraDeS 追蹤器motion reidtracker.py 的關(guān)聯(lián)度量同時(shí)使用檢測(cè)中心 運(yùn)動(dòng)偏移ct tracking與軌跡中心的歐氏距離并疊加 IoU、類別一致性懲罰匹配階段使用greedy_assignment默認(rèn)或linear_assignment--hungarian時(shí)并維護(hù) 128 維的embedding_bank做 reid 特征相似度查詢get_similarity見 tracker.py與滑動(dòng)平均更新alpha 0.1。代價(jià)是依賴訓(xùn)練好的 embedding 輸出頭且存在 reid 特征退化風(fēng)險(xiǎn)。TraDeS_BYTEmotion with Kalman filterbyte_tracker.py 完全不使用 embedding軌跡的運(yùn)動(dòng)由 8 維常速度卡爾曼濾波mot_online/kalman_filter.py預(yù)測(cè)匹配只依賴 IoU第一輪0.9、第二輪0.4。由于 TraDeS 的檢測(cè)頭本身已具備運(yùn)動(dòng)偏移能力替換關(guān)聯(lián)器后整條鏈路不增加 reid 分支的參數(shù)量與計(jì)算開銷。簡言之原始方案用外觀 運(yùn)動(dòng)做關(guān)聯(lián)魯棒但依賴重識(shí)別特征質(zhì)量TraDeS_BYTE 用純運(yùn)動(dòng) 幾何做兩階段關(guān)聯(lián)結(jié)構(gòu)更輕、部署更簡單代價(jià)是完全放棄外觀信息極端外觀劇變場景下的 ID 保持能力取決于卡爾曼預(yù)測(cè)與 IoU 的重疊質(zhì)量。參數(shù)調(diào)優(yōu)要點(diǎn)與使用前提兩階段閾值關(guān)系務(wù)必保持track_thresh out_thresh否則低分池為空、二次關(guān)聯(lián)失效。原方案取值0.4 / 0.2與 BYTE 方案0.4 / 0.1均可直接復(fù)現(xiàn)new_thresh建議不低于track_thresh避免第一輪已匹配的檢測(cè)又被重復(fù)開新軌跡。--clip_len 3與--trades二者必須同時(shí)出現(xiàn)。--clip_len決定成本量聚合的時(shí)序窗口--trades才在 opts.py 中決定不注冊(cè)tracking輸出頭TraDeS 結(jié)構(gòu)下檢測(cè)頭的運(yùn)動(dòng)偏移由成本量隱式承擔(dān)。--pre_thresh 0.5控制前一幀檢測(cè)結(jié)果進(jìn)入熱圖傳播的門檻值過高會(huì)丟失歷史線索、過低會(huì)引入噪聲一般保持0.5附近。依賴環(huán)境byte_tracker.py的matching.py依賴lap、cython_bbox、scipymot_online/kalman_filter.py依賴scipy.linalg原始 tracker 依賴scikit-learn的linear_assignment_。運(yùn)行前請(qǐng)確認(rèn) TraDeS 環(huán)境已安裝這些包。適用范圍本文命令面向 MOT17 half-val17halfval評(píng)測(cè)模型為mot_half.pth。若改用 MOT20 或全量 MOT17需同步調(diào)整數(shù)據(jù)集版本參數(shù)與對(duì)應(yīng)權(quán)重閾值也建議重新掃描。小結(jié)在 TraDeS 中集成 ByteTrack 本質(zhì)上是換關(guān)聯(lián)器而非換模型檢測(cè)、熱圖傳播、成本量等 TraDeS 組件原樣保留僅把關(guān)聯(lián)策略從 motion reid 換成 ByteTrack 的 motion Kalman Filter 兩階段關(guān)聯(lián)。對(duì)照本倉庫的 byte_tracker.py 與 tracker.py 源碼你可以清晰看到兩種策略在代價(jià)矩陣構(gòu)造、匹配門限與軌跡生命周期管理上的全部差異并據(jù)此針對(duì)自己的場景如遮擋密集的 MOT20、低幀率視頻重新調(diào)整track_thresh / out_thresh / new_thresh / track_buffer四元組。更多 ByteTrack 本體用法可參考本倉庫 tools/track.py 與 yolox/tracker/byte_tracker.py 的對(duì)應(yīng)實(shí)現(xiàn)。贊分享計(jì)算機(jī)視覺深度學(xué)習(xí)人工智能【免費(fèi)下載鏈接】ByteTrack[ECCV 2022] ByteTrack: Multi-Object Tracking by Associating Every Detection Box項(xiàng)目地址https://gitcode.com/GitHub_Trending/by/ByteTrack點(diǎn)擊查看免費(fèi)下載相關(guān)推薦Ultralytics ByteTrack 跟蹤器源碼級(jí)解析STrack 單目標(biāo)軌跡與 BYTETracker 兩階段關(guān)聯(lián)機(jī)制Ultralytics ByteTrack 跟蹤器源碼級(jí)解析STrack 單目標(biāo)軌跡與 BYTETracker 兩階段關(guān)聯(lián)機(jī)制 ByteTrack 是 Ult人工智能深度學(xué)習(xí)計(jì)算機(jī)視覺預(yù)訓(xùn)練Falcon分布式追蹤集成監(jiān)控與追蹤聯(lián)動(dòng)分析在大規(guī)模分布式系統(tǒng)中傳統(tǒng)監(jiān)控往往局限于孤立指標(biāo)告警難以定位跨服務(wù)問題根因。Falcon main.go https://link.gitcode.com運(yùn)維觀測(cè)指標(biāo)監(jiān)控告警kinit追蹤系統(tǒng)分布式追蹤集成方案kinit追蹤系統(tǒng)分布式追蹤集成方案 痛點(diǎn)微服務(wù)架構(gòu)下的監(jiān)控盲區(qū) 在現(xiàn)代化微服務(wù)架構(gòu)中系統(tǒng)復(fù)雜度呈指數(shù)級(jí)增長。傳統(tǒng)的單體應(yīng)用監(jiān)控方式已無法滿足分布式系統(tǒng)的后端前端任務(wù)調(diào)度認(rèn)證鑒權(quán)移動(dòng)開發(fā)上一篇NumJs安裝與配置指南下一篇開源項(xiàng)目 free-font 使用教程創(chuàng)作聲明:本文部分內(nèi)容由AI輔助生成(AIGC),僅供參考