## Callbacks

Ultralytics framework supports callbacks as entry points in strategic stages of train, val, export, and predict modes.
Each callback accepts a `Trainer`, `Validator`, or `Predictor` object depending on the operation type. All properties of
these objects can be found in Reference section of the docs.

## Examples

### Returning additional information with Prediction

In this example, we want to return the original frame with each result object. Here's how we can do that

```python
def on_predict_batch_end(predictor):
    # results -> List[batch_size]
    _, _, im0s, _, _ = predictor.batch
    im0s = im0s if isinstance(im0s, list) else [im0s]
    predictor.results = zip(predictor.results, im0s)

model = YOLO(f'yolov8n.pt')
model.add_callback("on_predict_batch_end", on_predict_batch_end)
for (result, frame) in model.track/predict():
    pass
```

## All callbacks

Here are all supported callbacks.

### Trainer

`on_pretrain_routine_start`

`on_pretrain_routine_end`

`on_train_start`

`on_train_epoch_start`

`on_train_batch_start`

`optimizer_step`

`on_before_zero_grad`

`on_train_batch_end`

`on_train_epoch_end`

`on_fit_epoch_end`

`on_model_save`

`on_train_end`

`on_params_update`

`teardown`

### Validator

`on_val_start`

`on_val_batch_start`

`on_val_batch_end`

`on_val_end`

### Predictor

`on_predict_start`

`on_predict_batch_start`

`on_predict_postprocess_end`

`on_predict_batch_end`

`on_predict_end`

### Exporter

`on_export_start`

`on_export_end`