Skip to content

Reference for ultralytics/models/yolo/detect/train.py

Improvements

This page is sourced from https://github.com/ultralytics/ultralytics/blob/main/ultralytics/models/yolo/detect/train.py. Have an improvement or example to add? Open a Pull Request — thank you! 🙏


class ultralytics.models.yolo.detect.train.DetectionTrainer

DetectionTrainer(self, cfg = DEFAULT_CFG, overrides: dict[str, Any] | None = None, _callbacks = None)

Bases: BaseTrainer

A class extending the BaseTrainer class for training based on a detection model.

This trainer specializes in object detection tasks, handling the specific requirements for training YOLO models for object detection including dataset building, data loading, preprocessing, and model configuration.

Args

NameTypeDescriptionDefault
cfgdict, optionalDefault configuration dictionary containing training parameters.DEFAULT_CFG
overridesdict, optionalDictionary of parameter overrides for the default configuration.None
_callbackslist, optionalList of callback functions to be executed during training.None

Attributes

NameTypeDescription
modelDetectionModelThe YOLO detection model being trained.
datadictDictionary containing dataset information including class names and number of classes.
loss_namestupleNames of the loss components used in training (box_loss, cls_loss, dfl_loss).

Methods

NameDescription
auto_batchGet optimal batch size by calculating memory occupation of model.
build_datasetBuild YOLO Dataset for training or validation.
get_dataloaderConstruct and return dataloader for the specified mode.
get_modelReturn a YOLO detection model.
get_validatorReturn a DetectionValidator for YOLO model validation.
label_loss_itemsReturn a loss dict with labeled training loss items tensor.
plot_training_labelsCreate a labeled training plot of the YOLO model.
plot_training_samplesPlot training samples with their annotations.
preprocess_batchPreprocess a batch of images by scaling and converting to float.
progress_stringReturn a formatted string of training progress with epoch, GPU memory, loss, instances and size.
set_model_attributesSet model attributes based on dataset information.

Examples

>>> from ultralytics.models.yolo.detect import DetectionTrainer
>>> args = dict(model="yolo11n.pt", data="coco8.yaml", epochs=3)
>>> trainer = DetectionTrainer(overrides=args)
>>> trainer.train()
Source code in ultralytics/models/yolo/detect/train.pyView on GitHub
class DetectionTrainer(BaseTrainer):
    """A class extending the BaseTrainer class for training based on a detection model.

    This trainer specializes in object detection tasks, handling the specific requirements for training YOLO models for
    object detection including dataset building, data loading, preprocessing, and model configuration.

    Attributes:
        model (DetectionModel): The YOLO detection model being trained.
        data (dict): Dictionary containing dataset information including class names and number of classes.
        loss_names (tuple): Names of the loss components used in training (box_loss, cls_loss, dfl_loss).

    Methods:
        build_dataset: Build YOLO dataset for training or validation.
        get_dataloader: Construct and return dataloader for the specified mode.
        preprocess_batch: Preprocess a batch of images by scaling and converting to float.
        set_model_attributes: Set model attributes based on dataset information.
        get_model: Return a YOLO detection model.
        get_validator: Return a validator for model evaluation.
        label_loss_items: Return a loss dictionary with labeled training loss items.
        progress_string: Return a formatted string of training progress.
        plot_training_samples: Plot training samples with their annotations.
        plot_training_labels: Create a labeled training plot of the YOLO model.
        auto_batch: Calculate optimal batch size based on model memory requirements.

    Examples:
        >>> from ultralytics.models.yolo.detect import DetectionTrainer
        >>> args = dict(model="yolo11n.pt", data="coco8.yaml", epochs=3)
        >>> trainer = DetectionTrainer(overrides=args)
        >>> trainer.train()
    """

    def __init__(self, cfg=DEFAULT_CFG, overrides: dict[str, Any] | None = None, _callbacks=None):
        """Initialize a DetectionTrainer object for training YOLO object detection model training.

        Args:
            cfg (dict, optional): Default configuration dictionary containing training parameters.
            overrides (dict, optional): Dictionary of parameter overrides for the default configuration.
            _callbacks (list, optional): List of callback functions to be executed during training.
        """
        super().__init__(cfg, overrides, _callbacks)


method ultralytics.models.yolo.detect.train.DetectionTrainer.auto_batch

def auto_batch(self)

Get optimal batch size by calculating memory occupation of model.

Returns

TypeDescription
intOptimal batch size.
Source code in ultralytics/models/yolo/detect/train.pyView on GitHub
def auto_batch(self):
    """Get optimal batch size by calculating memory occupation of model.

    Returns:
        (int): Optimal batch size.
    """
    with override_configs(self.args, overrides={"cache": False}) as self.args:
        train_dataset = self.build_dataset(self.data["train"], mode="train", batch=16)
    max_num_obj = max(len(label["cls"]) for label in train_dataset.labels) * 4  # 4 for mosaic augmentation
    del train_dataset  # free memory
    return super().auto_batch(max_num_obj)


method ultralytics.models.yolo.detect.train.DetectionTrainer.build_dataset

def build_dataset(self, img_path: str, mode: str = "train", batch: int | None = None)

Build YOLO Dataset for training or validation.

Args

NameTypeDescriptionDefault
img_pathstrPath to the folder containing images.required
modestr'train' mode or 'val' mode, users are able to customize different augmentations for each mode."train"
batchint, optionalSize of batches, this is for 'rect' mode.None

Returns

TypeDescription
DatasetYOLO dataset object configured for the specified mode.
Source code in ultralytics/models/yolo/detect/train.pyView on GitHub
def build_dataset(self, img_path: str, mode: str = "train", batch: int | None = None):
    """Build YOLO Dataset for training or validation.

    Args:
        img_path (str): Path to the folder containing images.
        mode (str): 'train' mode or 'val' mode, users are able to customize different augmentations for each mode.
        batch (int, optional): Size of batches, this is for 'rect' mode.

    Returns:
        (Dataset): YOLO dataset object configured for the specified mode.
    """
    gs = max(int(unwrap_model(self.model).stride.max() if self.model else 0), 32)
    return build_yolo_dataset(self.args, img_path, batch, self.data, mode=mode, rect=mode == "val", stride=gs)


method ultralytics.models.yolo.detect.train.DetectionTrainer.get_dataloader

def get_dataloader(self, dataset_path: str, batch_size: int = 16, rank: int = 0, mode: str = "train")

Construct and return dataloader for the specified mode.

Args

NameTypeDescriptionDefault
dataset_pathstrPath to the dataset.required
batch_sizeintNumber of images per batch.16
rankintProcess rank for distributed training.0
modestr'train' for training dataloader, 'val' for validation dataloader."train"

Returns

TypeDescription
DataLoaderPyTorch dataloader object.
Source code in ultralytics/models/yolo/detect/train.pyView on GitHub
def get_dataloader(self, dataset_path: str, batch_size: int = 16, rank: int = 0, mode: str = "train"):
    """Construct and return dataloader for the specified mode.

    Args:
        dataset_path (str): Path to the dataset.
        batch_size (int): Number of images per batch.
        rank (int): Process rank for distributed training.
        mode (str): 'train' for training dataloader, 'val' for validation dataloader.

    Returns:
        (DataLoader): PyTorch dataloader object.
    """
    assert mode in {"train", "val"}, f"Mode must be 'train' or 'val', not {mode}."
    with torch_distributed_zero_first(rank):  # init dataset *.cache only once if DDP
        dataset = self.build_dataset(dataset_path, mode, batch_size)
    shuffle = mode == "train"
    if getattr(dataset, "rect", False) and shuffle:
        LOGGER.warning("'rect=True' is incompatible with DataLoader shuffle, setting shuffle=False")
        shuffle = False
    return build_dataloader(
        dataset,
        batch=batch_size,
        workers=self.args.workers if mode == "train" else self.args.workers * 2,
        shuffle=shuffle,
        rank=rank,
        drop_last=self.args.compile and mode == "train",
    )


method ultralytics.models.yolo.detect.train.DetectionTrainer.get_model

def get_model(self, cfg: str | None = None, weights: str | None = None, verbose: bool = True)

Return a YOLO detection model.

Args

NameTypeDescriptionDefault
cfgstr, optionalPath to model configuration file.None
weightsstr, optionalPath to model weights.None
verboseboolWhether to display model information.True

Returns

TypeDescription
DetectionModelYOLO detection model.
Source code in ultralytics/models/yolo/detect/train.pyView on GitHub
def get_model(self, cfg: str | None = None, weights: str | None = None, verbose: bool = True):
    """Return a YOLO detection model.

    Args:
        cfg (str, optional): Path to model configuration file.
        weights (str, optional): Path to model weights.
        verbose (bool): Whether to display model information.

    Returns:
        (DetectionModel): YOLO detection model.
    """
    model = DetectionModel(cfg, nc=self.data["nc"], ch=self.data["channels"], verbose=verbose and RANK == -1)
    if weights:
        model.load(weights)
    return model


method ultralytics.models.yolo.detect.train.DetectionTrainer.get_validator

def get_validator(self)

Return a DetectionValidator for YOLO model validation.

Source code in ultralytics/models/yolo/detect/train.pyView on GitHub
def get_validator(self):
    """Return a DetectionValidator for YOLO model validation."""
    self.loss_names = "box_loss", "cls_loss", "dfl_loss"
    return yolo.detect.DetectionValidator(
        self.test_loader, save_dir=self.save_dir, args=copy(self.args), _callbacks=self.callbacks
    )


method ultralytics.models.yolo.detect.train.DetectionTrainer.label_loss_items

def label_loss_items(self, loss_items: list[float] | None = None, prefix: str = "train")

Return a loss dict with labeled training loss items tensor.

Args

NameTypeDescriptionDefault
loss_itemslist[float], optionalList of loss values.None
prefixstrPrefix for keys in the returned dictionary."train"

Returns

TypeDescription
dict | listDictionary of labeled loss items if loss_items is provided, otherwise list of keys.
Source code in ultralytics/models/yolo/detect/train.pyView on GitHub
def label_loss_items(self, loss_items: list[float] | None = None, prefix: str = "train"):
    """Return a loss dict with labeled training loss items tensor.

    Args:
        loss_items (list[float], optional): List of loss values.
        prefix (str): Prefix for keys in the returned dictionary.

    Returns:
        (dict | list): Dictionary of labeled loss items if loss_items is provided, otherwise list of keys.
    """
    keys = [f"{prefix}/{x}" for x in self.loss_names]
    if loss_items is not None:
        loss_items = [round(float(x), 5) for x in loss_items]  # convert tensors to 5 decimal place floats
        return dict(zip(keys, loss_items))
    else:
        return keys


method ultralytics.models.yolo.detect.train.DetectionTrainer.plot_training_labels

def plot_training_labels(self)

Create a labeled training plot of the YOLO model.

Source code in ultralytics/models/yolo/detect/train.pyView on GitHub
def plot_training_labels(self):
    """Create a labeled training plot of the YOLO model."""
    boxes = np.concatenate([lb["bboxes"] for lb in self.train_loader.dataset.labels], 0)
    cls = np.concatenate([lb["cls"] for lb in self.train_loader.dataset.labels], 0)
    plot_labels(boxes, cls.squeeze(), names=self.data["names"], save_dir=self.save_dir, on_plot=self.on_plot)


method ultralytics.models.yolo.detect.train.DetectionTrainer.plot_training_samples

def plot_training_samples(self, batch: dict[str, Any], ni: int) -> None

Plot training samples with their annotations.

Args

NameTypeDescriptionDefault
batchdict[str, Any]Dictionary containing batch data.required
niintNumber of iterations.required
Source code in ultralytics/models/yolo/detect/train.pyView on GitHub
def plot_training_samples(self, batch: dict[str, Any], ni: int) -> None:
    """Plot training samples with their annotations.

    Args:
        batch (dict[str, Any]): Dictionary containing batch data.
        ni (int): Number of iterations.
    """
    plot_images(
        labels=batch,
        paths=batch["im_file"],
        fname=self.save_dir / f"train_batch{ni}.jpg",
        on_plot=self.on_plot,
    )


method ultralytics.models.yolo.detect.train.DetectionTrainer.preprocess_batch

def preprocess_batch(self, batch: dict) -> dict

Preprocess a batch of images by scaling and converting to float.

Args

NameTypeDescriptionDefault
batchdictDictionary containing batch data with 'img' tensor.required

Returns

TypeDescription
dictPreprocessed batch with normalized images.
Source code in ultralytics/models/yolo/detect/train.pyView on GitHub
def preprocess_batch(self, batch: dict) -> dict:
    """Preprocess a batch of images by scaling and converting to float.

    Args:
        batch (dict): Dictionary containing batch data with 'img' tensor.

    Returns:
        (dict): Preprocessed batch with normalized images.
    """
    for k, v in batch.items():
        if isinstance(v, torch.Tensor):
            batch[k] = v.to(self.device, non_blocking=self.device.type == "cuda")
    batch["img"] = batch["img"].float() / 255
    if self.args.multi_scale:
        imgs = batch["img"]
        sz = (
            random.randrange(int(self.args.imgsz * 0.5), int(self.args.imgsz * 1.5 + self.stride))
            // self.stride
            * self.stride
        )  # size
        sf = sz / max(imgs.shape[2:])  # scale factor
        if sf != 1:
            ns = [
                math.ceil(x * sf / self.stride) * self.stride for x in imgs.shape[2:]
            ]  # new shape (stretched to gs-multiple)
            imgs = nn.functional.interpolate(imgs, size=ns, mode="bilinear", align_corners=False)
        batch["img"] = imgs
    return batch


method ultralytics.models.yolo.detect.train.DetectionTrainer.progress_string

def progress_string(self)

Return a formatted string of training progress with epoch, GPU memory, loss, instances and size.

Source code in ultralytics/models/yolo/detect/train.pyView on GitHub
def progress_string(self):
    """Return a formatted string of training progress with epoch, GPU memory, loss, instances and size."""
    return ("\n" + "%11s" * (4 + len(self.loss_names))) % (
        "Epoch",
        "GPU_mem",
        *self.loss_names,
        "Instances",
        "Size",
    )


method ultralytics.models.yolo.detect.train.DetectionTrainer.set_model_attributes

def set_model_attributes(self)

Set model attributes based on dataset information.

Source code in ultralytics/models/yolo/detect/train.pyView on GitHub
def set_model_attributes(self):
    """Set model attributes based on dataset information."""
    # Nl = de_parallel(self.model).model[-1].nl  # number of detection layers (to scale hyps)
    # self.args.box *= 3 / nl  # scale to layers
    # self.args.cls *= self.data["nc"] / 80 * 3 / nl  # scale to classes and layers
    # self.args.cls *= (self.args.imgsz / 640) ** 2 * 3 / nl  # scale to image size and layers
    self.model.nc = self.data["nc"]  # attach number of classes to model
    self.model.names = self.data["names"]  # attach class names to model
    self.model.args = self.args  # attach hyperparameters to model





📅 Created 2 years ago ✏️ Updated 10 days ago
glenn-jocherjk4eBurhan-Q