Dataset Vault
One bucket can contain one or many datasets.
Datasets
--
Images
--
New
--
Annotated
--
dataset-name/images/*.jpg and dataset-name/labels/*.txt.
Upload images
Group your images under a camera name you choose yourself (e.g. "living room" or "front door").
--
Your account is waiting for approval from an admin. You can upload and annotate as usual - your images just won't be used in training until your account is approved.
Your account isn't allowed to upload images.
New images
JPEGs go straight into your own dataset area, unmixed with anyone else's.
Uploaded this session
Total 0 image(s).
Choose a dataset
AI suggestion, not saved yet. Review the boxes below and click Save to confirm them as real labels.
Flagged by Mistakenness - dashed boxes below are what the model predicted, not saved labels
No image loaded
Use New, Existing or All to browse images.
Plugins
Connect external systems to Heimdall without mixing them into the core annotate flow.
Frigate
Send snapshots, true positives, and false positives directly into Heimdall.
API base URL
--
Frigate+ key id
--
New credential created
Copy this now. PLUS_API_KEY is only shown right after generation/rotation.
Secret
PLUS_API_KEY
Test with curl
Connect Frigate to Heimdall
Model Engine
Train new RF-DETR versions from the GUI without MLflow. Jobs run as Kubernetes Jobs or an S3 queue.
Train RF-DETR
Uses annotated Heimdall labels and publishes a new model version to the S3 registry.
Dataset
—
Start time
Start training immediately, or queue it for a planned time. Scheduled jobs need the scheduler endpoint/CronJob to launch when due.
Kubernetes scheduling
Choose where the training job should run. Use node labels for production, or a node name for manual pinning.
Tips: label noder med kubectl label node <node> heimdall.training/gpu=true heimdall.training/nvme=true.
Training jobs
Auto-annotate
Use the latest published RF-DETR checkpoint to generate AI suggestions in bulk. Images aren't approved until you review them and click Save in Annotate.
Generate AI suggestions
Runs as its own job in the same queue as training.
Dataset
—
Target classes
Leave all unchecked to draft boxes for every class. Check specific classes (e.g. after a dataset import where everything else is already correct) to only draft boxes for those - the rest of the image is left untouched.
Kubernetes scheduling
Choose where the auto-annotate job should run.
Auto-annotate jobs
Models
Published RF-DETR model versions from training jobs.
Tick two models to compare their metrics and loss curves side by side.
Admin
Only visible to admins.
All users who have ever logged in, plus everyone with images in S3 - one combined list.
All manual saves, mark-seen, and AI suggestions, across every user. AI suggestions aren't approved until someone saves them manually.
Visual review of scripts/embed_and_cluster_cameras.py's suggestions - confirm images really are the same camera angle, then move flagged ones.
Runs an already-trained RF-DETR model's own inference over already-labeled images and flags ones where the model strongly disagrees with the human labels - possible missed objects or wrong classes.
Finds exact (byte-identical) and near-duplicate (near-identical burst frames) images and marks the redundant copies. Enable "Exclude near-duplicate images" under Train to skip marked images when building a training dataset without deleting anything - or review each group below and delete confirmed duplicates directly (immediate, no undo).
Analyzed
--
Exact groups
--
Near-dup groups
--
Marked
--
Flags too-dark and/or too-blurry images (classic pixel-brightness/sharpness heuristics, no ML model). Read-only, purely informational - unlike Uniqueness, there is no training-time filter for this: a dark night-time frame may be exactly the hard case the model most needs to learn, so nothing here ever gets excluded automatically.
Analyzed
--
Flagged
--
Generated
--
Runs the same VLM review the Annotate tab's "AI QA" button offers for one image, across every already-labeled image in a dataset. A VLM's review is free text, not a pass/fail verdict, so every reviewed image is listed - "Possible issue" is a keyword-based skimming aid, not a filter, so it can miss or over-flag; always read the text.
Reviewed
--
Possible issues
--
Generated
--
Class distribution (current label data)
Box count per class across every currently-labeled image in this dataset (not just the reviewed sample above - cheap S3 reads, no VLM calls). A class showing 0 here has no real training signal at all right now, regardless of what the model detects.
Class confusion (labeled as → VLM suggests)
Built from "BOX N SUGGESTED CLASS: ..." lines the VLM adds when a box's class looks wrong. A big, one-sided count for a specific pair (e.g. truck → bird) is a strong sign those two classes are systematically swapped in the underlying label data, independent of any class-id bookkeeping bug.
New class bootstrap
Add a brand-new class and let an open-vocabulary detector (LLMDet) scan the existing dataset for draft boxes - your own currently-trained model can't find a class it has never seen. Suggestions appear in Annotate on each image (dashed boxes) - delete any wrong ones, then Save to approve. After the first training run that includes the class, use Mistakenness for ongoing quality checks instead - this tool is only meant for the cold start.
Dataset imports
Import a permissively-licensed public dataset (Roboflow Universe, Kaggle, ...) as background/negative training examples or to backfill classes your own cameras rarely see. Stage the dataset's images under an S3 prefix yourself first (download the export, unzip, upload with any S3 tool) - this only runs a novelty-scoring job over what's already staged. Only images that add real value (not near-duplicates of anything already in the dataset or a prior import) are promoted, as a new PENDING contributor - nothing trains on them until you Approve the batch below.
Staged uploads
Upload a dataset's images here over as many visits as you like (no S3 tooling needed) - files land in a session's own area, invisible to your dataset, until you pick "Use for import" below and run the analysis.