{"record":{"id":"5066f05be0cf2bd7","repo":"ultralytics/ultralytics","slug":"task-task-doesn-t-support-mode-track-vali","errorCode":null,"errorMessage":"❌ Task '{task}' doesn't support 'mode=track', valid tasks are {', '.join(trackable)}","messagePattern":"❌ Task '(.+?)' doesn't support 'mode=track', valid tasks are (.+?)","errorType":"exception","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"ultralytics/trackers/track.py","lineNumber":44,"sourceCode":"    \"deepocsort\": DeepOCSORT,\n}\n\n\ndef on_predict_start(predictor: object, persist: bool = False) -> None:\n    \"\"\"Initialize trackers for object tracking during prediction.\n\n    Args:\n        predictor (ultralytics.engine.predictor.BasePredictor): The predictor object to initialize trackers for.\n        persist (bool, optional): Whether to reuse existing trackers if they are already attached.\n\n    Examples:\n        Initialize trackers for a predictor object\n        >>> predictor = SomePredictorClass()\n        >>> on_predict_start(predictor, persist=True)\n    \"\"\"\n    trackable = (\"detect\", \"segment\", \"pose\", \"obb\")  # tasks whose results carry boxes, in canonical order\n    if (task := predictor.args.task) in TASKS and task not in trackable:  # unknown third-party tasks are left alone\n        raise ValueError(f\"❌ Task '{task}' doesn't support 'mode=track', valid tasks are {', '.join(trackable)}\")\n\n    if hasattr(predictor, \"trackers\") and persist:\n        return\n\n    tracker = check_yaml(predictor.args.tracker)\n    cfg = IterableSimpleNamespace(**YAML.load(tracker))\n    cfg.device = predictor.device  # run any ReID encoder on the predictor's device\n\n    if cfg.tracker_type not in TRACKER_MAP:\n        raise AssertionError(f\"Only {sorted(TRACKER_MAP)} are supported for now, but got '{cfg.tracker_type}'\")\n\n    predictor._feats = None  # reset ReID pre-hook state\n    if hasattr(predictor, \"_hook\"):\n        predictor._hook.remove()\n    if hasattr(predictor, \"_orig_postprocess\"):  # restore any raw-preds wrapper left by a prior TRACKTRACK run\n        predictor.postprocess = predictor._orig_postprocess\n        del predictor._orig_postprocess\n    if cfg.tracker_type in {\"botsort\", \"tracktrack\", \"deepocsort\"} and cfg.with_reid and cfg.model == \"auto\":","sourceCodeStart":26,"sourceCodeEnd":62,"githubUrl":"https://github.com/ultralytics/ultralytics/blob/0449ea011cfd6c9a0d50a0bf1043aca5190cd476/ultralytics/trackers/track.py#L26-L62","documentation":"on_predict_start (wired into mode=track) accepts tracking only for tasks whose Results carry boxes: detect, segment, pose, obb. If predictor.args.task is a known TASKS entry but not one of those — classify, semantic, depth — trackers cannot be attached because there are no boxes to associate across frames, so ValueError is raised listing the valid tasks. Unknown third-party task names are deliberately left alone.","triggerScenarios":"Calling model.track(...) on a classification/semantic/depth model: YOLO('yolo11n-cls.pt').track(source=...), or a semantic/depth checkpoint with mode=track in the CLI.","commonSituations":"Reusing a tracking script template with a classification model; selecting the wrong checkpoint in a config; assuming track() is a generic video mode for all tasks.","solutions":["Use a detect, segment, pose, or obb model for tracking, e.g. YOLO('yolo11n.pt').track(source='video.mp4')","If you need per-frame classification over video, use model.predict(...) in a loop instead of track","Verify the checkpoint's task before calling track (model.task)"],"exampleFix":"# before\nmodel = YOLO('yolo11n-cls.pt')\nresults = model.track(source='video.mp4')  # ValueError\n\n# after\nmodel = YOLO('yolo11n.pt')  # detect model\nresults = model.track(source='video.mp4')","handlingStrategy":"type-guard","validationCode":"TRACKABLE = ('detect', 'segment', 'pose', 'obb')\nassert model.task in TRACKABLE, f\"track() needs one of {TRACKABLE}, got {model.task}\"","typeGuard":"def is_trackable(model) -> bool:\n    return model.task in {'detect', 'segment', 'pose', 'obb'}","tryCatchPattern":"try:\n    results = model.track(source=src)\nexcept ValueError as e:\n    if \"doesn't support 'mode=track'\" in str(e):\n        results = [r for r in model.predict(source=src, stream=True)]  # frames without IDs","preventionTips":["Check model.task before calling .track()","Reserve track() for box-producing tasks; use predict(stream=True) for classify over video"],"tags":["tracking","task","validation","predict"],"backgroundTag":null,"analyzedSha":"0449ea011cfd6c9a0d50a0bf1043aca5190cd476","analyzedAt":"2026-08-15T02:34:13.413Z","schemaVersion":2},"datasetVersion":"2026-08-15T17:31:12.345Z"}