-
Notifications
You must be signed in to change notification settings - Fork 399
Add benchmark Makefile for eval and Codabench submission. #436
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Draft
AlexBodner
wants to merge
60
commits into
develop
Choose a base branch
from
feat/benchmark-codabench-submission
base: develop
Could not load branches
Branch not found: {{ refName }}
Loading
Could not load tags
Nothing to show
Loading
Are you sure you want to change the base?
Some commits from the old base branch may be removed from the timeline,
and old review comments may become outdated.
Draft
Changes from 10 commits
Commits
Show all changes
60 commits
Select commit
Hold shift + click to select a range
7ed45f2
Add benchmark Makefile for eval and Codabench submission.
AlexBodner 043b2d7
Refactor benchmark workflow into Makefile plus focused scripts.
AlexBodner 3501222
fix(pre_commit): 🎨 auto format pre-commit hooks
pre-commit-ci[bot] 720360d
fixed dancetrack dets origin in docs
AlexBodner 901563a
added mot17 val half filter
AlexBodner 3e0401a
added mot17 val half filter
AlexBodner 6e4444b
Merge branch 'feat/benchmark-codabench-submission' of https://github.…
AlexBodner 59565b4
fix(pre_commit): 🎨 auto format pre-commit hooks
pre-commit-ci[bot] 43b5da4
fixed ruff error of unsafe http requests
AlexBodner aefe434
Merge branch 'feat/benchmark-codabench-submission' of https://github.…
AlexBodner 1559739
Add multi-tracker comparison tables and Codabench poll/retry to bench…
AlexBodner 9f402d4
fix(pre_commit): 🎨 auto format pre-commit hooks
pre-commit-ci[bot] 8c7226b
Potential fix for pull request finding
AlexBodner 6477570
Address benchmark PR review feedback
AlexBodner 27890f7
Address benchmark PR review feedback
AlexBodner 825cebd
Potential fix for pull request finding
AlexBodner 0fb6927
fixed ruff
AlexBodner 4f3548d
Merge branch 'feat/benchmark-codabench-submission' of https://github.…
AlexBodner d615514
space change for botsort parameters
AlexBodner cb9b1f0
Tune DanceTrack on validation split instead of train.
AlexBodner 3c3476a
Add C-BIoU to benchmark comparison trackers and harden Codabench poll…
AlexBodner 95ef54a
Merge branch 'develop' into feat/benchmark-codabench-submission.
AlexBodner daea238
feat(reid): add roboflow-reid extra and numpy-only association glue
AlexBodner 8d8faf7
feat(reid): wire BoT-SORT appearance association, CLI, docs, and tests
AlexBodner fbbe664
refactor(reid): L2-normalize FeatureBank EMA and vectorize row normalize
AlexBodner 8297820
fix(pre_commit): 🎨 auto format pre-commit hooks
pre-commit-ci[bot] fa0d248
Add MOT17 BoT-SORT ± ReID benchmark notebook for reid package integra…
AlexBodner c8e18a4
fix(pre_commit): 🎨 auto format pre-commit hooks
pre-commit-ci[bot] ea2c16f
Fix CI for private roboflow-reid git dependency.
AlexBodner 7e5e1af
fix(pre_commit): 🎨 auto format pre-commit hooks
pre-commit-ci[bot] de2d419
Keep roboflow-reid out of default dev sync in CI.
AlexBodner c76b864
fix(pre_commit): 🎨 auto format pre-commit hooks
pre-commit-ci[bot] c32edbc
docs: rewrite reid API page to match trackers style
AlexBodner 86e57e1
docs: add ReID comparison table and tighten BoT-SORT ReID section
AlexBodner 2980574
fix(pre_commit): 🎨 auto format pre-commit hooks
pre-commit-ci[bot] 47001a1
Fix MOT17 ReID notebook side-by-side video render.
AlexBodner eaa023c
fix(pre_commit): 🎨 auto format pre-commit hooks
pre-commit-ci[bot] 4a22cdf
ci: restore default install commands now that reid is optional-only
AlexBodner d69143e
fix(pre_commit): 🎨 auto format pre-commit hooks
pre-commit-ci[bot] 8683b99
ci: install trackers[reid] in test and integration workflows
AlexBodner 1351cd9
refactor(reid): drop _reid seam and merge BoT-SORT ReID tests
AlexBodner c6696a1
fix(botsort): exclude reid_model from CLI param reflection only
AlexBodner a17749a
docs(reid): cite BoT-SORT for FeatureBank L2/EMA policy
AlexBodner 2f860c8
fix(pre_commit): 🎨 auto format pre-commit hooks
pre-commit-ci[bot] 1d5b0b1
docs(reid): trim FeatureBank attribution prose
AlexBodner 8d4e63b
test(reid): clarify BoT-SORT fusion and embedding extraction tests
AlexBodner 116bd80
refactor(botsort): make proximity IoU optional in ReID fusion
AlexBodner f55a063
perf(botsort): reuse raw IoU for proximity when using standard IoU
AlexBodner ed74d88
refactor(botsort): drop always-on proximity IoU instance
AlexBodner 14a6d09
refactor(botsort): consolidate ReID association path in tracker
AlexBodner 9b9116b
fix(pre_commit): 🎨 auto format pre-commit hooks
pre-commit-ci[bot] 36e4248
refactor(cli): single path for ReID validation and model load
AlexBodner 2f46154
fix(pre_commit): 🎨 auto format pre-commit hooks
pre-commit-ci[bot] 0ee51cb
fix(reid): pin standalone reid package and harden optional-extra CI
AlexBodner a2556cb
fix(pre_commit): 🎨 auto format pre-commit hooks
pre-commit-ci[bot] a7ebc45
refactor(reid): slim FeatureBank and ReID CLI wiring
AlexBodner 68ee592
fix(pre_commit): 🎨 auto format pre-commit hooks
pre-commit-ci[bot] eba0916
docs(reid): cite BoT-SORT update_features on FeatureBank
AlexBodner d2086bf
Merge feat/core/reid-consume-reid-package into benchmark Codabench wo…
AlexBodner d7c0423
feat(benchmark): wire optional BoT-SORT ReID into Codabench track flow
AlexBodner File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,4 @@ | ||
| data/ | ||
| benchmark_prep/ | ||
| benchmark_outputs/ | ||
| __pycache__/ |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,210 @@ | ||
| # MOT benchmark workflow — Makefile orchestrates `trackers tune`, `trackers eval`, | ||
| # small helper scripts under scripts/, and `codabench_submit.py`. | ||
| # | ||
| # cd benchmark | ||
| # make help | ||
| # make data-check | ||
| # make benchmark-default TRACKER=sort CODABENCH_TOKEN=... | ||
| # make benchmark-tuned TRACKER=sort CODABENCH_TOKEN=... | ||
| # make benchmark BENCHMARK_CONFIG=all TRACKER=sort CODABENCH_TOKEN=... | ||
| # | ||
| # See README.md for data setup. | ||
|
|
||
| SHELL := /bin/bash | ||
| ROOT := $(CURDIR) | ||
| REPO_ROOT := $(abspath $(ROOT)/..) | ||
| PYTHON ?= python | ||
|
|
||
| DATA_ROOT ?= $(ROOT)/data | ||
| PREP_DIR ?= $(ROOT)/benchmark_prep | ||
| OUTPUT_DIR ?= $(ROOT)/benchmark_outputs | ||
|
|
||
| TRACKER ?= sort | ||
| DATASET ?= mot17 | ||
| CONFIG ?= default | ||
| BENCHMARK_CONFIG ?= default | ||
| N_TRIALS ?= 10 | ||
| OBJECTIVE ?= HOTA | ||
| THRESHOLD ?= 0.5 | ||
| SEED ?= | ||
| FIXED_PARAMS ?= | ||
|
|
||
| CODABENCH_URL ?= https://www.codabench.org | ||
| CODABENCH_TOKEN ?= | ||
| CODABENCH_WAIT_TIMEOUT ?= 3600 | ||
| CODABENCH_POLL_INTERVAL ?= 10 | ||
|
|
||
| # BoT-SORT requires CMC on by default for the published numbers. | ||
| ifeq ($(TRACKER),botsort) | ||
| ifeq ($(strip $(FIXED_PARAMS)),) | ||
| FIXED_PARAMS := {"enable_cmc": true} | ||
| endif | ||
| endif | ||
|
|
||
| CODABENCH_DATASETS := mot17 sportsmot dancetrack | ||
| LOCAL_DATASETS := soccernet | ||
| ALL_DATASETS := $(CODABENCH_DATASETS) $(LOCAL_DATASETS) | ||
| DATASETS ?= $(ALL_DATASETS) | ||
|
|
||
| # Per-dataset tune splits. Score split is "test" for everyone (Codabench test for | ||
| # codabench datasets, public test GT for soccernet). Path lookups for image dirs | ||
| # delegate to scripts/datasets.py to stay DRY. | ||
| mot17_TUNE_SPLIT := val | ||
| sportsmot_TUNE_SPLIT := val | ||
| dancetrack_TUNE_SPLIT := train | ||
| soccernet_TUNE_SPLIT := train | ||
| SCORE_SPLIT := test | ||
|
|
||
| # Codabench (competition_id, phase_id) per dataset. | ||
| mot17_CB := 10049 16382 | ||
| sportsmot_CB := 13077 21402 | ||
| dancetrack_CB := 14885 24635 | ||
|
|
||
| LAYOUT := $(PYTHON) scripts/datasets.py --data-root "$(DATA_ROOT)" | ||
|
|
||
| .PHONY: help setup data-check prep prep-all tune track-default track-tuned _track-and-score \ | ||
| benchmark benchmark-default benchmark-tuned upload collect clean | ||
|
|
||
| help: | ||
| @echo "MOT benchmark workflow — run from \`cd benchmark\`" | ||
| @echo "" | ||
| @echo "Targets:" | ||
| @echo " setup Install \`trackers[tune]\` from $(REPO_ROOT)" | ||
| @echo " data-check Print present/missing assets under $(DATA_ROOT)" | ||
| @echo " prep Prep one dataset (DATASET=...) into $(PREP_DIR)" | ||
| @echo " prep-all Prep every dataset" | ||
| @echo " tune Tune one (TRACKER=, DATASET=)" | ||
| @echo " track-default Track on default params, then score (TRACKER=, DATASET=)" | ||
| @echo " track-tuned Track on best_params.json, then score (TRACKER=, DATASET=)" | ||
| @echo " upload Upload an existing submission.zip (TRACKER=, DATASET=, CONFIG=default|tuned)" | ||
| @echo " benchmark Full pipeline (TRACKER=, BENCHMARK_CONFIG=default|tuned|all, DATASETS=...)" | ||
| @echo " benchmark-default Same as \`make benchmark BENCHMARK_CONFIG=default\`" | ||
| @echo " benchmark-tuned Same as \`make benchmark BENCHMARK_CONFIG=tuned\`" | ||
| @echo " collect Aggregate eval/codabench JSONs into tables.md (TRACKER=)" | ||
| @echo " clean Remove $(PREP_DIR) and $(OUTPUT_DIR)" | ||
| @echo "" | ||
| @echo "Codabench upload requires CODABENCH_TOKEN. See README for data setup." | ||
|
|
||
| setup: | ||
| $(PYTHON) -m pip install -e "$(REPO_ROOT)[tune]" | ||
|
|
||
| data-check: | ||
| @$(PYTHON) scripts/data_check.py --data-root "$(DATA_ROOT)" | ||
|
|
||
| prep: | ||
| $(PYTHON) scripts/prep_data.py --dataset $(DATASET) --split all \ | ||
| --data-root "$(DATA_ROOT)" --prep-dir "$(PREP_DIR)" | ||
|
|
||
| prep-all: | ||
| $(PYTHON) scripts/prep_data.py --dataset all --split all \ | ||
| --data-root "$(DATA_ROOT)" --prep-dir "$(PREP_DIR)" | ||
|
|
||
| # Tune via the `trackers tune` CLI. Pass --images-dir only for BoT-SORT CMC (ByteTrack/SORT/OC-SORT are det-only). | ||
| tune: | ||
| @if [ ! -d "$(PREP_DIR)/$(DATASET)/$($(DATASET)_TUNE_SPLIT)" ]; then \ | ||
| echo "Run: make prep DATASET=$(DATASET)"; exit 1; \ | ||
| fi | ||
| @mkdir -p "$(OUTPUT_DIR)/$(TRACKER)/$(DATASET)" | ||
| $(eval TUNE_SPLIT := $($(DATASET)_TUNE_SPLIT)) | ||
| $(eval TUNE_IMAGES := $(shell $(LAYOUT) --dataset $(DATASET) --split $(TUNE_SPLIT) --field images_dir)) | ||
| trackers tune \ | ||
| --tracker $(TRACKER) \ | ||
| --gt-dir "$(PREP_DIR)/$(DATASET)/$(TUNE_SPLIT)/gt" \ | ||
| --detections-dir "$(PREP_DIR)/$(DATASET)/$(TUNE_SPLIT)/dets" \ | ||
| --metrics CLEAR HOTA Identity --objective $(OBJECTIVE) --threshold $(THRESHOLD) \ | ||
| --n-trials $(N_TRIALS) \ | ||
| $(if $(SEED),--seed $(SEED),) \ | ||
| $(if $(FIXED_PARAMS),--fixed-params '$(FIXED_PARAMS)',) \ | ||
| $(if $(and $(filter botsort,$(TRACKER)),$(TUNE_IMAGES)),--images-dir "$(TUNE_IMAGES)",) \ | ||
| --output "$(OUTPUT_DIR)/$(TRACKER)/$(DATASET)/best_params.json" | ||
|
|
||
| track-default: | ||
| @$(MAKE) _track-and-score TRACKER=$(TRACKER) DATASET=$(DATASET) CONFIG=default | ||
|
|
||
| track-tuned: | ||
| @test -f "$(OUTPUT_DIR)/$(TRACKER)/$(DATASET)/best_params.json" || \ | ||
| { echo "missing best_params.json — run \`make tune TRACKER=$(TRACKER) DATASET=$(DATASET)\`"; exit 1; } | ||
| @$(MAKE) _track-and-score TRACKER=$(TRACKER) DATASET=$(DATASET) CONFIG=tuned | ||
|
|
||
| # 1) track on the score split (test) → predictions | ||
| # 2) score: `trackers eval` for soccernet, `mot_format.py` + `codabench_submit.py` for the rest. | ||
| _track-and-score: | ||
| @if [ ! -d "$(PREP_DIR)/$(DATASET)/$(SCORE_SPLIT)" ]; then \ | ||
| echo "Run: make prep DATASET=$(DATASET)"; exit 1; \ | ||
| fi | ||
| $(PYTHON) scripts/track_split.py \ | ||
| --tracker $(TRACKER) --dataset $(DATASET) --split $(SCORE_SPLIT) \ | ||
| --data-root "$(DATA_ROOT)" --prep-dir "$(PREP_DIR)" \ | ||
| --output-dir "$(OUTPUT_DIR)/$(TRACKER)/$(DATASET)/$(CONFIG)" \ | ||
| $(if $(filter tuned,$(CONFIG)),--params "$(OUTPUT_DIR)/$(TRACKER)/$(DATASET)/best_params.json",) | ||
| @if [ "$(DATASET)" = "soccernet" ]; then \ | ||
| trackers eval \ | ||
| --gt-dir "$(PREP_DIR)/soccernet/test/gt" \ | ||
| --tracker-dir "$(OUTPUT_DIR)/$(TRACKER)/soccernet/$(CONFIG)/pred" \ | ||
| --metrics CLEAR HOTA Identity --threshold $(THRESHOLD) \ | ||
| --output "$(OUTPUT_DIR)/$(TRACKER)/soccernet/$(CONFIG)/eval.json"; \ | ||
| else \ | ||
| [ -n "$(CODABENCH_TOKEN)" ] || { echo "ERROR: CODABENCH_TOKEN not set — required for $(DATASET)."; exit 1; }; \ | ||
| $(PYTHON) scripts/mot_format.py --dataset $(DATASET) \ | ||
| --pred-dir "$(OUTPUT_DIR)/$(TRACKER)/$(DATASET)/$(CONFIG)/pred" \ | ||
| --out-zip "$(OUTPUT_DIR)/$(TRACKER)/$(DATASET)/$(CONFIG)/submission.zip"; \ | ||
| $(PYTHON) scripts/codabench_submit.py \ | ||
| "$(OUTPUT_DIR)/$(TRACKER)/$(DATASET)/$(CONFIG)/submission.zip" \ | ||
| --competition-id $(word 1,$($(DATASET)_CB)) \ | ||
| --phase $(word 2,$($(DATASET)_CB)) \ | ||
| --base-url "$(CODABENCH_URL)" --token "$(CODABENCH_TOKEN)" \ | ||
| --description "$(TRACKER) $(CONFIG) — benchmark Makefile" \ | ||
| --wait-timeout $(CODABENCH_WAIT_TIMEOUT) --poll-interval $(CODABENCH_POLL_INTERVAL) \ | ||
| --output "$(OUTPUT_DIR)/$(TRACKER)/$(DATASET)/$(CONFIG)/codabench.json"; \ | ||
| fi | ||
|
|
||
| # Re-upload a zip without re-tracking (e.g. after Codabench daily limit resets). | ||
| upload: | ||
| @test -f "$(OUTPUT_DIR)/$(TRACKER)/$(DATASET)/$(CONFIG)/submission.zip" || \ | ||
| { echo "missing $(OUTPUT_DIR)/$(TRACKER)/$(DATASET)/$(CONFIG)/submission.zip"; exit 1; } | ||
| @[ -n "$(CODABENCH_TOKEN)" ] || { echo "ERROR: CODABENCH_TOKEN not set."; exit 1; } | ||
| @test "$(DATASET)" != "soccernet" || { echo "soccernet is scored locally — use track-default/track-tuned"; exit 1; } | ||
| $(PYTHON) scripts/codabench_submit.py \ | ||
| "$(OUTPUT_DIR)/$(TRACKER)/$(DATASET)/$(CONFIG)/submission.zip" \ | ||
| --competition-id $(word 1,$($(DATASET)_CB)) \ | ||
| --phase $(word 2,$($(DATASET)_CB)) \ | ||
| --base-url "$(CODABENCH_URL)" --token "$(CODABENCH_TOKEN)" \ | ||
| --description "$(TRACKER) $(CONFIG) — benchmark Makefile" \ | ||
| --wait-timeout $(CODABENCH_WAIT_TIMEOUT) --poll-interval $(CODABENCH_POLL_INTERVAL) \ | ||
| --output "$(OUTPUT_DIR)/$(TRACKER)/$(DATASET)/$(CONFIG)/codabench.json" | ||
|
|
||
| collect: | ||
| $(PYTHON) scripts/collect.py --tracker $(TRACKER) --output-dir "$(OUTPUT_DIR)" | ||
|
|
||
| # Full pipeline. BENCHMARK_CONFIG=default|tuned|all (default: default only — one Codabench pass). | ||
| benchmark: | ||
| @case "$(BENCHMARK_CONFIG)" in default|tuned|all) ;; \ | ||
| *) echo "Set BENCHMARK_CONFIG=default, tuned, or all (or use benchmark-default / benchmark-tuned)"; exit 1;; \ | ||
| esac | ||
| @if [ -z "$(CODABENCH_TOKEN)" ]; then \ | ||
| echo "ERROR: CODABENCH_TOKEN must be set (required for mot17, sportsmot, dancetrack)."; exit 1; \ | ||
| fi | ||
|
AlexBodner marked this conversation as resolved.
Outdated
|
||
| @$(MAKE) prep-all | ||
| @for d in $(DATASETS); do \ | ||
| if [ "$(BENCHMARK_CONFIG)" = "default" ] || [ "$(BENCHMARK_CONFIG)" = "all" ]; then \ | ||
| echo ""; echo "===== [$$d] default ====="; \ | ||
| $(MAKE) track-default TRACKER=$(TRACKER) DATASET=$$d || exit 1; \ | ||
| fi; \ | ||
| if [ "$(BENCHMARK_CONFIG)" = "tuned" ] || [ "$(BENCHMARK_CONFIG)" = "all" ]; then \ | ||
| echo ""; echo "===== [$$d] tune ====="; \ | ||
| $(MAKE) tune TRACKER=$(TRACKER) DATASET=$$d N_TRIALS=$(N_TRIALS) || exit 1; \ | ||
| echo "===== [$$d] tuned ====="; \ | ||
| $(MAKE) track-tuned TRACKER=$(TRACKER) DATASET=$$d || exit 1; \ | ||
| fi; \ | ||
| done | ||
| @echo ""; echo "===== collect =====" | ||
| @$(MAKE) collect TRACKER=$(TRACKER) | ||
|
|
||
| benchmark-default: | ||
| @$(MAKE) benchmark BENCHMARK_CONFIG=default | ||
|
|
||
| benchmark-tuned: | ||
| @$(MAKE) benchmark BENCHMARK_CONFIG=tuned | ||
|
|
||
| clean: | ||
| rm -rf "$(PREP_DIR)" "$(OUTPUT_DIR)" | ||
Oops, something went wrong.
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Uh oh!
There was an error while loading. Please reload this page.