Object Tracking Metrics: MOTA, MOTP, IDF1, and HOTA
Tracking adds identity over time, so its metrics score two things at once: detecting objects and keeping their IDs consistent. MOTA, MOTP, ID switches, IDF1, and the modern HOTA that balances detection against association, on one running door-cam example, with the equations and motmetrics.
A tracker can detect every object perfectly and still be useless if it keeps swapping their IDs. That’s why tracking needs metrics that score detection and association together, and why no single number did it well until HOTA. We’ll watch one door camera make a single identity mistake and see how differently each metric reacts.
Multi-object tracking (MOT) outputs boxes with consistent IDs across frames. Per frame it’s detection: match hypotheses to ground truth by IoU. The new axis is whether an object keeps the same ID over its whole trajectory, the data-association problem [5].
The running example: DoorCam, two people, one slip
DoorCam films a doorway for 5 frames. Two people, A and B, are present the whole time, so there are ground-truth boxes. DoorCam detects every box perfectly (no misses, no ghosts) with one flaw: after frame 2 it re-labels person A with a new ID and keeps that new ID to the end. One identity slip, otherwise flawless.
MOTA: the classic detection-centric score
MOTA adds up everything that went wrong per frame (misses, false alarms, ID switches) and divides by how many objects there were. From the CLEAR MOT metrics [1]:
MOTP: localization quality
MOTP asks how tightly the boxes you did match fit. It says nothing about identity. CLEAR MOT defines it as the total matching score over the number of matches [1]:
where is the score of match in frame and is the number of
matches in frame . What is decides which way is better. With box overlap,
and higher is better: if DoorCam’s 10 matched boxes average IoU
0.82, MOTP = 0.82. motmetrics averages whatever distance you passed it as the
matching cost, so with the usual cost the same tracker reports
MOTP = 0.18, and lower is better. Either way it is a quality-of-fit number, silent
about the ID slip. Check which convention a table uses before comparing MOTP values.
IDF1: the identity-centric score
IDF1 drops the per-frame counting and asks “for how much of each person’s life did we keep one consistent ID on them?”
IDF1 [2] solves one global assignment between predicted and true trajectories, then takes an F1 over identity matches:
HOTA: the modern, balanced standard
HOTA scores detection and association separately and takes their geometric mean, so a tracker must be good at both; being great at one can’t paper over the other. HOTA [3]:
where DetA is detection accuracy, , and AssA is association accuracy. For each true-positive match , HOTA counts its true-positive associations (TPA: other matches with the same true ID and the same predicted ID), false-negative associations (FNA: the same true ID with a different or no predicted ID) and false-positive associations (FPA: the same predicted ID on a different or no true object), and averages over all true positives [3]:
All of this is computed at one localization threshold ; the reported HOTA repeats it for and averages.
Now you try
Three calculators, one per metric. Push IDSW up in the MOTA panel and watch how little it moves, then drop AssA in the HOTA panel and watch HOTA fall hard. That contrast is the whole reason the field moved to HOTA.
In code
For MOTA / MOTP / IDF1, the motmetrics library is the standard:
# motmetrics==1.4.0
import motmetrics as mm
acc = mm.MOTAccumulator(auto_id=True)
# For each frame, give GT ids, hypothesis ids, and a cost matrix (e.g. 1 - IoU).
acc.update(
[1, 2], # ground-truth object ids present this frame
["a", "b"], # tracker hypothesis ids
[[0.1, 0.9], # cost (1 - IoU), shape: n_gt x n_hyp
[0.8, 0.2]],
)
mh = mm.metrics.create()
summary = mh.compute(
acc,
metrics=["mota", "motp", "idf1", "num_switches", "mostly_tracked", "mostly_lost"],
name="seq1",
)
print(summary) # motp here is the mean matched cost: (0.1 + 0.2) / 2 = 0.15
For HOTA specifically, use the official TrackEval toolkit. It’s the reference implementation the MOTChallenge benchmarks score against [4]. The YOLO-NAS post uses it to score trackers on SportsMOT, and shows the DetA/AssA split in practice: on ground-truth boxes, where detection is perfect by construction, HOTA measures association alone.
Caveats & common pitfalls
- No single classic number is enough. MOTA is detection-dominated (DoorCam: 0.90) and IDF1 association-dominated (0.80); reporting only one hides half the story. HOTA exists because of this [3]. Quote it, but keep DetA/AssA visible.
- MOTA can go negative and isn’t a percentage. Treat it as an error budget, not an accuracy you can compare loosely across datasets [1].
- Everything rides on the matching threshold and the detector. Tracking metrics inherit the IoU-matching choices from detection; a different threshold reshuffles ID switches and FPs.
- Use the reference implementations. MOTA/MOTP/IDF1 from
motmetrics, HOTA from TrackEval, because hand-rolled global assignment gets the edge cases (gaps, re-entries, crowd regions) subtly wrong.
Takeaways
- Tracking scores two things: detection and identity. No single classic metric captured both. DoorCam’s one ID switch scored 0.90, 0.80, or 0.87 depending on who’s asking.
- MOTA = detection-centric (FN + FP + ID switches), can be negative; MOTP = localization quality only (IoU, higher better, or a distance, lower better, depending on the tool).
- IDF1 = identity-centric via global trajectory matching; MT/ML summarize trajectory coverage.
- HOTA = √(DetA · AssA) balances the two and is the current standard, so report it, and read DetA vs AssA to see which half failed.
Next, the hardest to pin down: scoring images that have no ground truth → Image generation metrics: FID, IS, KID, LPIPS.
Further reading
- See the metrics in the wild: the MOTChallenge benchmark, with leaderboards and datasets where HOTA/MOTA/IDF1 are reported.
- Reference implementation: TrackEval, with HOTA, CLEAR-MOT, and Identity metrics in one toolkit.
- Related on CondadosAI: object-detection metrics (the per-frame matching tracking builds on); segmentation metrics.
References
[1] Bernardin, K., & Stiefelhagen, R. (2008). Evaluating Multiple Object Tracking Performance: The CLEAR MOT Metrics. EURASIP Journal on Image and Video Processing, 2008, 246309. DOI:10.1155/2008/246309. Read it at Springer. (The DOI resolver currently sends this paper to a retired jivp.eurasipjournals.com address that 404s, so the link goes to the publisher directly.)
[2] Ristani, E., Solera, F., Zou, R., Cucchiara, R., & Tomasi, C. (2016). Performance Measures and a Data Set for Multi-Target, Multi-Camera Tracking. ECCV Workshops. arXiv:1609.01775. (Defines IDF1.)
[3] Luiten, J., Os̆ep, A., Dendorfer, P., Torr, P., Geiger, A., Leal-Taixé, L., & Leibe, B. (2021). HOTA: A Higher Order Metric for Evaluating Multi-Object Tracking. International Journal of Computer Vision, 129, 548–578. DOI:10.1007/s11263-020-01375-2.
[4] Dendorfer, P., et al. (2021). MOTChallenge: A Benchmark for Single-Camera Multiple Target Tracking. International Journal of Computer Vision, 129, 845–881. Tooling: motmetrics (1.4.0 on PyPI, whose motp is the summed match distance over the number of matches), TrackEval.
[5] Forsyth, D. A., & Ponce, J. (2012). Computer Vision: A Modern Approach (2nd ed.), ch. 11 (tracking). Pearson.