Skip to content
Back to skills

Detectron2 Custom Data Mapper

ASecurity

Custom Detectron2 data mapper with photometric augmentations that properly transforms images, bounding boxes, and instance masks in sync

  • 61 stars
  • 0 votes
  • 0 copies
  • 1 view
  • Added September 12, 2026
documentationpython

Security analysis

A100/100

Scanned September 12, 2026

npx -y skills add wenmin-wu/ds-skills --skill detectron2-custom-data-mapper --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Detectron2 Custom Data Mapper?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Detectron2 Custom Data Mapper
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/wenmin-wu-detectron2-custom-data-mapper/badge)](https://www.skillsdirectory.com/skills/wenmin-wu-detectron2-custom-data-mapper)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
name: cv-detectron2-custom-data-mapper
description: Custom Detectron2 data mapper with photometric augmentations that properly transforms images, bounding boxes, and instance masks in sync
---

# Detectron2 Custom Data Mapper

## Overview

Detectron2's default data loader applies minimal augmentation. For instance segmentation, you often need photometric augmentations (brightness, contrast, saturation) plus geometric transforms that keep masks and boxes in sync. A custom mapper plugs into `build_detection_train_loader` and applies a chain of `T.Transform` ops that automatically propagate to all annotation types.

## Quick Start

```python
import copy
import torch
from detectron2.data import detection_utils as utils, transforms as T
from detectron2.data import build_detection_train_loader

def custom_mapper(dataset_dict):
    dataset_dict = copy.deepcopy(dataset_dict)
    image = utils.read_image(dataset_dict["file_name"], format="BGR")
    transform_list = [
        T.RandomBrightness(0.9, 1.1),
        T.RandomContrast(0.9, 1.1),
        T.RandomSaturation(0.9, 1.1),
        T.RandomFlip(prob=0.5, horizontal=True, vertical=False),
        T.RandomFlip(prob=0.5, horizontal=False, vertical=True),
    ]
    image, transforms = T.apply_transform_gens(transform_list, image)
    dataset_dict["image"] = torch.as_tensor(
        image.transpose(2, 0, 1).astype("float32"))
    annos = [
        utils.transform_instance_annotations(obj, transforms, image.shape[:2])
        for obj in dataset_dict.pop("annotations")
        if obj.get("iscrowd", 0) == 0
    ]
    instances = utils.annotations_to_instances(annos, image.shape[:2])
    dataset_dict["instances"] = utils.filter_empty_instances(instances)
    return dataset_dict

class AugTrainer(DefaultTrainer):
    @classmethod
    def build_train_loader(cls, cfg):
        return build_detection_train_loader(cfg, mapper=custom_mapper)
```

## Workflow

1. Deep-copy the dataset dict (Detectron2 reuses dicts across epochs)
2. Read image and define a transform chain
3. Apply transforms — `apply_transform_gens` returns the transformed image and the transform object
4. Use `transform_instance_annotations` to apply the same transforms to each annotation
5. Convert to `Instances` and filter empty ones
6. Override `build_train_loader` in a custom Trainer subclass

## Key Decisions

- **Deep copy**: mandatory — without it, augmentations corrupt the original dataset dict
- **iscrowd filter**: skip crowd annotations that break instance-level evaluation
- **filter_empty_instances**: removes annotations with zero-area masks after cropping/flipping
- **Geometric augments**: add `T.ResizeShortestEdge`, `T.RandomCrop` for scale variation

## References

- [Sartorius Segmentation - Detectron2 [Training]](https://www.kaggle.com/code/ammarnassanalhajali/sartorius-segmentation-detectron2-training)

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…