@@ -61,6 +61,50 @@ def resolve_dataset_cfg_path(data_ref) -> Optional[Path]:
6161 return None
6262
6363
64+ def resolve_source_from_data_ref (data_ref : str , overwrite : bool = False ) -> tuple [str , str , str ]:
65+ """
66+ Resolve a data/source reference into (source_path, benchmark_name, split_name).
67+
68+ Supports either direct dataset paths or dataset yaml references.
69+ """
70+ source_path = Path (str (data_ref ))
71+ benchmark = source_path .parent .name
72+ split = source_path .name
73+
74+ cfg_path = resolve_dataset_cfg_path (data_ref )
75+ if cfg_path is None :
76+ return str (data_ref ), benchmark , split
77+
78+ cfg = load_dataset_cfg_path (cfg_path )
79+ bench_name = Path (cfg ["benchmark" ]["source" ]).name
80+ dataset_url = cfg ["download" ]["dataset_url" ]
81+
82+ if dataset_url :
83+ if dataset_url .startswith ("hf://" ):
84+ dataset_dest = TRACKEVAL / bench_name
85+ else :
86+ dataset_dest = TRACKEVAL / f"{ bench_name } .zip"
87+ else :
88+ dataset_dest = Path (cfg ["download" ].get ("dataset_dest" , f"assets/{ bench_name } " ))
89+
90+ download_eval_data (
91+ runs_url = cfg ["download" ]["runs_url" ],
92+ dataset_url = dataset_url ,
93+ dataset_dest = dataset_dest ,
94+ overwrite = overwrite ,
95+ )
96+
97+ split = cfg ["benchmark" ]["split" ]
98+ if dataset_url :
99+ resolved_source = TRACKEVAL / f"{ bench_name } /{ split } "
100+ elif "source" in cfg ["benchmark" ]:
101+ resolved_source = Path (cfg ["benchmark" ]["source" ]) / split
102+ else :
103+ resolved_source = dataset_dest / split
104+
105+ return str (resolved_source ), bench_name , split
106+
107+
64108def ensure_model_extension (model_path ):
65109 """
66110 Ensure model path has .pt extension.
@@ -376,8 +420,7 @@ def track(ctx, detector, reid, tracker, yolo_model, reid_model, classes, **kwarg
376420 if tracker :
377421 kwargs ['tracking_method' ] = tracker
378422 src = kwargs .pop ('source' )
379- source_path = Path (src )
380- bench , split = source_path .parent .name , source_path .name
423+ resolved_source , bench , split = resolve_source_from_data_ref (src )
381424
382425 # Auto-append .pt extension if missing
383426 yolo_model = ensure_model_extension (yolo_model )
@@ -387,37 +430,10 @@ def track(ctx, detector, reid, tracker, yolo_model, reid_model, classes, **kwarg
387430 'yolo_model' : yolo_model ,
388431 'reid_model' : reid_model ,
389432 'classes' : parse_classes (classes ),
390- 'source' : src ,
433+ 'source' : resolved_source ,
391434 'benchmark' : bench ,
392435 'split' : split }
393436 args = SimpleNamespace (** params )
394-
395- # 2) if doing MOT17/20-ablation, pull down the dataset and rewire args.source/split
396- cfg_path = resolve_dataset_cfg_path (args .source )
397- if cfg_path is not None :
398- cfg = load_dataset_cfg_path (cfg_path )
399-
400- # Determine dataset destination
401- if cfg ["download" ]["dataset_url" ]:
402- dataset_dest = TRACKEVAL / f"{ Path (cfg ['benchmark' ]['source' ]).name } .zip"
403- else :
404- # For custom datasets without URL, use the path from config if available, or default to assets
405- dataset_dest = Path (cfg ["download" ].get ("dataset_dest" , f"assets/{ Path (cfg ['benchmark' ]['source' ]).name } " ))
406-
407- download_eval_data (
408- runs_url = cfg ["download" ]["runs_url" ],
409- dataset_url = cfg ["download" ]["dataset_url" ],
410- dataset_dest = dataset_dest ,
411- overwrite = False
412- )
413- args .benchmark = Path (cfg ["benchmark" ]["source" ]).name
414- args .split = cfg ["benchmark" ]["split" ]
415- if cfg ["download" ]["dataset_url" ]:
416- args .source = TRACKEVAL / f"{ args .benchmark } /{ args .split } "
417- elif "source" in cfg ["benchmark" ]:
418- args .source = Path (cfg ["benchmark" ]["source" ]) / args .split
419- else :
420- args .source = dataset_dest / args .split
421437
422438 from boxmot .engine .tracker import main as run_track
423439 run_track (args )
@@ -437,8 +453,7 @@ def generate(ctx, detector, reid, yolo_model, reid_model, classes, **kwargs):
437453 if reid :
438454 reid_model = [ensure_model_extension (reid )]
439455 src = kwargs .pop ('data' )
440- source_path = Path (src )
441- bench , split = source_path .parent .name , source_path .name
456+ resolved_source , bench , split = resolve_source_from_data_ref (src )
442457
443458 # Auto-append .pt extension if missing
444459 yolo_model = [ensure_model_extension (m ) for m in yolo_model ]
@@ -449,7 +464,7 @@ def generate(ctx, detector, reid, yolo_model, reid_model, classes, **kwargs):
449464 'reid_model' : list (reid_model ),
450465 'classes' : parse_classes (classes ),
451466 'data' : src ,
452- 'source' : src ,
467+ 'source' : resolved_source ,
453468 'benchmark' : bench ,
454469 'split' : split }
455470 args = SimpleNamespace (** params )
@@ -475,8 +490,6 @@ def eval(ctx, detector, reid, tracker, yolo_model, reid_model, classes, **kwargs
475490 if tracker :
476491 kwargs ['tracking_method' ] = tracker
477492 src = kwargs .pop ('data' )
478- source_path = Path (src )
479- bench , split = source_path .parent .name , source_path .name
480493
481494 # Auto-append .pt extension if missing
482495 yolo_model = [ensure_model_extension (m ) for m in yolo_model ]
@@ -487,9 +500,6 @@ def eval(ctx, detector, reid, tracker, yolo_model, reid_model, classes, **kwargs
487500 'reid_model' : list (reid_model ),
488501 'classes' : parse_classes (classes ),
489502 'data' : src ,
490- 'source' : src ,
491- 'benchmark' : bench ,
492- 'split' : split ,
493503 'imgsz' : [1088 , 1920 ]}
494504 args = SimpleNamespace (** params )
495505 from boxmot .engine .evaluator import main as run_eval
@@ -515,8 +525,6 @@ def tune(ctx, detector, reid, tracker, yolo_model, reid_model, classes, **kwargs
515525 if tracker :
516526 kwargs ['tracking_method' ] = tracker
517527 src = kwargs .pop ('data' )
518- source_path = Path (src )
519- bench , split = source_path .parent .name , source_path .name
520528
521529 # Auto-append .pt extension if missing
522530 yolo_model = [ensure_model_extension (m ) for m in yolo_model ]
@@ -526,10 +534,7 @@ def tune(ctx, detector, reid, tracker, yolo_model, reid_model, classes, **kwargs
526534 'yolo_model' : list (yolo_model ),
527535 'reid_model' : list (reid_model ),
528536 'classes' : parse_classes (classes ),
529- 'data' : src ,
530- 'source' : src ,
531- 'benchmark' : bench ,
532- 'split' : split }
537+ 'data' : src }
533538 args = SimpleNamespace (** params )
534539 from boxmot .engine .tuner import main as run_tuning
535540 run_tuning (args )
0 commit comments