Skip to content
Search

Data annotation

lastmod 2026-09-30created 2024-01-118 edits

Data annotation is labeling or tagging the relevant information/metadata in a dataset so that machines can understand the information. A dataset can be in any format, such as images, audio files, video footage, or text.

Data is one of the three key elements of AI development. Developing computer recognition engines requires large-scale training data that must be annotated. Such data includes images, sounds, text, and more. Annotations for these types of data include classification, frames, annotations, markings, and so on.

Categories

Labeling caveats

Original work

Corrected work

Data_annotation_Error_Case_01.png
Data_annotation_Error_Case_01_-_Fix.png

The top of the ddrm plate is important, so don't draw it carelessly.

Original work

Corrected work

Data_annotation_Error_Case_02.png
Data_annotation_Error_Case_02_-_Fix.png

The left/right edges of the ddrm plate are important.

Classification

  • Auto-labeling
    • Automates labeling using AI and machine learning algorithms.
    • A model labels data automatically, and a person reviews and corrects it.
  • Semi-automatic Labeling
    • A labeling tool generates initial labels, and a person reviews and corrects them.
    • A way to improve efficiency while maintaining accuracy.
  • Cloud-based Labeling
    • Labeling work is performed through a cloud platform.
    • Easy data storage, collaboration, and accessibility.
  • Collaborative Labeling
    • Provides collaboration features so that several people can label at the same time.
    • Easy project management and division of work.
  • Data Augmentation
    • Transforms labeled data to expand the dataset.
    • A way to improve model performance.

3D point cloud labeling methods

Assigning a class id and an instance id to each point as scalar values (per-point labeling) is the most common representation in 3D point cloud semantic / instance / panoptic segmentation labeling.

Almost all public datasets and training frameworks ultimately converge on the form of two integer arrays (semantic, instance) the same length as the number of points.

However, no official standard (ISO, etc.) exists, and the storage format differs by dataset.

De facto standard formats

Format / source

Storage method

Main use

ASPRS LAS 1.4

The classification field of the point record (codes defined: 2=Ground, 6=Building, etc.). There is no standard field for instance, so Extra Bytes are used

Airborne/terrestrial LiDAR, GIS industry (the only one close to an "official specification")

SemanticKITTI .label

One uint32 per point: lower 16 bits = semantic, upper 16 bits = instance

Autonomous driving LiDAR, widely adopted in the research community

nuScenes lidarseg / panoptic

uint8 semantic per point; panoptic is class * 1000 + instance

Autonomous driving

ScanNet

Mesh vertices + over-segmentation (segs.json) + aggregation.json that groups segments into objects + label mapping .tsv

Indoor RGB-D

S3DIS

Per-instance txt files for each room (chair_1.txt, table_2.txt …) — instances represented per file

Indoor

Pointcept preprocessing format

coord.npy, color.npy, normal.npy, segment.npy, instance.npy in a folder per scene (ignore label is -1)

Training of recent backbones such as PTv3

Even when the storage structure looks different, as with ScanNet and S3DIS, everything is converted into a per-point semantic array + instance array at the loader stage. Therefore the per-point scalar field approach is the most general form as a representation of the source data.

Labeling tools

Segmentation tools

  • CloudCompare — Cut out a region (Segment) → fill a scalar field with a constant → merge. A very common workflow in labs and small industrial projects
  • point_labeler — The tool used to create SemanticKITTI
  • Semantic Segmentation Editor — Made by Hitachi
  • Commercial tools — Segments.ai, Supervisely, BasicAI, etc.

The output of all the tools above is ultimately a per-point label array.

Detection tools (for reference)

  • CVAT, labelCloud, etc. are mainly for 3D bounding box (cuboid) labeling
  • For detection tasks, a different family from segmentation

Practical recommendations

1. Manage the class mapping file separately

  • Write a yaml/json file that specifies the id → name mapping and the ignore label value (usually -1 or 255)
  • Version-controlling it together with the data is the de facto convention

2. Define instance id rules

  • Assign uniquely within a scene
  • Set background/stuff classes to -1 (or 0)

3. Caveats for CloudCompare scalar fields

  • Scalar fields are stored as float by default
  • When exporting to PLY, the scalar_ prefix is added to the property name (e.g., scalar_class)
  • Match the property name in the loader and cast to integer:
# Round float scalar field and cast to int / float 스칼라 필드를 반올림 후 정수로 변환
segment = np.rint(ply["vertex"]["scalar_class"]).astype(np.int32)

4. Separate source and training formats

  • Keep the source as PLY (scalar fields)
  • For training, keep a separate script that converts to the format the framework requires (e.g., Pointcept's segment.npy, instance.npy)
  • Separating the labeling tool from the training code makes management easier

See also

Favorite site

author Zer0 sitemap