μ½λ°±
μ½λ°±
Ultralytics νλ μμν¬λ νΈλ μΈ, λ°Έ, λ΄λ³΄λ΄κΈ°, μμΈ‘ λͺ¨λμ μ λ΅μ λ¨κ³μμ μ½λ°±μ μ§μ
μ μΌλ‘ μ§μν©λλ€. κ° μ½λ°±μ Trainer
, Validator
λλ Predictor
κ°μ²΄λ₯Ό μ¬μ©ν μ μμ΅λλ€. μ΄λ¬ν κ°μ²΄μ λͺ¨λ μμ±μ λ¬Έμμ μ°Έμ‘° μΉμ
μμ μ°Ύμ μ μμ΅λλ€.
Watch: Mastering Ultralytics YOLO: Callbacks
μμ
μμΈ‘μΌλ‘ μΆκ° μ 보 λ°ν
μ΄ μμ μμλ κ° κ²°κ³Ό κ°μ²΄μ ν¨κ» μλ³Έ νλ μμ λ°ννλ €κ³ ν©λλ€. μ΄λ₯Ό μννλ λ°©λ²μ λ€μκ³Ό κ°μ΅λλ€.
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
# 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("yolo11n.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_pretrain_routine_start |
μ¬μ νλ ¨ 루ν΄μ΄ μμλ λ νΈλ¦¬κ±°λ©λλ€. |
on_pretrain_routine_end |
μ¬μ νλ ¨ 루ν΄μ΄ λλλ©΄ νΈλ¦¬κ±°λ©λλ€. |
on_train_start |
νΈλ μ΄λ μμ μ νΈλ¦¬κ±°λ¨ |
on_train_epoch_start |
Triggered at the start of each training epoch |
on_train_batch_start |
κ° κ΅μ‘ λ°°μΉκ° μμλ λ νΈλ¦¬κ±°λ©λλ€. |
optimizer_step |
μ΅ν°λ§μ΄μ λ¨κ³μμ νΈλ¦¬κ±°λ¨ |
on_before_zero_grad |
κ·ΈλΌλ°μ΄μ μ΄ 0μ΄ λκΈ° μ μ νΈλ¦¬κ±°λ©λλ€. |
on_train_batch_end |
κ° κ΅μ‘ λ°°μΉκ° λλ λλ§λ€ νΈλ¦¬κ±°λ©λλ€. |
on_train_epoch_end |
κ° νλ ¨ μν¬ν¬κ° λλ λλ§λ€ νΈλ¦¬κ±°λ©λλ€. |
on_fit_epoch_end |
κ° ν μν¬ν¬κ° λλ λλ§λ€ νΈλ¦¬κ±°λ©λλ€. |
on_model_save |
λͺ¨λΈμ΄ μ μ₯λ λ νΈλ¦¬κ±°λ©λλ€. |
on_train_end |
κ΅μ‘ νλ‘μΈμ€κ° μ’ λ£λλ©΄ νΈλ¦¬κ±°λ©λλ€. |
on_params_update |
λͺ¨λΈ νλΌλ―Έν°κ° μ λ°μ΄νΈλ λ νΈλ¦¬κ±°λ©λλ€. |
teardown |
κ΅μ‘ νλ‘μΈμ€κ° μ 리 μ€μΌ λ νΈλ¦¬κ±°λ©λλ€. |
μ ν¨μ± κ²μ¬κΈ° μ½λ°±
μ½λ°± | μ€λͺ |
---|---|
on_val_start |
μ ν¨μ± κ²μ¬κ° μμλ λ νΈλ¦¬κ±°λ©λλ€. |
on_val_batch_start |
κ° μ ν¨μ± κ²μ¬ λ°°μΉκ° μμλ λ νΈλ¦¬κ±°λ©λλ€. |
on_val_batch_end |
κ° μ ν¨μ± κ²μ¬ λ°°μΉκ° λλ λ νΈλ¦¬κ±°λ©λλ€. |
on_val_end |
μ ν¨μ± κ²μ¬κ° μ’ λ£λλ©΄ νΈλ¦¬κ±°λ©λλ€. |
μμΈ‘μ μ½λ°±
μ½λ°± | μ€λͺ |
---|---|
on_predict_start |
μμΈ‘ νλ‘μΈμ€κ° μμλ λ νΈλ¦¬κ±°λ©λλ€. |
on_predict_batch_start |
κ° μμΈ‘ λ°°μΉκ° μμλ λ νΈλ¦¬κ±°λ©λλ€. |
on_predict_postprocess_end |
μμΈ‘ νμ²λ¦¬ μ’ λ£ μ νΈλ¦¬κ±°λ¨ |
on_predict_batch_end |
κ° μμΈ‘ λ°°μΉκ° λλ λ νΈλ¦¬κ±°λ©λλ€. |
on_predict_end |
μμΈ‘ νλ‘μΈμ€κ° μ’ λ£λλ©΄ νΈλ¦¬κ±°λ©λλ€. |
λ΄λ³΄λ΄κΈ° μ½λ°±
μ½λ°± | μ€λͺ |
---|---|
on_export_start |
λ΄λ³΄λ΄κΈ° νλ‘μΈμ€κ° μμλ λ νΈλ¦¬κ±°λ©λλ€. |
on_export_end |
λ΄λ³΄λ΄κΈ° νλ‘μΈμ€κ° μ’ λ£λλ©΄ νΈλ¦¬κ±°λ©λλ€. |
μμ£Ό 묻λ μ§λ¬Έ
Ultralytics μ½λ°±μ΄λ 무μμ΄λ©° μ΄λ»κ² μ¬μ©νλμ?
Ultralytics μ½λ°± μ νλ ¨, μ ν¨μ± κ²μ¬, λ΄λ³΄λ΄κΈ°, μμΈ‘κ³Ό κ°μ λͺ¨λΈ μμ
μ μ£Όμ λ¨κ³μμ νΈλ¦¬κ±°λλ νΉμν μ§μ
μ μ
λλ€. μ΄λ¬ν μ½λ°±μ ν΅ν΄ νλ‘μΈμ€μ νΉμ μ§μ μμ μ¬μ©μ μ§μ κΈ°λ₯μ μ¬μ©ν μ μμΌλ―λ‘ μν¬νλ‘μ°λ₯Ό κ°μ νκ³ μμ ν μ μμ΅λλ€. κ° μ½λ°±μ Trainer
, Validator
λλ Predictor
κ°μ²΄λ₯Ό μ¬μ©ν μ μμ΅λλ€. μ΄λ¬ν κ°μ²΄μ μμΈν μμ±μ λν μμΈν λ΄μ©μ μ°Έμ‘° μΉμ
.
μ½λ°±μ μ¬μ©νλ €λ©΄ ν¨μλ₯Ό μ μν λ€μ λͺ¨λΈμ 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("yolo11n.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_start
, on_train_end
λ° on_train_batch_end
. μ΄λ₯Ό ν΅ν΄ μ¬μ©μ μ§μ λ©νΈλ¦, μ²λ¦¬ λλ λ‘κΉ
μ μΆκ°ν μ μμ΅λλ€.
λ€μμ κ° κ΅μ‘ κΈ°κ°μ΄ λλ λ μΆκ° λ©νΈλ¦μ κΈ°λ‘νλ λ°©λ²μ μμ λλ€:
from ultralytics import YOLO
def on_train_epoch_end(trainer):
"""Custom logic for additional metrics logging at the end of each training epoch."""
additional_metric = compute_additional_metric(trainer)
trainer.log({"additional_metric": additional_metric})
model = YOLO("yolo11n.pt")
model.add_callback("on_train_epoch_end", on_train_epoch_end)
model.train(data="coco.yaml", epochs=10)
κ΅μ‘ μ½λ°±μ ν¨κ³Όμ μΌλ‘ μ¬μ©νλ λ°©λ²μ λν μμΈν λ΄μ©μ κ΅μ‘ κ°μ΄λλ₯Ό μ°Έμ‘°νμΈμ.
Ultralytics YOLO μμ μ ν¨μ± κ²μ¬ μ€μ μ½λ°±μ μ¬μ©ν΄μΌ νλ μ΄μ λ 무μμΈκ°μ?
μ¬μ© μ ν¨μ± κ²μ¬ μ€ μ½λ°± Ultralytics YOLO μμ μ¬μ©μ μ§μ μ²λ¦¬, λ‘κΉ
λλ λ©νΈλ¦ κ³μ°μ νμ©νμ¬ λͺ¨λΈ νκ°λ₯Ό ν₯μμν¬ μ μμ΅λλ€. λ€μκ³Ό κ°μ μ½λ°± on_val_start
, on_val_batch_end
λ° on_val_end
μ¬μ©μ μ§μ λ‘μ§μ μ½μ
ν μ μλ μ§μ
μ μ μ 곡νμ¬ μμΈνκ³ ν¬κ΄μ μΈ μ ν¨μ± κ²μ¬ νλ‘μΈμ€λ₯Ό 보μ₯ν©λλ€.
μλ₯Ό λ€μ΄ μΆκ° μ ν¨μ± κ²μ¬ μ§νλ₯Ό κΈ°λ‘νκ±°λ μΆκ° λΆμμ μν΄ μ€κ° κ²°κ³Όλ₯Ό μ μ₯νκ³ μΆμ μ μμ΅λλ€. λ€μμ μ ν¨μ± κ²μ¬ μ’ λ£ μ μ¬μ©μ μ§μ λ©νΈλ¦μ κΈ°λ‘νλ λ°©λ²μ μμ λλ€:
from ultralytics import YOLO
def on_val_end(validator):
"""Log custom metrics at end of validation."""
custom_metric = compute_custom_metric(validator)
validator.log({"custom_metric": custom_metric})
model = YOLO("yolo11n.pt")
model.add_callback("on_val_end", on_val_end)
model.val(data="coco.yaml")
μ ν¨μ± κ²μ¬ νλ‘μΈμ€μ μ½λ°±μ ν΅ν©νλ λ°©λ²μ λν μμΈν λ΄μ©μ μ ν¨μ± κ²μ¬ κ°μ΄λλ₯Ό νμΈνμΈμ.
μμΈ‘ λͺ¨λμ λν μ¬μ©μ μ§μ μ½λ°±μ Ultralytics YOLO μ μ΄λ»κ² 첨λΆνλμ?
μ¬μ©μ μ§μ μ½λ°±μ 첨λΆνλ €λ©΄ μμΈ‘ λͺ¨λ Ultralytics YOLO μμ μ½λ°± ν¨μλ₯Ό μ μνκ³ μμΈ‘ νλ‘μΈμ€μ λ±λ‘ν©λλ€. μΌλ°μ μΈ μμΈ‘ μ½λ°±μ λ€μκ³Ό κ°μ΅λλ€. on_predict_start
, on_predict_batch_end
λ° on_predict_end
. μ΄λ₯Ό ν΅ν΄ μμΈ‘ μΆλ ₯μ μμ νκ³ λ°μ΄ν° λ‘κΉ
λλ κ²°κ³Ό λ³νκ³Ό κ°μ μΆκ° κΈ°λ₯μ ν΅ν©ν μ μμ΅λλ€.
λ€μμ μ¬μ©μ μ§μ μ½λ°±μ μ¬μ©νμ¬ μμΈ‘μ κΈ°λ‘νλ μμ μ λλ€:
from ultralytics import YOLO
def on_predict_end(predictor):
"""Log predictions at the end of prediction."""
for result in predictor.results:
log_prediction(result)
model = YOLO("yolo11n.pt")
model.add_callback("on_predict_end", on_predict_end)
results = model.predict(source="image.jpg")
λ³΄λ€ μμΈν μ¬μ©λ²μ μμΈν μ§μΉ¨κ³Ό μΆκ° μ¬μ©μ μ§μ μ΅μ μ΄ ν¬ν¨λ μμΈ‘ κ°μ΄λλ₯Ό μ°Έμ‘°νμΈμ.
Ultralytics YOLO μμ μ½λ°±μ μ¬μ©νλ λͺ κ°μ§ μ€μ μλ 무μμΈκ°μ?
Ultralytics YOLO λ κ΅μ‘, κ²μ¦ λ° μμΈ‘κ³Ό κ°μ λ€μν λ¨κ³λ₯Ό κ°μ νκ³ μ¬μ©μ μ§μ νκΈ° μν΄ μ½λ°±μ λ€μν μ€μ ꡬνμ μ§μν©λλ€. λͺ κ°μ§ μ€μ©μ μΈ μλ λ€μκ³Ό κ°μ΅λλ€:
- μ¬μ©μ μ§μ μ§ν λ‘κΉ : κ΅μ‘ μ’ λ£ λλ κ²μ¦ κΈ°κ°κ³Ό κ°μ λ€μν λ¨κ³μμ μΆκ° μ§νλ₯Ό κΈ°λ‘ν©λλ€.
- Data Augmentation: Implement custom data transformations or augmentations during prediction or training batches.
- μ€κ° κ²°κ³Ό: μΆκ° λΆμ λλ μκ°νλ₯Ό μν΄ μμΈ‘ λλ νλ μκ³Ό κ°μ μ€κ° κ²°κ³Όλ₯Ό μ μ₯ν©λλ€.
μμ: λ€μμ μ¬μ©νμ¬ μμΈ‘ μ€μ νλ μμ μμΈ‘ κ²°κ³Όμ κ²°ν©νκΈ° 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("yolo11n.pt")
model.add_callback("on_predict_batch_end", on_predict_batch_end)
for result, frame in model.predict():
pass
μ 체 μ½λ°± μ°Έμ‘°λ₯Ό μ΄ν΄λ³΄κ³ λ λ§μ μ΅μ κ³Ό μμλ₯Ό μ°Ύμ보μΈμ.