roboflow/supervision · error · ValueError

All data values within a single object must have equal lengt

Error message

All data values within a single object must have equal length.

What it means

Raised by merge_data during Detections merging when, inside a single Detections object, the per-detection data arrays/lists stored under different keys have unequal lengths. Every value in detections.data must be aligned with xyxy (same number of entries), and a violation inside any one input object aborts the merge.

Source

Thrown at src/supervision/detection/utils/internal.py:570

    Returns:
        A single data payload containing the merged data, preserving the original data
            types (list or npt.NDArray[np.generic]).

    Raises:
        ValueError: If data values within a single object have different lengths or if
            dictionaries have different keys.
    """
    if not data_list:
        return {}

    all_keys_sets = [set(data.keys()) for data in data_list]
    if not all(keys_set == all_keys_sets[0] for keys_set in all_keys_sets):
        raise ValueError("All data dictionaries must have the same keys to merge.")

    for data in data_list:
        lengths = [len(value) for value in data.values()]
        if len(set(lengths)) > 1:
            raise ValueError(
                "All data values within a single object must have equal length."
            )

    merged_data: dict[str, Any] = {key: [] for key in all_keys_sets[0]}
    for data in data_list:
        for key in data:
            merged_data[key].append(data[key])

    for key in merged_data:
        if all(isinstance(item, list) for item in merged_data[key]):
            merged_data[key] = list(chain.from_iterable(merged_data[key]))
        elif all(isinstance(item, np.ndarray) for item in merged_data[key]):
            ndim = merged_data[key][0].ndim
            if ndim == 1:
                merged_data[key] = np.hstack(merged_data[key])
            elif ndim > 1:
                merged_data[key] = np.vstack(merged_data[key])
            else:

View on GitHub (pinned to 7f254d9784)

Solutions

  1. Audit the offending Detections: assert all(len(v) == len(d.xyxy) for v in d.data.values()) on each input before merge and fix the misaligned field
  2. Rebuild the Detections from scratch with all data fields the same length instead of mutating d.data in place
  3. Drop the misaligned key from data before merging if it is not needed

Example fix

# before
bad = sv.Detections(xyxy=boxes, data={'a': names[:3], 'b': ids[:2]})
sv.Detections.merge([bad, other])
# after
bad = sv.Detections(xyxy=boxes, data={'a': names[:3], 'b': ids[:3]})
sv.Detections.merge([bad, other])
Defensive patterns

Strategy: validation

Validate before calling

def assert_aligned_data(d):
    n = len(d.xyxy)
    for k, v in d.data.items():
        assert len(v) == n, f"data['{k}'] len {len(v)} != xyxy len {n}"

Try / catch

try:
    merged = sv.Detections.merge(detections_list)
except ValueError as e:
    if "equal length" in str(e):
        for d in detections_list:
            bad = [k for k, v in d.data.items() if len(v) != len(d.xyxy)]
        raise ValueError(f"misaligned data keys {bad}") from e
    raise

Prevention

When it happens

Trigger: sv.Detections.merge([d1, ...]) or concatenate where one input was constructed with data={'class_name': np.array(['a','b']), 'track_id': [1]} — lengths 2 vs 1. Any data key whose length differs from len(xyxy) of that same Detections triggers it during merge.

Common situations: Hand-building Detections with data dicts where one key was forgotten when appending a new detection; a connector or custom code that appends to xyxy but not to every data field; caching/pickling Detections created by an older code version with fewer data fields.

Related errors


AI-assisted analysis of roboflow/supervision@7f254d9784 (2026-08-15). Data as JSON: /api/errors/9c9392b1bef69ce6. Report an issue: GitHub.