Ultralytics YOLO27:

Geri Çağırmalar#

Ultralytics çatısı, train, val, export ve predict modları sırasında stratejik aşamalarda giriş noktaları olarak görev yapan geri çağrıları destekler. Her geri çağrı, işlem türüne bağlı olarak bir Trainer, Validator veya Predictor nesnesi kabul eder. Bu nesnelerin tüm özellikleri BaseTrainer, BaseValidator ve BasePredictor başvuru sayfalarında ayrıntılı olarak açıklanmıştır.



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

Örnekler#

Tahmin ile Ek Bilgi Döndürme#

Bu örnekte, her sonuç nesnesiyle birlikte orijinal karenin nasıl döndürüleceğini gösteriyoruz:

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

Eğitimden Önce PyTorch İleri Kancaları Kaydetme#

model.train(), model yapılandırmasından bir eğitim modeli oluşturur ve yüklenen ağırlıkları buna aktarır. Bu çağrıdan önce doğrudan model.model üzerine kaydedilen PyTorch kancaları çalışma zamanı durumudur, bu nedenle yeniden oluşturulan eğitim modeli bunları devralmaz. Eğitim kancalarını, model kurulumu tamamlandıktan sonra on_pretrain_routine_end içinde kaydet:

from ultralytics import YOLO
from ultralytics.utils.torch_utils import unwrap_model

def preprocess_input(module, inputs):
    """Center each input channel before the first model layer."""
    images = inputs[0]
    return (images - images.mean(dim=(-2, -1), keepdim=True),)

def register_forward_pre_hook(trainer):
    """Attach preprocessing to the active training model."""
    train_model = unwrap_model(trainer.model)
    train_model.model[0].register_forward_pre_hook(preprocess_input)

model = YOLO("yolo26n.pt")
model.add_callback("on_pretrain_routine_end", register_forward_pre_hook)
model.train(data="coco8.yaml", epochs=1)

unwrap_model(), hem tek cihazlı hem de DistributedDataParallel eğitimini yönetir. trainer.ema.ema'e yerel olarak tanımlanmış bir kanca bağlama, çünkü eğitim kontrol noktaları EMA modelini serileştirir ve kontrol noktası yüklenirken başka bir süreç geri çağrıyı içe aktaramayabilir. Eğitim doğrulaması sırasında aynı ön işleme çalıştırılacaksa, bunu bir çalışma zamanı kancası yerine içe aktarılabilir bir model bileşeni olarak uygula.

Bağımsız model.val(), her çağrı için yüklenen modeli kopyalar. Tahmin, ilk çağrısında bir kopya oluşturur ve önbelleğe alır, bu nedenle ilk model.predict() veya model.track() çağrısından önce kancaları model.model üzerine kaydet; sonradan eklenen kancalar önbelleğe alınmış tahmin ediciye ulaşmaz. Yeni bir süreçte bir kontrol noktasını yükledikten sonra çalışma zamanı kancalarını tekrar kaydet.

on_model_save geri çağırmasını kullanarak Model metriklerine erişin#

Bu örnek, on_model_save geri çağırması kullanılarak bir kontrol noktası kaydedildikten sonra best_fitness skoru, total_loss ve diğer metrikler gibi eğitim detaylarının nasıl alınacağını gösterir.

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)

Tüm Geri Çağırmalar#

Aşağıda desteklenen tüm geri çağırmalar yer almaktadır. Daha fazla detay için geri çağırma kaynak koduna bakın.

Eğitici Geri Çağırmaları#

Geri ÇağırmaAçıklama
on_pretrain_routine_startÖn eğitim rutininin başında, veri yükleme ve model kurulumundan önce tetiklenir.
on_pretrain_routine_endÖn eğitim rutininin sonunda, veri yükleme ve model kurulumu tamamlandıktan sonra tetiklenir.
on_train_startEğitim başladığında, ilk dönem başlamadan önce tetiklenir.
on_train_epoch_startHer eğitim döneminin başında, yığın yinelemesi başlamadan önce tetiklenir.
on_train_batch_startHer eğitim yığınının başında, ileri geçişten önce tetiklenir.
optimizer_stepOptimizasyon adımı sırasında tetiklenir. Özel entegrasyonlar için ayrılmıştır; varsayılan eğitim döngüsü tarafından çağrılmaz.
on_before_zero_gradGradyanlar sıfırlanmadan önce tetiklenir. Özel entegrasyonlar için ayrılmıştır; varsayılan eğitim döngüsü tarafından çağrılmaz.
on_train_batch_endHer eğitim yığınının sonunda, geri geçişten sonra tetiklenir. Optimizasyon adımı gradyan birikimi nedeniyle ertelenebilir.
on_train_epoch_endHer eğitim döneminin sonunda, tüm yığınlar işlendikten sonra ancak doğrulamadan önce tetiklenir. Doğrulama metrikleri ve uygunluk henüz mevcut olmayabilir.
on_model_saveModel kontrol noktası kaydedildiğinde, doğrulamadan sonra tetiklenir.
on_fit_epoch_endHer uygunluk döneminin (eğitim + doğrulama) sonunda, doğrulamadan ve herhangi bir kontrol noktası kaydından sonra tetiklenir. Doğrulama metrikleri mevcuttur ve dönem başına eğitim çağrısı için uygunluk mevcuttur. Bu geri çağırma aynı zamanda, hiçbir kontrol noktası kaydının gerçekleşmediği ve uygunluğun bulunmayabileceği nihai en iyi model değerlendirmesi sırasında da çağrılır.
on_train_endEğitim süreci sona erdiğinde, en iyi modelin nihai değerlendirmesinden sonra tetiklenir.
on_params_updateModel parametreleri güncellendiğinde tetiklenir. Özel entegrasyonlar için ayrılmıştır; varsayılan eğitim döngüsü tarafından çağrılmaz.
teardownEğitim süreci temizlenirken tetiklenir.

Doğrulayıcı Geri Çağırmaları#

Geri ÇağırmaAçıklama
on_val_startDoğrulama başladığında tetiklenir.
on_val_batch_startHer doğrulama yığınının başında tetiklenir.
on_val_batch_endHer doğrulama yığınının sonunda tetiklenir.
on_val_endDoğrulama sona erdiğinde tetiklenir.

Tahminci Geri Çağırmaları#

Geri ÇağırmaAçıklama
on_predict_startTahmin süreci başladığında tetiklenir.
on_predict_batch_startHer tahmin yığınının başında tetiklenir.
on_predict_postprocess_endTahmin son işleme aşamasının sonunda tetiklenir.
on_predict_batch_endHer tahmin yığınının sonunda tetiklenir.
on_predict_endTahmin süreci sona erdiğinde tetiklenir.

Dışa Aktarıcı Geri Çağırmaları#

Geri ÇağırmaAçıklama
on_export_startDışa aktarma süreci başladığında tetiklenir.
on_export_endDışa aktarma süreci sona erdiğinde tetiklenir.

SSS#

  • Ultralytics geri çağrıları, eğitim, doğrulama, dışarı aktarma ve tahmin gibi model işlemlerinin temel aşamalarında tetiklenen özel giriş noktalarıdır. Bu geri çağrılar, süreçteki belirli noktalarda özel işlevselliği etkinleştirerek iş akışında iyileştirmeler ve değişiklikler yapılmasını sağlar. Her geri çağrı, işlem türüne bağlı olarak bir Trainer, Validator veya Predictor nesnesi kabul eder. Bu nesnelerin ayrıntılı özellikleri için BaseTrainer, BaseValidator ve BasePredictor başvuru sayfalarına bakın.

    Bir geri çağırmayı kullanmak için bir fonksiyon tanımla ve model.add_callback() yöntemini kullanarak bunu modele ekle. İşte tahmin sırasında ek bilgi döndürmeye dair bir örnek:

    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
  • Eğitim sürecinin belirli aşamalarında mantık enjekte ederek Ultralytics eğitim rutinini özelleştir. Ultralytics YOLO, özel metrikler, işleme veya günlük kaydı eklemeni sağlayan on_train_start, on_train_end ve on_train_batch_end gibi çeşitli eğitim geri çağırmaları sağlar.

    Katmanları geri çağırmalarla dondururken BatchNorm istatistiklerini şu şekilde dondurabilirsin:

    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)

    Eğitim geri çağırmalarını etkili bir şekilde kullanma hakkında daha fazla detay için Eğitim Kılavuzuna bakın.

  • Ultralytics YOLO'da doğrulama sırasında geri çağırmaları kullanmak; özel işlemeyi, günlük kaydını veya metrik hesaplamasını etkinleştirerek model değerlendirmesini geliştirir. on_val_start, on_val_batch_end ve on_val_end gibi geri çağırmalar, ayrıntılı ve kapsamlı doğrulama süreçleri sağlayarak özel mantık enjekte etmek için giriş noktaları sunar.

    Örneğin, yalnızca ilk üç yığın yerine tüm doğrulama yığınlarını çizmek için:

    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")

    Geri çağırmaları doğrulama sürecine dahil etme hakkında daha fazla bilgi için Doğrulama Kılavuzuna bakın.

  • Ultralytics YOLO'da tahmin modu için özel bir geri çağırma iliştirmek üzere bir geri çağırma fonksiyonu tanımla ve bunu tahmin süreciyle kaydet. Yaygın tahmin geri çağırmaları on_predict_start, on_predict_batch_end ve on_predict_end içerir. Bunlar, tahmin çıktıların değiştirilmesine ve veri günlüğü kaydı veya sonuç dönüştürme gibi ek işlevlerin entegre edilmesine olanak tanır.

    İşte özel bir geri çağırmanın, belirli bir sınıfa ait bir nesnenin mevcut olup olmadığını temel alarak tahminleri kaydettiği bir örnek:

    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_stream = model("pedestrians.mp4", stream=True, save=True)
    
    for result in results_stream:
        pass

    Daha kapsamlı kullanım için, ayrıntılı talimatlar ve ek özelleştirme seçenekleri içeren Tahmin Kılavuzuna başvurun.

  • Ultralytics YOLO; eğitim, doğrulama ve tahmin gibi farklı aşamaları geliştirmek ve özelleştirmek için geri çağırmaların çeşitli pratik uygulamalarını destekler. Bazı pratik örnekler şunlardır:

    • Özel Metrikleri Günlüğe Kaydetme: Eğitim veya doğrulama dönemlerinin sonu gibi farklı aşamalarda ek metrikleri günlüğe kaydet.
    • Veri Artırma: Tahmin veya eğitim yığınları sırasında özel veri dönüşümleri veya artırmaları uygula.
    • Ara Sonuçlar: Daha fazla analiz veya görselleştirme için tahminler veya kareler gibi ara sonuçları kaydet.

    Örnek: on_predict_batch_end kullanarak tahmin sırasında kareleri tahmin sonuçlarıyla birleştirme:

    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

    Daha fazla seçenek ve örnek için geri çağırma kaynak kodunu inceleyin.

Yorumlar