Docs

What Labelyst reads, what each check does, and how the score is calculated.

SUPPORTED INPUT
CSV / TXT
Any CSV with a label column. Labelyst detects clear headers and preserves clear headerless files. Ambiguous first rows require confirmation before scoring.
JSON, flat array
A top-level array of objects, or an object with an "annotations" or "data" array.
JSONL / NDJSON
One JSON object per non-empty line. Malformed input reports the exact source line, and heterogeneous object fields are preserved.
JSON, COCO format
Detected automatically from the images/annotations/categories schema and flattened. Declared dimensions and broken image references are included in the health report.
ZIP, YOLO export
Validated labels/*.txt plus classes.txt or data.yaml. Detection, segmentation, pose, and oriented boxes are distinguished. Oriented boxes receive rotation-aware geometry and overlap checks.
XML / ZIP, Pascal VOC
Reads individual VOC XML annotations or a ZIP containing an XML file per image, including declared image dimensions.
JSON / ZIP, LabelMe
Reads LabelMe rectangles, polygons, and points from one JSON file or a multi-file dataset ZIP.
ZIP, single file
A zip containing exactly one CSV, JSON, JSONL, or NDJSON file gets extracted and read normally.
ZIP, classification folders
Infers labels only from an unambiguous split/class/image or class/image hierarchy with at least two classes.
ZIP, segmentation folders
Pairs clear images and masks folders by relative path and checks missing pairs and dimensions. Mask class IDs remain limited without a palette or schema.

Free limits: 200,000 rows, 150MB per upload, 5,000 ZIP entries, 200MB after ZIP decompression, and 25 million decoded pixels per TIFF. These caps protect the browser tab from memory exhaustion and decompression bombs.

PREFLIGHT AND COVERAGE

Every upload pauses before scoring and shows the detected format, annotation type, record count, image count, ignored files, and coverage limits. Results are either fully supported, supported with limits, or rejected. A partial analysis is capped at 60 and cannot be presented as Excellent.

THE 15 CHECKS
Duplicate labels
Flags inconsistent spelling of the same class ("car" vs "Car" vs " car "), and exact duplicate annotation rows when a filename column is present. Repeated correct labels are normal and never flagged.
Naming consistency
Looks at unique class names, detects the majority naming style (snake_case, camelCase, PascalCase, kebab-case), and flags classes that don't match it.
Capitalization
Looks at unique class names, detects the majority capitalization style, and flags classes that don't match it.
Empty or invalid labels
Flags rows with a missing, blank, or null label.
Invalid characters
Flags leading/trailing whitespace, tabs, invisible unicode, control characters, and labels that start with =, +, -, or @ (spreadsheet formula injection risk).
Class balance
Flags severe imbalance when the largest class outnumbers the smallest by more than 10x.
Class coverage
Flags classes below the configured minimum annotation count. The default minimum is five and can be changed in the report.
Bounding boxes
Validates coordinates: negative values, zero or negative width/height, and for YOLO's normalized format, boxes that extend past the image edge.
Annotation distribution
Reports per-class and per-split size/aspect distributions, small or stretched boxes, crowded images, center heatmaps, heavy overlaps, and probable duplicate boxes.
Segmentation, OBB, and keypoints
Validates polygon bounds, area, self-intersection and overlap; RLE masks; rotated-box corners, bounds, angles and rotated IoU; and keypoint counts, visibility, skeleton references, and image bounds.
Dataset integrity
Finds missing image references, images without annotations, empty annotation files, duplicate image IDs, unreadable headers, unusual dimensions, and inconsistent media pairing.
Image quality
Fully decodes a bounded JPEG, PNG, GIF, BMP, WebP, or single-page TIFF sample in a Web Worker and flags darkness, overexposure, low contrast, blur, corruption, EXIF rotation, exact duplicates, and near duplicates.
Split balance
Compares class proportions across train, validation, and test paths to reveal missing or strongly shifted classes.
Dataset comparison
Diffs label counts and, when both versions contain image IDs and boxes, identifies individual annotations that were added, removed, or changed.
Taxonomy suggestions
Informational only, not scored. Groups labels by shared prefix, flags likely singular/plural pairs, and flags similar spellings, capped at 300 unique labels for performance.
LOCAL QUALITY GATE

Run npm run quality -- dataset.zip --min-score 80 to apply the same analyzer in a terminal or CI job. Add --profile profile.json to reuse exported thresholds and --report report.json to save the result. For an ambiguous CSV, add --header present or --header absent.

QUALITY THRESHOLDS

Advanced mode exposes class, geometry, overlap, exposure, contrast, blur, crowding, and image-sampling thresholds. The score and findings recalculate immediately, and the selected profile is included in the JSON report so the result can be reproduced.

HOW THE SCORE WORKS

Each applicable check contributes a weighted score out of 100. Bounding-box and distribution checks only run when box columns are detected; dataset-integrity checks run whenever an image-aware format is detected. The overall score is the weighted average, rounded. 90 and above is Excellent, 75 and above is Good, 50 and above is Needs Improvement, below that is Poor. Taxonomy suggestions never affect the score. Any incomplete media or format coverage caps the overall score at 60. A shared prefix between two class names is a structural observation, not a defect.

EXPORTS

The safe-repair preview lists every deterministic change before download. It removes empty-label and exact duplicate annotations, normalizes label variants, and clips intersecting axis-aligned boxes to known image boundaries. Fully invalid boxes and subjective findings stay in the review list. Corrected COCO, YOLO, Pascal VOC, and LabelMe files retain their source format. CSV, JSON, JSONL, PDF, portable HTML, and issue-manifest exports are also available. Repeated valid annotations are preserved, and CSV exports neutralize formula-like text in every column.

PRIVACY

Everything runs in your browser. No file, image, pixel, report, label, filename, or quality result is sent to a server. Image pixels are discarded immediately after measurement. If privacy analytics is configured, it counts page views and performance only, without cookies or dataset fields. Recent history stays in local browser storage and can be cleared from the landing page.

DEPLOYMENT CHECKS

Production builds enforce compressed client-asset budgets. After deployment, run npm run load:test -- --url https://www.labelyst.com to measure success rate, throughput, and p50, p95, and p99 latency with bounded concurrency.