Skip to main content
Draw boxes around objects. Each sample is one image plus one Pascal VOC XML file that lists the objects in it. There is no labels CSV: the ingestor reads the image list and the classes straight from the XML files.

Ingest with the CLI

Lay out each split as shown in Folder layout, then ingest the training data and the test data:
--holds open_data marks the dataset as open data. If your data is about patients, pass --holds patient_data; if it was generated, pass --holds synthetic_data. Leave --holds out on a terminal and the CLI asks; in a script, the dataset is marked as patient data. The mark decides which use case types you can create on the dataset. There is no --label-column: the classes come from the XML files. On a terminal, tracebloc data ingest ./visdrone-train works the task out from the folder; see Guided ingest. --target-size WxH, with the letter x, for example 1920x1080, is the size every image has to be; without it, the CLI takes the most common size among your images. See Image resolution. The [1920, 1080] default in the ingest.yaml table below applies only to Helm ingests.

Folder layout

  • With the CLI, the dataset folder is on your machine (./visdrone-train). With Helm, it sits on the shared volume (/data/shared/...).
  • Both folders must have exactly these names and sit side by side.
  • Images and annotations pair by file stem: images/frame01.jpg belongs to annotations/frame01.xml. Every image needs its XML and every XML needs its image.
  • All images share one extension (.jpg, .jpeg or .png; default .jpg) and one resolution. The ingestor copies them unchanged and does not resize.

Annotation format (Pascal VOC)

Every element shown is required: An XML file with no <object> is accepted with a warning, but its image is skipped: it is not ingested and does not act as a background (negative) example.
Labeling tools such as CVAT and Label Studio often export float coordinates (871.5). The ingestor rejects them, so round every coordinate to an integer before you ingest. pose, truncated and difficult must be valid, but training ignores them: it reads only name, bndbox and size.

ingest.yaml

How records are stored

One record per image, not per box. The stored label of an image is its class histogram (for example car:3 motor:1). It must fit in 255 characters; an image with so many distinct classes that it does not fails the ingest. Because records are per image, the dataset summary reports class counts in boxes while the record count is the number of images. Data ids are content hashes, so re-running a failed ingest re-uses its rows.

What the ingestor checks

Plus the checks every ingest runs. A record is copied only when both its image and its XML copy succeed.

Training and test data

Ingest the training data and the test data separately (--intent train and --intent test). The classes in the test data must be a subset of the classes in the training data. If the test data has a class the training data lacks, it does not appear in the test dataset list when you define the use case. The ingest does not catch this. Each split must also have at least two classes on its own.

Size limit

One tracebloc data ingest takes at most 1 GiB in total and 500 MiB per file. If your dataset is larger:
  • Save the images as JPEG instead of PNG.
  • Lower the resolution: resize every image to one smaller size, and scale the box coordinates in the XML files to match.
  • Use fewer images.
For datasets that stay above the limit, see Size limit.

Sample dataset

The template ships one 1920×1080 aerial traffic frame from the public VisDrone dataset with its VOC annotation (classes such as car and motor). The ingest.yaml above ingests it with no overrides.

Next steps