Pascal VOC Dataset Health Checker
Checks a folder of Pascal VOC XML annotation files for the problems that normally only surface once a training script fails to parse them: an <object> missing its <name> or a <bndbox> coordinate, a box where xmin is past xmax, a box extending outside the image's declared <size>, an XML whose <filename> points at an image that isn't there, an image with no annotation XML, and two XMLs claiming the same image. The Pascal VOC counterpart to the YOLO and COCO Dataset Health Checkers, sharing their findings model. Point it at just the XMLs, or the whole dataset folder/.zip including images for the file-presence checks. Pascal VOC has no class-list file, so there's no "unknown class" check โ the distinct class names found are reported for information only. No image decoding needed; VOC files declare each image's size directly. Nothing is uploaded; every XML is parsed and checked in your browser.
Nothing is uploaded โ every file is read directly in your browser. Pick a .zip and it's unzipped automatically; pick image/label files directly and they're used as-is. Folder selection can't be combined into the same picker โ your browser shows a genuinely different, folder-only dialog for it.
About this tool
This tool checks a folder of Pascal VOC XML annotation files for the problems that normally only surface once a training script fails to parse them: an <object> block missing its <name> or a <bndbox> coordinate, a box where xmin is past xmax (VOC's version of a zero-size box), a box extending outside the image's declared <size>, an XML whose <filename> points at an image that isn't there, an image with no annotation XML at all, and two different XMLs both claiming to annotate the same image. It's the Pascal VOC counterpart to the YOLO and COCO Dataset Health Checkers, sharing their findings model rather than reinventing it. You can point it at just the XML files, or the whole dataset folder/.zip including images for the additional file-presence checks. Unlike YOLO and COCO, Pascal VOC has no class-list file โ a class is just whatever <name> text appears in an <object> โ so there's no "unknown class" check to make; the distinct class names found across every XML are reported for information only. No image decoding is needed: VOC files declare each image's width and height in the <size> block, which is all the box-bounds check requires. A malformed individual <object> is skipped and counted, not treated as a reason to abandon the whole file. Nothing is uploaded; every XML is parsed and checked in your browser.
What you can do
- Validate a folder of Pascal VOC XML annotations โ with or without the images
- Malformed <object> blocks, degenerate and out-of-bounds boxes, missing images, duplicates
- Findings grouped by problem type across every XML, plus the distinct class names found
- Nothing is uploaded โ every XML is parsed and checked entirely in your browser
How to use
Step 1
Pick your VOC dataset
The folder of .xml files, or the whole thing including JPEGImages โ image files add extra checks but aren't required.
Step 2
Checks run automatically
Every <object>, every <bndbox>, and every image cross-reference is validated the moment the files are read.
Step 3
Review the findings
Grouped by problem type, worst first โ expand any group to see exactly which XML files are affected.
Example
A finding looks like this:
VOC.DEGENERATE_BOX
2007_000027.xml โ <object> #3 ("person") has a non-positive box (xmin 340 >= xmax 340, or ymin >= ymax).Every finding names the XML file and the specific <object> within it โ findings are grouped by type in the results, so all occurrences of one problem are visible at once.
How your data is handled
This tool is labeled ๐ข Browser: the Pascal VOC XML files (and any image files you include) are read directly via your browser's File API, and every check runs entirely client-side โ nothing is uploaded, and there's no server involved anywhere in this tool. No AI model is used; every check is a deterministic rule, not a prediction. No image is ever decoded โ the box-bounds check uses the <size> declared in each XML.
Frequently asked questions
Do I need the images, or is the XML folder enough?+
The XML folder alone is enough for almost everything โ structure, malformed objects, degenerate boxes, out-of-bounds boxes, and duplicate <filename> claims all check fine from the XMLs by themselves. Including the images adds two checks: XMLs whose declared image isn't present, and image files with no matching annotation XML. Without images, those two are simply skipped.
Why is an XML with no <object> blocks only an observation?+
Because it's routinely intentional โ a background image with nothing to detect still gets a VOC XML, just with an empty object list. It's reported as an observation to review, the same way the YOLO and COCO checkers treat an unannotated image, not a mistake.
Why isn't there an "unknown class" check like the YOLO and COCO versions have?+
Pascal VOC has no class-list file โ a class name is just whatever text appears in an <object>'s <name> tag. There's no declared list to validate against, so any name is valid by definition. The tool reports the distinct class names it found across every XML for your reference, but can't flag one as "unknown."
Does this validate ImageSets/Main/train.txt and the other index files?+
Not yet โ this version checks the .xml annotation files and their relationship to the image files. Validating that the ImageSets index files reference only images that exist would be a reasonable future addition.
How does it handle a dataset split into subfolders?+
Every .xml file found anywhere in the selection is checked, and its <filename> is matched to image files by basename regardless of which folder either is in โ so a dataset organized into train/val subfolders, or with Annotations/ and JPEGImages/ split apart, works fine.