# zkyseu/o2sformer architecture

> Architecture diagram of the GitHub repository zkyseu/o2sformer, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-11-12). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/zkyseu/o2sformer
- Repository: https://github.com/zkyseu/o2sformer

## Overview

O2SFormer is a PyTorch lane-detection system for CULane. The user workflow is to train from configured dataset splits, evaluate predictions with the CULane metric, or load a checkpoint and run image inference for visualization. Its model implementation includes detector variants, lane-prediction heads, transformer components, assignment strategies, and losses; the README also documents a HybridEncoder variant. Several internal model connections are supported by the source index, but the complete detector-to-head wiring is not shown in the excerpts, so that relationship is left unasserted.

Main entry points: [`dnlane/datasets/culane_dataset.py`](https://github.com/zkyseu/o2sformer/blob/main/dnlane/datasets/culane_dataset.py) (CULane dataset), [`dnlane/models/transformer.py`](https://github.com/zkyseu/o2sformer/blob/main/dnlane/models/transformer.py) (Transformer), [`dnlane/models/detection_head.py`](https://github.com/zkyseu/o2sformer/blob/main/dnlane/models/detection_head.py) (Detection head), [`dnlane/models/detection_headv2.py`](https://github.com/zkyseu/o2sformer/blob/main/dnlane/models/detection_headv2.py) (Detection head v2)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_workflow["Training and inference"]
  node_training["Training API<br/>[train.py]"]
  node_inference["Inference API<br/>[inference.py]"]
  node_configs["Model configs"]
  node_evalhook["Evaluation hook<br/>[eval_hook.py]"]
  node_prediction["Lane predictions"]
end

subgraph group_data["CULane data and evaluation"]
  node_dataset["CULane dataset<br/>[culane_dataset.py]"]
  node_formatting["Lane formatting<br/>[lane_formating.py]"]
  node_transforms["Image transforms<br/>[transform.py]"]
  node_metric["CULane metric<br/>[culane_metric.py]"]
end

subgraph group_model["Lane detection model"]
  node_detector["Detector variants<br/>[detector.py]"]
  node_detectorv2["Detector v2<br/>[detectorv2.py]"]
  node_head["Detection head<br/>[detection_head.py]"]
  node_headv2["Detection head v2"]
end

subgraph group_support["Model components"]
  node_lane["Lane representation<br/>[lane.py]"]
  node_transformer["Transformer<br/>[transformer.py]"]
  node_transformerutils["Transformer utilities"]
  node_hybrid["Hybrid encoder<br/>[hybrid_encoder.py]"]
  node_assigners["Assignment strategies<br/>[assigner.py]"]
  node_o2m["One-to-many assigner<br/>[o2m_assigner.py]"]
  node_matchcost["Match costs<br/>[match_cost.py]"]
  node_laneiou["Lane IoU loss<br/>[lane_iou.py]"]
  node_focal["Focal loss<br/>[focal_loss.py]"]
  node_utils["General utilities<br/>[general_utils.py]"]
end

node_user(("User"))

node_user -->|"starts training"| node_training
node_user -->|"requests inference"| node_inference
node_configs -->|"configures training"| node_training
node_inference -->|"builds detector"| node_detector
node_inference -->|"returns predictions"| node_prediction
node_dataset -->|"runs pipeline"| node_formatting
node_formatting -->|"uses transforms"| node_transforms
node_dataset -->|"evaluates predictions"| node_metric
node_evalhook -->|"tests dataloader"| node_dataset
node_detector -->|"uses transformer"| node_transformer
node_detectorv2 -->|"uses transformer"| node_transformer
node_head -->|"uses transformer"| node_transformer
node_head -->|"uses utilities"| node_transformerutils
node_head -->|"uses lane type"| node_lane
node_headv2 -->|"uses utilities"| node_transformerutils
node_headv2 -->|"uses lane type"| node_lane
node_headv2 -->|"uses IoU loss"| node_laneiou
node_hybrid -->|"uses transformer"| node_transformer
node_o2m -->|"uses IoU"| node_laneiou
node_dataset -->|"uses path helper"| node_utils

click node_training "https://github.com/zkyseu/o2sformer/blob/main/dnlane/apis/train.py"
click node_inference "https://github.com/zkyseu/o2sformer/blob/main/dnlane/apis/inference.py"
click node_configs "https://github.com/zkyseu/o2sformer/tree/main/configs"
click node_dataset "https://github.com/zkyseu/o2sformer/blob/main/dnlane/datasets/culane_dataset.py"
click node_formatting "https://github.com/zkyseu/o2sformer/blob/main/dnlane/datasets/pipelines/lane_formating.py"
click node_transforms "https://github.com/zkyseu/o2sformer/blob/main/dnlane/datasets/pipelines/transform.py"
click node_metric "https://github.com/zkyseu/o2sformer/blob/main/dnlane/datasets/culane_metric.py"
click node_evalhook "https://github.com/zkyseu/o2sformer/blob/main/dnlane/hook/eval_hook.py"
click node_detector "https://github.com/zkyseu/o2sformer/blob/main/dnlane/models/detector.py"
click node_detectorv2 "https://github.com/zkyseu/o2sformer/blob/main/dnlane/models/detectorv2.py"
click node_head "https://github.com/zkyseu/o2sformer/blob/main/dnlane/models/detection_head.py"
click node_headv2 "https://github.com/zkyseu/o2sformer/blob/main/dnlane/models/detection_headv2.py"
click node_lane "https://github.com/zkyseu/o2sformer/blob/main/dnlane/models/lane.py"
click node_transformer "https://github.com/zkyseu/o2sformer/blob/main/dnlane/models/transformer.py"
click node_transformerutils "https://github.com/zkyseu/o2sformer/blob/main/dnlane/models/transformer_utils.py"
click node_hybrid "https://github.com/zkyseu/o2sformer/blob/main/dnlane/models/hybrid_encoder.py"
click node_assigners "https://github.com/zkyseu/o2sformer/blob/main/dnlane/models/assigner.py"
click node_o2m "https://github.com/zkyseu/o2sformer/blob/main/dnlane/models/o2m_assigner.py"
click node_matchcost "https://github.com/zkyseu/o2sformer/blob/main/dnlane/models/match_cost.py"
click node_laneiou "https://github.com/zkyseu/o2sformer/blob/main/dnlane/models/losses/lane_iou.py"
click node_focal "https://github.com/zkyseu/o2sformer/blob/main/dnlane/models/losses/focal_loss.py"
click node_utils "https://github.com/zkyseu/o2sformer/blob/main/dnlane/models/utils/general_utils.py"

classDef toneNeutral fill:#f8fafc,stroke:#334155,stroke-width:1.5px,color:#0f172a
classDef toneBlue fill:#dbeafe,stroke:#2563eb,stroke-width:1.5px,color:#172554
classDef toneAmber fill:#fef3c7,stroke:#d97706,stroke-width:1.5px,color:#78350f
classDef toneMint fill:#dcfce7,stroke:#16a34a,stroke-width:1.5px,color:#14532d
classDef toneRose fill:#ffe4e6,stroke:#e11d48,stroke-width:1.5px,color:#881337
classDef toneIndigo fill:#e0e7ff,stroke:#4f46e5,stroke-width:1.5px,color:#312e81
classDef toneTeal fill:#ccfbf1,stroke:#0f766e,stroke-width:1.5px,color:#134e4a
class node_training,node_inference,node_configs,node_evalhook,node_prediction,node_user toneBlue
class node_dataset,node_formatting,node_transforms,node_metric toneAmber
class node_detector,node_detectorv2,node_head,node_headv2 toneMint
class node_lane,node_transformer,node_transformerutils,node_hybrid,node_assigners,node_o2m,node_matchcost,node_laneiou,node_focal,node_utils toneRose
```

## Components

### Training and inference

- [Training API](https://github.com/zkyseu/o2sformer/blob/main/dnlane/apis/train.py): `dnlane/apis/train.py`
- [Inference API](https://github.com/zkyseu/o2sformer/blob/main/dnlane/apis/inference.py): `dnlane/apis/inference.py`
- [Model configs](https://github.com/zkyseu/o2sformer/tree/main/configs): `configs`
- [Evaluation hook](https://github.com/zkyseu/o2sformer/blob/main/dnlane/hook/eval_hook.py): `dnlane/hook/eval_hook.py`
- **Lane predictions**

### CULane data and evaluation

- [CULane dataset](https://github.com/zkyseu/o2sformer/blob/main/dnlane/datasets/culane_dataset.py): `dnlane/datasets/culane_dataset.py`
- [Lane formatting](https://github.com/zkyseu/o2sformer/blob/main/dnlane/datasets/pipelines/lane_formating.py): `dnlane/datasets/pipelines/lane_formating.py`
- [Image transforms](https://github.com/zkyseu/o2sformer/blob/main/dnlane/datasets/pipelines/transform.py): `dnlane/datasets/pipelines/transform.py`
- [CULane metric](https://github.com/zkyseu/o2sformer/blob/main/dnlane/datasets/culane_metric.py): `dnlane/datasets/culane_metric.py`

### Lane detection model

- [Detector variants](https://github.com/zkyseu/o2sformer/blob/main/dnlane/models/detector.py): `dnlane/models/detector.py`
- [Detector v2](https://github.com/zkyseu/o2sformer/blob/main/dnlane/models/detectorv2.py): `dnlane/models/detectorv2.py`
- [Detection head](https://github.com/zkyseu/o2sformer/blob/main/dnlane/models/detection_head.py): `dnlane/models/detection_head.py`
- [Detection head v2](https://github.com/zkyseu/o2sformer/blob/main/dnlane/models/detection_headv2.py): `dnlane/models/detection_headv2.py`

### Model components

- [Lane representation](https://github.com/zkyseu/o2sformer/blob/main/dnlane/models/lane.py): `dnlane/models/lane.py`
- [Transformer](https://github.com/zkyseu/o2sformer/blob/main/dnlane/models/transformer.py): `dnlane/models/transformer.py`
- [Transformer utilities](https://github.com/zkyseu/o2sformer/blob/main/dnlane/models/transformer_utils.py): `dnlane/models/transformer_utils.py`
- [Hybrid encoder](https://github.com/zkyseu/o2sformer/blob/main/dnlane/models/hybrid_encoder.py): `dnlane/models/hybrid_encoder.py`
- [Assignment strategies](https://github.com/zkyseu/o2sformer/blob/main/dnlane/models/assigner.py): `dnlane/models/assigner.py`
- [One-to-many assigner](https://github.com/zkyseu/o2sformer/blob/main/dnlane/models/o2m_assigner.py): `dnlane/models/o2m_assigner.py`
- [Match costs](https://github.com/zkyseu/o2sformer/blob/main/dnlane/models/match_cost.py): `dnlane/models/match_cost.py`
- [Lane IoU loss](https://github.com/zkyseu/o2sformer/blob/main/dnlane/models/losses/lane_iou.py): `dnlane/models/losses/lane_iou.py`
- [Focal loss](https://github.com/zkyseu/o2sformer/blob/main/dnlane/models/losses/focal_loss.py): `dnlane/models/losses/focal_loss.py`
- [General utilities](https://github.com/zkyseu/o2sformer/blob/main/dnlane/models/utils/general_utils.py): `dnlane/models/utils/general_utils.py`

### Other components

- **User**

## Connections

- User → Training API: starts training (evidence: `README.md`)
- User → Inference API: requests inference
- Model configs → Training API: configures training (evidence: `README.md`)
- Inference API → Detector variants: builds detector (evidence: `dnlane/apis/inference.py`)
- Inference API → Lane predictions: returns predictions (evidence: `dnlane/apis/inference.py`)
- CULane dataset → Lane formatting: runs pipeline (evidence: `dnlane/datasets/culane_dataset.py`)
- Lane formatting → Image transforms: uses transforms (evidence: `dnlane/datasets/pipelines/lane_formating.py`)
- CULane dataset → CULane metric: evaluates predictions (evidence: `dnlane/datasets/culane_dataset.py`)
- Evaluation hook → CULane dataset: tests dataloader (evidence: `dnlane/hook/eval_hook.py`)
- Detector variants → Transformer: uses transformer (evidence: `dnlane/models/detector.py`)
- Detector v2 → Transformer: uses transformer (evidence: `dnlane/models/detectorv2.py`)
- Detection head → Transformer: uses transformer (evidence: `dnlane/models/detection_head.py`)
- Detection head → Transformer utilities: uses utilities (evidence: `dnlane/models/detection_head.py`)
- Detection head → Lane representation: uses lane type (evidence: `dnlane/models/detection_head.py`)
- Detection head v2 → Transformer utilities: uses utilities (evidence: `dnlane/models/detection_headv2.py`)
- Detection head v2 → Lane representation: uses lane type (evidence: `dnlane/models/detection_headv2.py`)
- Detection head v2 → Lane IoU loss: uses IoU loss (evidence: `dnlane/models/detection_headv2.py`)
- Hybrid encoder → Transformer: uses transformer (evidence: `dnlane/models/hybrid_encoder.py`)
- One-to-many assigner → Lane IoU loss: uses IoU (evidence: `dnlane/models/o2m_assigner.py`)
- CULane dataset → General utilities: uses path helper (evidence: `dnlane/datasets/culane_dataset.py`)
