コールバック

Ultralyticsフレームワークはコールバックをサポートしており、これらはtrainvalexportpredictモードの戦略的な段階におけるエントリポイントとして機能します。各コールバックは、操作の種類に応じてTrainerValidator、またはPredictorオブジェクトを受け取ります。これらのオブジェクトの全プロパティについては、ドキュメントのリファレンスセクションで詳しく解説されています。



Watch: How to use Ultralytics Callbacks | Predict, Train, Validate and Export Callbacks | Ultralytics YOLO🚀

使用例

予測結果と共に追加情報を返す

この例では、各結果オブジェクトと共に元のフレームを返す方法を示します。

from ultralytics import YOLO

def on_predict_batch_end(predictor):
    """Combine prediction results with corresponding frames."""
    _, image, _, _ = predictor.batch

    # Ensure that image is a list
    image = image if isinstance(image, list) else [image]

    # Combine the prediction results with the corresponding frames
    predictor.results = zip(predictor.results, image)

# Create a YOLO model instance
model = YOLO("yolo26n.pt")

# Add the custom callback to the model
model.add_callback("on_predict_batch_end", on_predict_batch_end)

# Iterate through the results and frames
for result, frame in model.predict():  # or model.track()
    pass

on_model_saveコールバックを使用してモデルメトリクスにアクセスする

この例では、on_model_saveコールバックを使用して、チェックポイントが保存された後にbest_fitnessスコア、total_loss、およびその他のメトリクスなどのトレーニング詳細を取得する方法を示します。

from ultralytics import YOLO

# Load a YOLO model
model = YOLO("yolo26n.pt")

def print_checkpoint_metrics(trainer):
    """Print trainer metrics and loss details after each checkpoint is saved."""
    print(
        f"Model details\n"
        f"Best fitness: {trainer.best_fitness}, "
        f"Loss names: {trainer.loss_names}, "  # List of loss names
        f"Metrics: {trainer.metrics}, "
        f"Total loss: {trainer.tloss}"  # Total loss value
    )

if __name__ == "__main__":
    # Add on_model_save callback.
    model.add_callback("on_model_save", print_checkpoint_metrics)

    # Run model training on custom dataset.
    results = model.train(data="coco8.yaml", epochs=3)

すべてのコールバック

以下はサポートされているすべてのコールバックです。詳細については、コールバックのソースコードを参照してください。

トレーナー(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_model_saveモデルのチェックポイントが保存される時、検証の後にトリガーされます。
on_fit_epoch_end各フィットエポック(トレーニング+検証)の終了時、検証およびチェックポイント保存のにトリガーされます。検証メトリクスは利用可能であり、エポックごとのトレーニング呼び出しに対して適応度も利用可能です。このコールバックは最終的なベストモデル評価中にも呼び出されますが、その際はチェックポイント保存は行われず、適応度が存在しない場合があります。
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エクスポートプロセスが終了する時にトリガーされます。

FAQ

Ultralyticsコールバックとは何ですか?また、どのように使用できますか?

Ultralyticsコールバックは、トレーニング、検証、エクスポート、予測といったモデル運用の主要段階でトリガーされる特殊なエントリポイントです。これらのコールバックにより、プロセスの特定の段階でカスタム機能を組み込むことが可能になり、ワークフローの拡張や修正ができます。各コールバックは操作の種類に応じてTrainerValidator、またはPredictorオブジェクトを受け取ります。これらのオブジェクトの詳細なプロパティについては、リファレンスセクションを参照してください。

コールバックを使用するには、関数を定義し、model.add_callback()メソッドを使用してモデルに追加します。予測中に情報を追加して返す例を以下に示します:

from ultralytics import YOLO

def on_predict_batch_end(predictor):
    """Handle prediction batch end by combining results with corresponding frames; modifies predictor results."""
    _, image, _, _ = predictor.batch
    image = image if isinstance(image, list) else [image]
    predictor.results = zip(predictor.results, image)

model = YOLO("yolo26n.pt")
model.add_callback("on_predict_batch_end", on_predict_batch_end)
for result, frame in model.predict():
    pass

コールバックを使用してUltralyticsのトレーニングルーチンをカスタマイズするにはどうすればよいですか?

Ultralyticsのトレーニングプロセスにおける特定の段階にロジックを注入することで、トレーニングルーチンをカスタマイズできます。Ultralytics YOLOは、on_train_starton_train_endon_train_batch_endなどのさまざまなトレーニングコールバックを提供しており、これらを使用してカスタムメトリクス、処理、またはログ記録を追加できます。

以下は、コールバックを使用してレイヤーをフリーズする際にBatchNormの統計量をフリーズする方法です:

from ultralytics import YOLO

# Add a callback to put the frozen layers in eval mode to prevent BN values from changing
def put_in_eval_mode(trainer):
    n_layers = trainer.args.freeze
    if not isinstance(n_layers, int):
        return

    for i, (name, module) in enumerate(trainer.model.named_modules()):
        if name.endswith("bn") and int(name.split(".")[1]) < n_layers:
            module.eval()
            module.track_running_stats = False

model = YOLO("yolo26n.pt")
model.add_callback("on_train_epoch_start", put_in_eval_mode)
model.train(data="coco.yaml", epochs=10)

トレーニングコールバックの効果的な使用方法の詳細については、トレーニングガイドを参照してください。

Ultralytics YOLOでの検証中にコールバックを使用すべき理由は何ですか?

Ultralytics YOLOでの検証中にコールバックを使用すると、カスタム処理、ログ記録、またはメトリクス計算が可能になり、モデル評価が向上します。on_val_starton_val_batch_endon_val_endなどのコールバックは、カスタムロジックを注入するためのエントリポイントを提供し、詳細かつ包括的な検証プロセスを確実にします。

例えば、最初の3バッチだけでなく、すべての検証バッチをプロットする場合:

import inspect

from ultralytics import YOLO

def plot_samples(validator):
    frame = inspect.currentframe().f_back.f_back
    v = frame.f_locals
    validator.plot_val_samples(v["batch"], v["batch_i"])
    validator.plot_predictions(v["batch"], v["preds"], v["batch_i"])

model = YOLO("yolo26n.pt")
model.add_callback("on_val_batch_end", plot_samples)
model.val(data="coco.yaml")

検証プロセスにコールバックを組み込むための詳細については、検証ガイドを参照してください。

Ultralytics YOLOの予測モードでカスタムコールバックをアタッチするにはどうすればよいですか?

Ultralytics YOLOの予測モードにカスタムコールバックをアタッチするには、コールバック関数を定義し、それを予測プロセスに登録します。一般的な予測コールバックには、on_predict_starton_predict_batch_end、およびon_predict_endが含まれます。これらにより、予測出力の変更や、データログ記録、結果変換などの追加機能の統合が可能になります。

以下は、特定のクラスのオブジェクトが存在するかどうかに基づいて予測を保存するカスタムコールバックの例です:

from ultralytics import YOLO

model = YOLO("yolo26n.pt")

class_id = 2

def save_on_object(predictor):
    r = predictor.results[0]
    if class_id in r.boxes.cls:
        predictor.args.save = True
    else:
        predictor.args.save = False

model.add_callback("on_predict_postprocess_end", save_on_object)
results = model("pedestrians.mp4", stream=True, save=True)

for results in results:
    pass

より包括的な使用法については、詳細な手順と追加のカスタマイズオプションが含まれている予測ガイドを参照してください。

Ultralytics YOLOでコールバックを使用する実践的な例はありますか?

Ultralytics YOLOは、トレーニング、検証、予測などの各フェーズを強化およびカスタマイズするための、さまざまな実践的なコールバックの実装をサポートしています。実践的な例には以下のようなものがあります:

  • カスタムメトリクスのログ記録: トレーニングや検証のエポック終了時など、さまざまな段階で追加のメトリクスを記録します。
  • データ拡張: 予測またはトレーニングバッチ中に、カスタムデータ変換や拡張を実装します。
  • 中間結果: さらなる分析や可視化のために、予測結果やフレームなどの中間結果を保存します。

例:on_predict_batch_endを使用して、予測中にフレームと予測結果を組み合わせる:

from ultralytics import YOLO

def on_predict_batch_end(predictor):
    """Combine prediction results with frames."""
    _, image, _, _ = predictor.batch
    image = image if isinstance(image, list) else [image]
    predictor.results = zip(predictor.results, image)

model = YOLO("yolo26n.pt")
model.add_callback("on_predict_batch_end", on_predict_batch_end)
for result, frame in model.predict():
    pass

その他のオプションや例については、コールバックのソースコードを確認してください。

コメント