Skip to content

Training Guide

Dataset format

modern-yolonas supports two dataset formats:

YOLO format

dataset/
├── images/
│   ├── train/
│   │   ├── img_001.jpg
│   │   └── ...
│   └── val/
│       ├── img_001.jpg
│       └── ...
└── labels/
    ├── train/
    │   ├── img_001.txt    # one line per object
    │   └── ...
    └── val/
        ├── img_001.txt
        └── ...

Each label file has one line per object: class_id x_center y_center width height (normalized 0-1).

COCO format

Standard COCO directory layout with annotations/instances_train2017.json.

Training with the CLI

# Fine-tune from COCO pretrained weights
yolonas train \
    --model yolo_nas_s \
    --data /path/to/dataset \
    --format yolo \
    --epochs 100 \
    --batch-size 16 \
    --lr 2e-4 \
    --pretrained

# Train from scratch
yolonas train \
    --model yolo_nas_m \
    --data /path/to/dataset \
    --format coco \
    --epochs 300 \
    --no-pretrained

Training with Python

from modern_yolonas import yolo_nas_s
from modern_yolonas.data.yolo import YOLODetectionDataset
from modern_yolonas.data.transforms import (
    Compose, HSVAugment, HorizontalFlip, RandomAffine,
    LetterboxResize, Normalize,
)
from modern_yolonas.data.collate import detection_collate_fn
from modern_yolonas.training.trainer import Trainer
from torch.utils.data import DataLoader

model = yolo_nas_s(pretrained=True)

transforms = Compose([
    HSVAugment(),
    HorizontalFlip(),
    RandomAffine(degrees=0.0, translate=0.1, scale=(0.5, 1.5)),
    LetterboxResize(target_size=640),
    Normalize(),
])

train_ds = YOLODetectionDataset(
    "/path/to/data", split="train",
    transforms=transforms, input_size=640,
)
val_ds = YOLODetectionDataset(
    "/path/to/data", split="val",
    transforms=Compose([LetterboxResize(640), Normalize()]),
    input_size=640,
)

train_loader = DataLoader(
    train_ds, batch_size=16, shuffle=True,
    collate_fn=detection_collate_fn, num_workers=8,
)
val_loader = DataLoader(
    val_ds, batch_size=16, shuffle=False,
    collate_fn=detection_collate_fn, num_workers=8,
)

trainer = Trainer(
    model=model,
    train_loader=train_loader,
    val_loader=val_loader,
    epochs=100,
    lr=2e-4,
    output_dir="runs/my_experiment",
)
trainer.train()

Checkpoints

Checkpoints are saved to the output directory:

  • last.pt — latest checkpoint (every epoch)
  • epoch_50.pt, epoch_100.pt, ... — periodic saves

Resume training:

yolonas train --data /path --resume runs/train/last.pt