Ultralytics YOLO27:

Các hàm gọi lại#

Framework Ultralytics hỗ trợ các callback, đóng vai trò là các điểm truy cập ở các giai đoạn chiến lược trong các chế độ train, val, exportpredict. Mỗi callback nhận một đối tượng Trainer, Validator hoặc Predictor, tùy thuộc vào loại thao tác. Tất cả các thuộc tính của các đối tượng này được chi tiết trong các trang tham khảo BaseTrainer, BaseValidatorBasePredictor.



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

Ví dụ#

Trả về thông tin bổ sung cùng với dự đoán#

Trong ví dụ này, chúng tôi minh họa cách trả về khung hình gốc cùng với mỗi đối tượng kết quả:

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

Đăng ký PyTorch Forward Hooks Trước Khi Huấn Luyện#

model.train() xây dựng một model huấn luyện từ cấu hình model và chuyển các trọng số đã tải vào trong model. Các hook PyTorch được đăng ký trực tiếp trên model.model trước lệnh gọi này là trạng thái runtime, vì vậy model huấn luyện được xây dựng lại không kế thừa các hook PyTorch. Hãy đăng ký các hook huấn luyện trong on_pretrain_routine_end, sau khi quá trình thiết lập model hoàn tất:

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() xử lý cả việc huấn luyện trên một thiết bị duy nhất và huấn luyện DistributedDataParallel. Không gắn một hook được định nghĩa cục bộ vào trainer.ema.ema, vì các checkpoint huấn luyện tuần tự hóa EMA model và một tiến trình khác có thể không import được callback khi tải checkpoint. Nếu cùng một quá trình tiền xử lý phải chạy trong quá trình xác thực huấn luyện, hãy triển khai quá trình tiền xử lý đó như một thành phần model có thể import thay vì một hook runtime.

Standalone model.val() sao chép model đã tải cho mỗi lệnh gọi. Quá trình dự đoán tạo và lưu cache một bản sao ở lệnh gọi đầu tiên, vì vậy hãy đăng ký các hook trên model.model trước lệnh gọi model.predict() hoặc model.track() đầu tiên; các hook được thêm vào sau đó sẽ không đến được predictor đã được lưu cache. Hãy đăng ký lại các hook runtime sau khi tải một checkpoint trong một tiến trình mới.

Truy cập các chỉ số mô hình bằng cách sử dụng hàm gọi lại on_model_save#

Ví dụ này cho thấy cách truy xuất chi tiết huấn luyện, chẳng hạn như điểm số best_fitness, tổng tổn thất total_loss và các chỉ số khác sau khi điểm kiểm tra checkpoint được lưu bằng cách sử dụng hàm gọi lại on_model_save.

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ất cả các hàm gọi lại#

Dưới đây là tất cả các hàm gọi lại được hỗ trợ. Để biết thêm chi tiết, hãy tham khảo mã nguồn của các hàm gọi lại.

Hàm gọi lại bộ huấn luyện#

Hàm gọi lạiMô tả
on_pretrain_routine_startĐược kích hoạt vào đầu quy trình chuẩn bị huấn luyện, trước khi tải dữ liệu và thiết lập mô hình.
on_pretrain_routine_endĐược kích hoạt vào cuối quy trình chuẩn bị huấn luyện, sau khi việc tải dữ liệu và thiết lập mô hình hoàn tất.
on_train_startĐược kích hoạt khi quá trình huấn luyện bắt đầu, trước khi kỷ nguyên đầu tiên bắt đầu.
on_train_epoch_startĐược kích hoạt ở đầu mỗi kỷ nguyên huấn luyện, trước khi vòng lặp lô bắt đầu.
on_train_batch_startĐược kích hoạt ở đầu mỗi lô huấn luyện, trước bước truyền xuôi.
optimizer_stepĐược kích hoạt trong bước tối ưu hóa. Dành riêng cho các tích hợp tùy chỉnh; không được gọi bởi vòng lặp huấn luyện mặc định.
on_before_zero_gradĐược kích hoạt trước khi đặt lại độ dốc về zero. Dành riêng cho các tích hợp tùy chỉnh; không được gọi bởi vòng lặp huấn luyện mặc định.
on_train_batch_endĐược kích hoạt vào cuối mỗi lô huấn luyện, sau bước truyền ngược. Bước tối ưu hóa có thể bị hoãn lại do tích lũy độ dốc.
on_train_epoch_endĐược kích hoạt vào cuối mỗi kỷ nguyên huấn luyện, sau khi tất cả các lô được xử lý nhưng trước quá trình xác thực. Các chỉ số xác thực và độ thích hợp fitness có thể chưa sẵn sàng.
on_model_saveĐược kích hoạt khi điểm kiểm tra mô hình được lưu, sau quá trình xác thực.
on_fit_epoch_endĐược kích hoạt vào cuối mỗi kỷ nguyên khớp (huấn luyện + xác thực), sau quá trình xác thực và mọi thao tác lưu điểm kiểm tra. Các chỉ số xác thực có sẵn và độ thích hợp có sẵn cho lệnh gọi huấn luyện theo từng kỷ nguyên. Hàm gọi lại này cũng được gọi trong quá trình đánh giá mô hình tốt nhất cuối cùng, nơi không có việc lưu điểm kiểm tra nào xảy ra và độ thích hợp có thể không có mặt.
on_train_endĐược kích hoạt khi quá trình huấn luyện kết thúc, sau khi đánh giá cuối cùng mô hình tốt nhất.
on_params_updateĐược kích hoạt khi các tham số mô hình được cập nhật. Dành riêng cho các tích hợp tùy chỉnh; không được gọi bởi vòng lặp huấn luyện mặc định.
teardownĐược kích hoạt khi quá trình huấn luyện đang được dọn dẹp.

Hàm gọi lại bộ xác thực#

Hàm gọi lạiMô tả
on_val_startĐược kích hoạt khi quá trình xác thực bắt đầu.
on_val_batch_startĐược kích hoạt ở đầu mỗi lô xác thực.
on_val_batch_endĐược kích hoạt ở cuối mỗi lô xác thực.
on_val_endĐược kích hoạt khi quá trình xác thực kết thúc.

Hàm gọi lại bộ dự đoán#

Hàm gọi lạiMô tả
on_predict_startĐược kích hoạt khi quá trình dự đoán bắt đầu.
on_predict_batch_startĐược kích hoạt ở đầu mỗi lô dự đoán.
on_predict_postprocess_endĐược kích hoạt ở cuối quá trình hậu xử lý dự đoán.
on_predict_batch_endĐược kích hoạt ở cuối mỗi lô dự đoán.
on_predict_endĐược kích hoạt khi quá trình dự đoán kết thúc.

Hàm gọi lại bộ xuất#

Hàm gọi lạiMô tả
on_export_startĐược kích hoạt khi quá trình xuất bắt đầu.
on_export_endĐược kích hoạt khi quá trình xuất kết thúc.

FAQ#

  • Các callback của Ultralytics là các điểm truy cập chuyên biệt được kích hoạt trong các giai đoạn quan trọng của các hoạt động model như huấn luyện, xác thực, xuất và dự đoán. Các callback này cho phép tính năng tùy chỉnh tại các điểm cụ thể trong quy trình, cho phép cải tiến và sửa đổi quy trình làm việc. Mỗi callback nhận một đối tượng Trainer, Validator hoặc Predictor, tùy thuộc vào loại thao tác. Để biết các thuộc tính chi tiết của các đối tượng này, hãy tham khảo các trang tham khảo BaseTrainer, BaseValidatorBasePredictor.

    Để sử dụng một hàm gọi lại, hãy định nghĩa một hàm và thêm hàm đó vào mô hình bằng cách sử dụng phương thức model.add_callback(). Dưới đây là ví dụ về việc trả về thông tin bổ sung trong quá trình dự đoán:

    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
  • Tùy chỉnh quy trình huấn luyện Ultralytics của bạn bằng cách chèn logic ở các giai đoạn cụ thể của quy trình huấn luyện. YOLO Ultralytics cung cấp nhiều hàm gọi lại huấn luyện khác nhau, chẳng hạn như on_train_start, on_train_endon_train_batch_end, cho phép bạn thêm các chỉ số, xử lý hoặc ghi nhật ký tùy chỉnh.

    Dưới đây là cách đóng băng các thống kê BatchNorm khi đóng băng các lớp bằng các hàm gọi lại:

    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)

    Để biết thêm chi tiết về việc sử dụng hiệu quả các hàm gọi lại huấn luyện, hãy xem Hướng dẫn huấn luyện.

  • Việc sử dụng các hàm gọi lại trong quá trình xác thực trong YOLO Ultralytics giúp nâng cao việc đánh giá mô hình bằng cách cho phép xử lý tùy chỉnh, ghi nhật ký hoặc tính toán chỉ số. Các hàm gọi lại như on_val_start, on_val_batch_endon_val_end cung cấp các điểm truy cập để chèn logic tùy chỉnh, đảm bảo các quy trình xác thực chi tiết và toàn diện.

    Ví dụ, để vẽ biểu đồ cho tất cả các lô xác thực thay vì chỉ ba lô đầu tiên:

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

    Để có thêm thông tin chi tiết về việc kết hợp các hàm gọi lại vào quy trình xác thực của bạn, hãy xem Hướng dẫn xác thực.

  • Để đính kèm một hàm gọi lại tùy chỉnh cho chế độ dự đoán trong YOLO Ultralytics, hãy định nghĩa một hàm gọi lại và đăng ký hàm gọi lại với quy trình dự đoán. Các hàm gọi lại dự đoán phổ biến bao gồm on_predict_start, on_predict_batch_endon_predict_end. Các hàm gọi lại này cho phép sửa đổi các đầu ra dự đoán và tích hợp các chức năng bổ sung, như ghi nhật ký dữ liệu hoặc biến đổi kết quả.

    Dưới đây là ví dụ trong đó một hàm gọi lại tùy chỉnh lưu các dự đoán dựa trên việc liệu một đối tượng thuộc một lớp cụ thể có xuất hiện hay không:

    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

    Để sử dụng toàn diện hơn, hãy tham khảo Hướng dẫn dự đoán, bao gồm các hướng dẫn chi tiết và các tùy chọn tùy chỉnh bổ sung.

  • YOLO Ultralytics hỗ trợ các cách triển khai thực tế khác nhau của các hàm gọi lại để nâng cao và tùy chỉnh các giai đoạn khác nhau như huấn luyện, xác thực và dự đoán. Một số ví dụ thực tế bao gồm:

    • Ghi nhật ký các chỉ số tùy chỉnh: Ghi lại các chỉ số bổ sung ở các giai đoạn khác nhau, chẳng hạn như vào cuối các kỷ nguyên huấn luyện hoặc xác thực.
    • Tăng cường dữ liệu: Triển khai các phép biến đổi hoặc tăng cường dữ liệu tùy chỉnh trong các lô dự đoán hoặc huấn luyện.
    • Kết quả trung gian: Lưu các kết quả trung gian, chẳng hạn như các dự đoán hoặc khung hình, để phân tích hoặc trực quan hóa thêm.

    Ví dụ: Kết hợp các khung hình với kết quả dự đoán trong quá trình dự đoán bằng cách sử dụng 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

    Khám phá mã nguồn hàm gọi lại để biết thêm các tùy chọn và ví dụ.

Những người đóng góp

Bình luận