# 概念

## 概述

在深入了解数据准备和模型训练之前，理解使 LuxonisTrain 高度灵活且可定制的核心概念至关重要。本节将带您了解 配置 和 自定义 的基础知识。

## 配置

LuxonisTrain 使用 YAML 配置文件来定义训练流程的每个方面，从模型架构到优化设置，为您配置训练过程提供了灵活性。本页将指导您了解各种可用的配置选项，确保您可以根据需要定制工具。有关所有参数、可能取值和默认设置的完整列表，请访问
[LuxonisTrain 配置参考](https://github.com/luxonis/luxonis-train/blob/main/configs/README.md)。

### 配置组件

 * 模型（Model）：定义模型架构，包括节点、损失函数、可视化器和指标。
 * 加载器（Loader）：通过选择合适的数据集来配置数据加载。有关如何创建数据集的更多详情，请参阅
   [数据准备](https://docs.luxonis.com/software-v3/ai-inference/model-source/training/luxonis-train/data-preparation.md) 部分。
 * 训练器（Trainer）：指定训练参数，包括批量大小、epoch 数、预处理（归一化、数据增强）、优化器、调度器、回调等。更多详情请参阅
   [训练](https://docs.luxonis.com/software-v3/ai-inference/model-source/training/luxonis-train/training.md) 部分。
 * 跟踪器（Tracker）：监控并记录训练指标以供分析。更多详情请参阅
   [跟踪](https://docs.luxonis.com/software-v3/ai-inference/model-source/training/luxonis-train/training.md) 部分。
 * 导出器（Exporter）：定义训练后模型的导出、存档和转换设置。更多详情请参阅
   [导出](https://docs.luxonis.com/software-v3/ai-inference/model-source/training/luxonis-train/exporting.md) 部分。
 * 调优器（Tuner）：调优超参数以优化模型性能。更多详情请参阅
   [超参数调优](https://docs.luxonis.com/software-v3/ai-inference/model-source/training/luxonis-train/training.md) 部分。

### 示例配置文件

以下是一个示例 YAML 配置文件，帮助您了解如何构建 LuxonisTrain 设置：

```yaml
model:
  name: model_name

  # 使用预定义的检测模型而不是手动定义架构
  predefined_model:
    name: DetectionModel
    params:
      variant: light
      loss_params:
        iou_type: "siou"
        n_warmup_epochs: 0

# 数据集配置：从 Roboflow 下载并解析 COCO 数据集
loader:
  params:
    dataset_name: coco_test
    dataset_dir: "roboflow://team-roboflow/coco-128/2/coco"

trainer:
  batch_size: 8
  epochs: 200
  n_workers: 8
  validation_interval: 10

  preprocessing:
    train_image_size: [384, 384]

    # 使用 ImageNet 标准进行图像归一化
    normalize:
      active: true

    # 使用 Albumentations 库进行图像增强
    augmentations:
      - name: Defocus
      - name: Sharpen
      - name: Flip

  callbacks:
    - name: ConvertOnTrainEnd
    - name: TestOnTrainEnd

  optimizer:
    name: SGD
    params:
      lr: 0.02

  scheduler:
    name: ConstantLR
```

上例中的数据集是使用 LuxonisML 解析器解析的。要了解更多信息，请参阅 [LuxonisParser
文档](https://docs.luxonis.com/software-v3/ai-inference/model-source/training/luxonis-ml/luxonis-parser.md)。

此示例演示了如何使用预定义检测模型，您可以进一步探索
[此处](https://github.com/luxonis/luxonis-train/tree/main/luxonis_train/config/predefined_models#detectionmodel)。

## 预定义模型

您无需从头开始设计架构；可以根据要解决的任务使用预定义模型。这些模型经过充分测试，速度快且准确。您可以查看所有预定义模型
[此处](https://github.com/luxonis/luxonis-train/blob/main/luxonis_train/config/predefined_models/README.md)。

## 自定义

LuxonisTrain
的模块化架构允许您自定义和扩展框架以满足特定需求。您可以自定义加载器（Loaders）、节点（Nodes）、损失函数（Losses）、指标（Metrics）、可视化器（Visualizers）、回调（Callbacks）、优化器（Optimizers）和调度器（Schedulers）等组件。此外，训练策略也可以完全自定义，允许您为不同的参数组设置不同的学习率，对不同的权重应用不同的调度器，并创建复杂的预热阶段。这种精细控制可实现复杂的优化策略，显著提高模型收敛性和性能。

### 自定义组件

要实现自定义组件，请继承相应的基类并注册它。以下是一些示例：

### 示例：自定义回调

```python
import lightning.pytorch as pl

from luxonis_train import LuxonisLightningModule
from luxonis_train.registry import CALLBACKS

@CALLBACKS.register()
class CustomCallback(pl.Callback):
    def __init__(self, message: str, **kwargs):
        super().__init__(**kwargs)
        self.message = message

    # 将在每个训练 epoch 结束时被调用。
    # 请查阅 PyTorch Lightning 文档以了解更多回调方法。
    def on_train_epoch_end(
        self,
        trainer: pl.Trainer,
        pl_module: LuxonisLightningModule,
    ) -> None:
        print(self.message)
```

### 示例：自定义损失函数

```python
from torch import Tensor

from luxonis_train import BaseLoss, Tasks

# `BaseNode`、`BaseLoss`、`BaseMetric`
# 和 `BaseVisualizer` 的子类会自动注册。
class CustomLoss(BaseLoss):
    supported_tasks = [Tasks.CLASSIFICATION, Tasks.SEGMENTATION]

    def __init__(self, smoothing: float, **kwargs):
        super().__init__(**kwargs)
        self.smoothing = smoothing

    def forward(self, predictions: Tensor, targets: Tensor) -> Tensor:
        # 在此实现实际的损失逻辑。
        value = predictions.sum() * self.smoothing
        return value.abs()
```

### 在配置中使用自定义组件

要在训练配置中使用自定义组件，请在 YAML 文件中指定组件名称和参数。以下是一个示例：

```yaml
model:
  nodes:
  - name: SegmentationHead
    losses:
    - name: CustomLoss
      params:
        smoothing: 0.0001

trainer:
  callbacks:
    - name: CustomCallback
      params:
        lr: "Hello from the custom callback!"
```

### 在训练中包含自定义组件

创建自定义组件后，您需要在开始训练之前导入它们。有两种方法可以实现：

#### 使用 CLI

```bash
luxonis_train --source custom_components.py train --config config.yaml
```

#### 使用 Python API

```python
# 首先导入自定义组件
from custom_components import *
from luxonis_train import LuxonisModel

model = LuxonisModel("config.yaml")
model.train()
```

两种方法都可确保您的自定义组件在训练过程中被注册并可用。
