Skip to content

Skip tracklet stitching when no animals were detected - #3504

Draft
C-Achard wants to merge 2 commits into
jaap/fix-empty-video-predictionsfrom
cy/fix-empty-tracklet-stitch
Draft

C-Achard wants to merge 2 commits into
jaap/fix-empty-video-predictionsfrom
cy/fix-empty-tracklet-stitch

Conversation

@C-Achard

@C-Achard C-Achard commented Sep 9, 2026

Copy link
Copy Markdown
Collaborator

Problem

For multi-animal analysis with auto_track=True, a video with no detections causes the entire operation to abort.

Undetected frames are represented by -1 padded predictions. These entries are removed when assemblies are generated, so a fully undetected video produces an empty assemblies file. Tracking then proceeds anyway, eventually causing TrackletStitcher to raise OSError("Tracklets are empty.").

Changes

  • Return the retained assembly count from _generate_assemblies_file
  • Skip automatic tracking when a video contains no assemblies
  • Warn that no tracking output was created while keeping the _full.pickle predictions available
  • Introduce EmptyTrackletsError as a ValueError subclass for empty tracklet input
  • Make stitch_tracklets skip videos that raise EmptyTrackletsError, allowing batch processing to continue
  • Add regression tests for empty assemblies, valid assembly counts, header-only tracklets, and the exceptions

Compatibility

Changes the exception raised for empty tracklets from OSError to ValueError. It also changes stitch_tracklets so that empty-tracklet videos are skipped rather than propagated as failures, including for GUI and standalone callers.
No callers in the repository currently catch either exception.

Follow-up to #3488, where handling an OverflowError in _generate_output_data revealed this failure.

Avoid running stitch/tracklet conversion when no animals were detected in a video. `analyze_videos` now detects empty assemblies, warns, and leaves the pose predictions available without creating tracking files. `TrackletStitcher` raises a dedicated `EmptyTrackletsError`, and the stitcher test now expects that case.
Cover the no-detection path in pose-estimation assembly generation and the header-only tracklet case in the stitcher. These tests pin the expected empty-input behavior and the error type for invalid tracklet files.

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟡 Changes recommended

Identity-padded predictions are miscounted, and skipped stitching can incorrectly be reported as successful.

Once you've addressed the issues Copilot identified, you can request another Copilot review.

Pull request overview

Prevents empty multi-animal detections from aborting tracking and introduces a dedicated empty-tracklet exception.

Changes:

  • Counts generated assemblies and skips stitching when none exist.
  • Adds EmptyTrackletsError and continues batch stitching after empty input.
  • Adds regression tests for assembly counts and empty tracklets.
File summaries
File Description
deeplabcut/pose_estimation_pytorch/apis/videos.py Detects empty assemblies and skips automatic tracking.
deeplabcut/refine_training_dataset/stitch.py Defines and handles EmptyTrackletsError.
tests/pose_estimation_pytorch/apis/test_videos.py Tests assembly counting.
tests/test_stitcher.py Tests empty-tracklet exceptions.
Review details
  • Files reviewed: 4/4 changed files
  • Comments generated: 2
  • Review effort level: Balanced

💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.

snapshot_index=snapshot_index,
detector_snapshot_index=detector_snapshot_index,
)
h5_files_created = True # .h5 file was created by stitch_tracklets
mask = ~np.all(preds < 0, axis=(1, 2))
preds = preds[mask]

num_assemblies += len(preds)
@C-Achard C-Achard added the 3.1 label Sep 17, 2026

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants