Annotation quality
Overview
Checks the annotations of an image dataset and builds a quality report: how many images carry labels, how the classes balance, and which issues need a look, such as duplicate images, labels outside the frame, split leakage, and misspelled or rare classes.
Use it after importing, preparing, or sampling a dataset to see whether annotations, classes, tags, and image coverage look healthy before training or evaluation. The badge sums it up, and the report can be passed to Dataset insights through its Findings from other nodes input.
How it works
Reuses the statistics already measured for annotations that have not changed, and measures the rest.
FAQ
How are duplicate images found?
By content, not by name. Storage keeps a hash of every object it holds, so the check compares those and never downloads an image — importers routinely rename files, which is exactly why two copies of one picture can sit in a dataset unnoticed. The count is the copies that could be removed, so three copies of one picture count as two. The gallery shows every copy, and thumbnails sharing a caption are the same picture. Only byte-identical files are reported, so a resized or re-compressed copy is not a duplicate here and will not be listed. Where the hash cannot answer the question — an image uploaded in parts hashes differently depending on how it was split — those images are listed separately as unchecked rather than quietly reported as unique.
What counts as an annotated image?
An annotation is the record attached to an image, and it can hold objects (labeled shapes) and tags. An image counts as annotated only when it has at least one object: a bare or empty annotation record is not coverage.
Do image tags and object tags count as annotations?
A tag is part of an annotation, not a separate annotation. Objects, image-level tags, and object-level tags are analyzed as three separate dimensions. An image whose annotation carries only tags adds no objects, so it counts as an image without objects.
What does the badge report?
The share of images with objects, the class count, and the issue count when there are issues.
Why is a second run faster?
Statistics are stored per annotation, in a store Dataset insights reads too, so a rerun only downloads and measures annotations it has not seen. Over an unchanged dataset it measures nothing.
Does the node change my dataset?
Images and annotations are left as they are. The node writes the class list and summary statistics, such as image, object, and class counts and coverage, into the dataset’s metadata.
Which data can it analyze?
Image assets and their annotations only. Video assets are not analyzed.
Inputs
Dataset whose image annotations are checked. Measurements are kept, so a rerun over an unchanged dataset recomputes nothing. Key: DATASET.
Outputs
Annotation quality report for the dataset. Shown as an artifact. Key: REPORT_ID.
Compact dataset quality summary shown as a badge. Shown on the node as a badge. Key: QUALITY_SUMMARY.
Report
The report is attached to the node as an artifact and opens in the preview widget. Sections that have nothing to show are dropped rather than rendered empty, so a dataset without objects or tags produces a shorter report, and a dataset with no labels at all keeps little more than the Overview with a “No labels yet” notice.
Overview is the summary you read first: four metric cards for images (with the annotated share), objects per image, classes (with the first few names), and issues, graded by severity. An image counts as annotated only when it carries at least one object.
Issues lists what the statistics noticed, one row per issue rather than one per image, with a count and a gallery on click. Severity describes the dataset, never the run: Problem marks what cannot be right, while Check marks what is worth a look and may still be intentional.
Label size is deliberately not an issue: small and elongated labels are normal in aerial imagery, defect inspection and fibre segmentation. The section appears only when there is something to show.
Images starts with an image coverage pie and, when some image carries a tag, a bar chart of images by asset tag. That chart counts an image once per tag it has, so its bars can add up to more than the image count, and images with no tags of their own form an Untagged bar. Bookkeeping tags written by import and sampling nodes are left out — an import path or a sampler node id says how an image arrived rather than what it holds, and being unique per image it would fill the chart with one bar per image. Tags that describe the data, such as split and source_video, are shown. A chart of image resolutions and a table of every image with its annotation count, object count, class count, dimensions, classes, and labeled-area percentage follow. Selecting a row previews that image with its annotations.
Object sections
These appear only when the dataset contains objects.
Charts are clickable: a bar, slice, or heatmap cell opens a gallery of the images behind it. Very large galleries are capped, and co-occurrence matrices are skipped with a notice when the dataset has more than 200 classes or tags to draw.
Tag sections
Image-level tag sections appear only when the dataset has image tags, and object-level ones only when it has object tags.
JSON config
Machine-readable node interface for automation and advanced usage.