User Guide: Model Training¶
CoreCV provides a polymorphic training engine managed by CoreTrainer and accessible via CoreModel.train(). It supports configuration via YAML files, Python dictionaries, TrainingConfig dataclasses, or direct keyword arguments (**kwargs).
1. Complete Parameter Reference¶
CoreModel.__init__() Parameters¶
| Parameter | Type Hint | Default | Description |
|---|---|---|---|
model |
nn.Module \| str \| Path \| dict |
Required | A CoreCV nn.Module, plain backbone string name (e.g. "resnet18"), raw config dict, path to .pt/.pth checkpoint, or path to .yaml/.yml configuration file. |
task |
Literal["classification", "segmentation", "detection"] |
Required | Task type discriminant. Determines dataset structures, heads, and loss functions. |
input_size |
tuple[int, int] |
(224, 224) |
Target image dimensions (height, width) used for data preprocessing and transform pipelines. |
device |
torch.device \| None |
None |
Target execution device. If None, automatically detects CUDA when available, falling back to CPU. |
num_classes |
int \| None |
None |
Number of output classes. If None, automatically inferred from the model head or config metadata. |
pretrained |
bool |
True |
Whether to load pretrained backbone weights when initializing from a backbone name string or config dict. |
neck |
str \| None |
None |
Registered neck name (e.g. "fpn", "panet"). Overrides task default when initializing from string or dict. |
head |
str \| None |
None |
Registered head name (e.g. "decoupled_anchor_free", "resunet_decoder"). Overrides task default when initializing. |
**kwargs |
Any |
None | Additional configuration parameters (e.g. neck_channels=128, decoder_channels=128, dropout=0.1) forwarded to component constructors. |
CoreModel.train() & TrainingConfig Parameters¶
| Parameter | Type Hint | Default | Validation & Behavior |
|---|---|---|---|
config |
str \| dict \| TrainingConfig \| None |
None |
Polymorphic config container. Accepts .yaml file path, Python dict, TrainingConfig instance, or None. |
target_hardware |
str |
"server" |
Hardware profile ("edge" or "server"). "edge" applies activation rewrites (GELU→ReLU, SiLU→Hardswish) and LayerNorm collapses before building the optimizer. |
epochs |
int |
100 |
Total training epochs. Must be >= 1. |
lr |
float |
0.001 |
Base learning rate for optimizer. Must be > 0.0. |
batch_size |
int |
32 |
Batch size per device. Must be >= 1. |
optimizer |
str |
"adamw" |
Optimizer choice. Valid options: "adamw", "adam", "sgd". |
scheduler |
str \| None |
None |
Learning rate scheduler. Valid options: "cosine", "step", "none", or None. |
amp |
bool |
True |
Enables Automatic Mixed Precision via torch.amp.autocast. |
grad_accum |
int |
1 |
Gradient accumulation steps. Loss scaled by 1 / grad_accum. Must be >= 1. |
clip_grad |
float \| None |
1.0 |
Max gradient norm for clip_grad_norm_. None disables clipping. |
ema |
bool |
True |
Enables Exponential Moving Average (EMA) shadow weights. |
ema_decay |
float |
0.9999 |
EMA decay factor. Must be strictly within (0.0, 1.0). |
device |
str \| None |
None |
Target device override (e.g. "cuda:0", "cpu"). |
output_dir |
str |
"./checkpoints" |
Directory path for saving checkpoints and training history. |
2. Practical Examples: Detection vs. Segmentation¶
import torch
from torch.utils.data import DataLoader
from corecv.api import CoreModel
from corecv.losses.detection import DetectionLoss
from corecv.data.datasets.detection import CocoDetectionDataset
# 1. Initialize Detection Model
model = CoreModel(
model="configs/yolo_detection.yaml",
task="detection",
input_size=(640, 640),
num_classes=80,
)
# 2. Setup Dataset and Loaders
# Note:
# - `transforms=True`: Automatically applies standard task augmentations (flips, rotations, resize, ImageNet normalization).
# - `transforms=False` (or omitted): Applies safe baseline preprocessing (resize to image_size, normalize to [0.0, 1.0], Float32 Tensor).
train_dataset = CocoDetectionDataset(
img_folder="coco/images/train2017",
ann_file="coco/annotations/instances_train2017.json",
img_size=(640, 640),
transforms=True, # Enables standard augmentations
)
train_loader = DataLoader(train_dataset, batch_size=16, shuffle=True)
# 3. Configure Loss Function & Loaders
(model
.set_train_dataloader(train_loader)
.set_loss_fn(DetectionLoss(num_classes=80)))
# 4. Execute Edge-Aware Training
history = model.train(
epochs=50,
lr=1e-3,
optimizer="adamw",
scheduler="cosine",
amp=True,
target_hardware="edge", # Applies GELU->ReLU, SiLU->Hardswish rewrites
)
import torch
from torch.utils.data import DataLoader
from corecv.api import CoreModel
from corecv.losses.segmentation import SegmentationLoss
from corecv.data.datasets.segmentation import SegmentationDataset
# 1. Initialize Segmentation Model
model = CoreModel(
model="configs/deeplabv3_segm.yaml",
task="segmentation",
input_size=(512, 512),
num_classes=19,
)
# 2. Setup Segmentation Dataset
train_dataset = SegmentationDataset(
image_dir="cityscapes/leftImg8bit/train",
mask_dir="cityscapes/gtFine/train",
img_size=(512, 512),
)
train_loader = DataLoader(train_dataset, batch_size=8, shuffle=True)
# 3. Configure Loss Function & Loaders
(model
.set_train_dataloader(train_loader)
.set_loss_fn(SegmentationLoss(num_classes=19)))
# 4. Execute Server-Grade Training with EMA
history = model.train(
epochs=100,
lr=5e-4,
batch_size=8,
optimizer="adamw",
scheduler="cosine",
ema=True,
ema_decay=0.999,
target_hardware="server",
)
3. Polymorphic Model Initialization & Training Configurations¶
Model Initialization Options (CoreModel)¶
# 1. Plain backbone string name
model = CoreModel("resnet18", task="classification", num_classes=10)
# 2. Plain backbone string with direct neck, head, and channel overrides
model = CoreModel(
"resnet50",
task="detection",
neck="panet", # Registered neck name
head="query_detection", # Registered head name
neck_channels=128, # Dynamic kwarg forwarded to neck constructor
num_classes=80,
)
# 3. Raw configuration dictionary
model = CoreModel(
model={
"model_name": "convnext_tiny",
"head_type": "resunet_decoder",
"decoder_channels": 128,
},
task="segmentation",
num_classes=19,
)
# 4. YAML configuration file
model = CoreModel("configs/yolo_detection.yaml", task="detection")
# 5. Checkpoint file (.pt / .pth)
model = CoreModel("checkpoints/model_epoch_50.pt", task="detection")
1-Line Training (Zero Boilerplate)¶
CoreModel supports fully automatic dataset loading, loss instantiation, and training execution. Simply pass your dataset path (data="path/to/dataset") or a full configuration (dict or .yaml) and call model.train() directly without manually instantiating DataLoader, Dataset, or Loss functions!
# Option 1: Everything defined in a single YAML file
model = CoreModel("configs/detection_config.yaml")
model.train() # Builds model, dataset, dataloader, loss, and runs training loop!
# Option 2: Everything defined in a single Python dictionary
config = {
"model_name": "resnet50",
"task": "detection",
"num_classes": 80,
"neck_type": "panet",
"data": "path/to/coco_dataset",
"epochs": 50,
"batch_size": 16,
"target_hardware": "edge",
}
model = CoreModel(config)
model.train() # Auto-executes complete training pipeline!
# Option 3: Backbone string with direct train kwargs (or Roboflow data.yaml)
model = CoreModel("resnet50", task="detection", num_classes=80)
# Supports Roboflow data.yaml directly (auto-detects train/val paths and YOLO format):
model.train(data="path/to/roboflow/data.yaml", epochs=50, batch_size=16)
Training Configuration Options (model.train())¶
# Method A: Direct keyword arguments
model.train(epochs=20, lr=0.001, batch_size=16, target_hardware="edge")
# Method B: Python dictionary
model.train({"epochs": 20, "lr": 0.001, "batch_size": 16, "target_hardware": "edge"})
# Method C: YAML Configuration file
model.train("configs/train_params.yaml")
# Method D: Validated TrainingConfig dataclass
from corecv.api.model import TrainingConfig
cfg = TrainingConfig(epochs=20, lr=0.001, batch_size=16, target_hardware="edge")
model.train(cfg)