μ½˜ν…μΈ λ‘œ κ±΄λ„ˆλ›°κΈ°

콜백

콜백

Ultralytics ν”„λ ˆμž„μ›Œν¬λŠ” 트레인, λ°Έ, 내보내기, 예츑 λͺ¨λ“œμ˜ μ „λž΅μ  λ‹¨κ³„μ—μ„œ μ½œλ°±μ„ μ§„μž…μ μœΌλ‘œ μ§€μ›ν•©λ‹ˆλ‹€. 각 μ½œλ°±μ€ Trainer, Validatorλ˜λŠ” Predictor 객체λ₯Ό μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€. μ΄λŸ¬ν•œ 객체의 λͺ¨λ“  속성은 λ¬Έμ„œμ˜ μ°Έμ‘° μ„Ήμ…˜μ—μ„œ 찾을 수 μžˆμŠ΅λ‹ˆλ‹€.



Watch: λ§ˆμŠ€ν„°λ§ Ultralytics YOLO : 콜백

예제

예츑으둜 μΆ”κ°€ 정보 λ°˜ν™˜

이 μ˜ˆμ œμ—μ„œλŠ” 각 κ²°κ³Ό 객체와 ν•¨κ»˜ 원본 ν”„λ ˆμž„μ„ λ°˜ν™˜ν•˜λ €κ³  ν•©λ‹ˆλ‹€. 이λ₯Ό μˆ˜ν–‰ν•˜λŠ” 방법은 λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

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 각 ν›ˆλ ¨ 에포크가 μ‹œμž‘λ  λ•Œ νŠΈλ¦¬κ±°λ©λ‹ˆλ‹€.
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 λŠ” ꡐ윑, 검증 및 예츑과 같은 λ‹€μ–‘ν•œ 단계λ₯Ό κ°œμ„ ν•˜κ³  μ‚¬μš©μž μ§€μ •ν•˜κΈ° μœ„ν•΄ 콜백의 λ‹€μ–‘ν•œ μ‹€μ œ κ΅¬ν˜„μ„ μ§€μ›ν•©λ‹ˆλ‹€. λͺ‡ 가지 μ‹€μš©μ μΈ μ˜ˆλŠ” λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€:

  1. μ‚¬μš©μž 지정 μ§€ν‘œ λ‘œκΉ…: ꡐ윑 μ’…λ£Œ λ˜λŠ” 검증 κΈ°κ°„κ³Ό 같은 λ‹€μ–‘ν•œ λ‹¨κ³„μ—μ„œ μΆ”κ°€ μ§€ν‘œλ₯Ό κΈ°λ‘ν•©λ‹ˆλ‹€.
  2. 데이터 증강: 예츑 λ˜λŠ” ν•™μŠ΅ 배치 쀑에 μ‚¬μš©μž 지정 데이터 λ³€ν™˜ λ˜λŠ” 증강을 κ΅¬ν˜„ν•©λ‹ˆλ‹€.
  3. 쀑간 κ²°κ³Ό: μΆ”κ°€ 뢄석 λ˜λŠ” μ‹œκ°ν™”λ₯Ό μœ„ν•΄ 예츑 λ˜λŠ” ν”„λ ˆμž„κ³Ό 같은 쀑간 κ²°κ³Όλ₯Ό μ €μž₯ν•©λ‹ˆλ‹€.

μ˜ˆμ‹œ: λ‹€μŒμ„ μ‚¬μš©ν•˜μ—¬ 예츑 쀑에 ν”„λ ˆμž„μ„ 예츑 결과와 κ²°ν•©ν•˜κΈ° 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

전체 콜백 μ°Έμ‘°λ₯Ό μ‚΄νŽ΄λ³΄κ³  더 λ§Žμ€ μ˜΅μ…˜κ³Ό μ˜ˆμ‹œλ₯Ό μ°Ύμ•„λ³΄μ„Έμš”.

πŸ“…1 λ…„ μ „ 생성됨 ✏️ 1κ°œμ›” μ „ μ—…λ°μ΄νŠΈλ¨

λŒ“κΈ€