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

레이 νŠ μ„ ν†΅ν•œ 효율적인 ν•˜μ΄νΌνŒŒλΌλ―Έν„° νŠœλ‹ 및 YOLOv8

ν•˜μ΄νΌνŒŒλΌλ―Έν„° νŠœλ‹μ€ 졜적의 ν•˜μ΄νΌνŒŒλΌλ―Έν„° μ„ΈνŠΈλ₯Ό λ°œκ²¬ν•˜μ—¬ 졜고의 λͺ¨λΈ μ„±λŠ₯을 λ‹¬μ„±ν•˜λŠ” 데 ν•„μˆ˜μ μž…λ‹ˆλ‹€. μ—¬κΈ°μ—λŠ” λ‹€μ–‘ν•œ ν•˜μ΄νΌνŒŒλΌλ―Έν„°λ‘œ ν…ŒμŠ€νŠΈλ₯Ό μ‹€ν–‰ν•˜κ³  각 ν…ŒμŠ€νŠΈμ˜ μ„±λŠ₯을 ν‰κ°€ν•˜λŠ” μž‘μ—…μ΄ ν¬ν•¨λ©λ‹ˆλ‹€.

Ultralytics YOLOv8 및 레이 튠으둜 νŠœλ‹μ„ κ°€μ†ν™”ν•˜μ„Έμš”.

Ultralytics YOLOv8 λŠ” ν•˜μ΄νΌνŒŒλΌλ―Έν„° νŠœλ‹μ„ μœ„ν•œ 레이 νŠ μ„ ν†΅ν•©ν•˜μ—¬ YOLOv8 λͺ¨λΈ ν•˜μ΄νΌνŒŒλΌλ―Έν„°μ˜ μ΅œμ ν™”λ₯Ό κ°„μ†Œν™”ν•©λ‹ˆλ‹€. 레이 νŠ μ„ μ‚¬μš©ν•˜λ©΄ κ³ κΈ‰ 검색 μ „λž΅, 병렬 처리, μ‘°κΈ° 쀑지λ₯Ό ν™œμš©ν•˜μ—¬ νŠœλ‹ ν”„λ‘œμ„ΈμŠ€λ₯Ό μ‹ μ†ν•˜κ²Œ 진행할 수 μžˆμŠ΅λ‹ˆλ‹€.

레이 튠

레이 튠 κ°œμš”

레이 νŠ μ€ νš¨μœ¨μ„±κ³Ό μœ μ—°μ„±μ„ μœ„ν•΄ μ„€κ³„λœ ν•˜μ΄νΌνŒŒλΌλ―Έν„° νŠœλ‹ λΌμ΄λΈŒλŸ¬λ¦¬μž…λ‹ˆλ‹€. λ‹€μ–‘ν•œ 검색 μ „λž΅, 병렬 처리, μ‘°κΈ° 쀑지 μ „λž΅μ„ μ§€μ›ν•˜λ©° Ultralytics YOLOv8 을 λΉ„λ‘―ν•œ 인기 μžˆλŠ” λ¨Έμ‹  λŸ¬λ‹ ν”„λ ˆμž„μ›Œν¬μ™€ μ›ν™œν•˜κ²Œ ν†΅ν•©λ©λ‹ˆλ‹€.

λ‹€μŒκ³Όμ˜ 톡합 Weights & Biases

YOLOv8 와 μ„ νƒμ μœΌλ‘œ ν†΅ν•©ν•˜μ—¬ Weights & Biases 와 μ„ νƒμ μœΌλ‘œ 톡합할 μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€.

μ„€μΉ˜

ν•„μš”ν•œ νŒ¨ν‚€μ§€λ₯Ό μ„€μΉ˜ν•˜λ €λ©΄ μ‹€ν–‰ν•©λ‹ˆλ‹€:

μ„€μΉ˜

# Install and update Ultralytics and Ray Tune packages
pip install -U ultralytics "ray[tune]"

# Optionally install W&B for logging
pip install wandb

μ‚¬μš©λ²•

μ‚¬μš©λ²•

from ultralytics import YOLO

# Load a YOLOv8n model
model = YOLO("yolov8n.pt")

# Start tuning hyperparameters for YOLOv8n training on the COCO8 dataset
result_grid = model.tune(data="coco8.yaml", use_ray=True)

tune() λ©”μ„œλ“œ λ§€κ°œλ³€μˆ˜

그리고 tune() λ©”μ„œλ“œ( YOLOv8 )λŠ” 레이 νŠœλ‹μ„ ν†΅ν•œ ν•˜μ΄νΌνŒŒλΌλ―Έν„° νŠœλ‹μ„ μœ„ν•œ μ‚¬μš©ν•˜κΈ° μ‰¬μš΄ μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ œκ³΅ν•©λ‹ˆλ‹€. νŠœλ‹ ν”„λ‘œμ„ΈμŠ€λ₯Ό μ‚¬μš©μž 지정할 수 μžˆλŠ” μ—¬λŸ¬ 인수λ₯Ό μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€. μ•„λž˜λŠ” 각 νŒŒλΌλ―Έν„°μ— λŒ€ν•œ μžμ„Έν•œ μ„€λͺ…μž…λ‹ˆλ‹€:

λ§€κ°œλ³€μˆ˜ μœ ν˜• μ„€λͺ… κΈ°λ³Έκ°’
data str νŠœλ„ˆλ₯Ό μ‹€ν–‰ν•  데이터 μ„ΈνŠΈ ꡬ성 파일(YAML ν˜•μ‹)μž…λ‹ˆλ‹€. 이 νŒŒμΌμ—λŠ” ν•™μŠ΅ 및 μœ νš¨μ„± 검사 데이터 κ²½λ‘œμ™€ 기타 데이터 μ„ΈνŠΈλ³„ 섀정이 μ§€μ •λ˜μ–΄μ•Ό ν•©λ‹ˆλ‹€.
space dict, optional 레이 튠의 ν•˜μ΄νΌνŒŒλΌλ―Έν„° 검색 곡간을 μ •μ˜ν•˜λŠ” μ‚¬μ „μž…λ‹ˆλ‹€. 각 ν‚€λŠ” ν•˜μ΄νΌνŒŒλΌλ―Έν„° 이름에 ν•΄λ‹Ήν•˜λ©°, 값은 νŠœλ‹ 쀑에 탐색할 κ°’μ˜ λ²”μœ„λ₯Ό μ§€μ •ν•©λ‹ˆλ‹€. μ œκ³΅ν•˜μ§€ μ•ŠμœΌλ©΄ YOLOv8 λ‹€μ–‘ν•œ ν•˜μ΄νΌνŒŒλΌλ―Έν„°κ°€ ν¬ν•¨λœ κΈ°λ³Έ 검색 곡간을 μ‚¬μš©ν•©λ‹ˆλ‹€.
grace_period int, optional 레이 νŠ μ—μ„œ ASHA μŠ€μΌ€μ€„λŸ¬μ˜ 에포크 λ‹¨μœ„ 유예 κΈ°κ°„μž…λ‹ˆλ‹€. μŠ€μΌ€μ€„λŸ¬λŠ” 이 에포크 수 μ΄μ „μ—λŠ” μ–΄λ–€ μ‹œν—˜λ„ μ’…λ£Œν•˜μ§€ μ•ŠμœΌλ―€λ‘œ λͺ¨λΈμ΄ μ‘°κΈ° 쀑단을 κ²°μ •ν•˜κΈ° 전에 μ΅œμ†Œν•œμ˜ ν›ˆλ ¨μ„ ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 10
gpu_per_trial int, optional νŠœλ‹ 쀑 ν‰κ°€νŒλ‹Ή ν• λ‹Ήν•  GPU μˆ˜μž…λ‹ˆλ‹€. μ΄λŠ” 특히 닀쀑GPU ν™˜κ²½μ—μ„œ GPU μ‚¬μš©λŸ‰μ„ κ΄€λ¦¬ν•˜λŠ” 데 도움이 λ©λ‹ˆλ‹€. μ œκ³΅λ˜μ§€ μ•ŠμœΌλ©΄ νŠœλ„ˆλŠ” μ‚¬μš© κ°€λŠ₯ν•œ λͺ¨λ“  GPUλ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€. μ—†μŒ
iterations int, optional νŠœλ‹ 쀑에 μ‹€ν–‰ν•  μ΅œλŒ€ νŠΈλΌμ΄μ–Ό νšŸμˆ˜μž…λ‹ˆλ‹€. 이 맀개 λ³€μˆ˜λŠ” ν…ŒμŠ€νŠΈλ˜λŠ” 총 ν•˜μ΄νΌνŒŒλΌλ―Έν„° μ‘°ν•© 수λ₯Ό μ œμ–΄ν•˜μ—¬ νŠœλ‹ ν”„λ‘œμ„ΈμŠ€κ°€ λ¬΄ν•œμ • μ‹€ν–‰λ˜μ§€ μ•Šλ„λ‘ ν•˜λŠ” 데 도움이 λ©λ‹ˆλ‹€. 10
**train_args dict, optional 에 전달할 μΆ”κ°€ μΈμˆ˜λŠ” train() λ©”μ„œλ“œμ— 전달할 수 μžˆμŠ΅λ‹ˆλ‹€. μ΄λŸ¬ν•œ μΈμˆ˜μ—λŠ” νŠΈλ ˆμ΄λ‹ 에포크 수, 배치 크기 및 기타 νŠΈλ ˆμ΄λ‹ κ΄€λ ¨ ꡬ성과 같은 섀정이 포함될 수 μžˆμŠ΅λ‹ˆλ‹€. {}

μ΄λŸ¬ν•œ νŒŒλΌλ―Έν„°λ₯Ό μ‚¬μš©μž μ§€μ •ν•˜λ©΄ νŠΉμ • μš”κ΅¬ 사항과 μ‚¬μš© κ°€λŠ₯ν•œ μ»΄ν“¨νŒ… λ¦¬μ†ŒμŠ€μ— 맞게 ν•˜μ΄νΌνŒŒλΌλ―Έν„° μ΅œμ ν™” ν”„λ‘œμ„ΈμŠ€λ₯Ό λ―Έμ„Έ μ‘°μ •ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

κΈ°λ³Έ 검색 곡간 μ„€λͺ…

λ‹€μŒ ν‘œμ—λŠ” Ray Tune을 μ‚¬μš©ν•œ ν•˜μ΄νΌνŒŒλΌλ―Έν„° νŠœλ‹μ„ μœ„ν•œ κΈ°λ³Έ 검색 곡간 λ§€κ°œλ³€μˆ˜( YOLOv8 )κ°€ λ‚˜μ™€ μžˆμŠ΅λ‹ˆλ‹€. 각 λ§€κ°œλ³€μˆ˜μ—λŠ” λ‹€μŒκ³Ό 같이 μ •μ˜λœ νŠΉμ • κ°’ λ²”μœ„κ°€ μžˆμŠ΅λ‹ˆλ‹€. tune.uniform().

λ§€κ°œλ³€μˆ˜ κ°’ λ²”μœ„ μ„€λͺ…
lr0 tune.uniform(1e-5, 1e-1) 초기 ν•™μŠ΅λ₯ 
lrf tune.uniform(0.01, 1.0) μ΅œμ’… ν•™μŠ΅λ₯  κ³„μˆ˜
momentum tune.uniform(0.6, 0.98) λͺ¨λ©˜ν…€
weight_decay tune.uniform(0.0, 0.001) 체쀑 κ°μ†Œ
warmup_epochs tune.uniform(0.0, 5.0) μ›Œλ°μ—… 에포크
warmup_momentum tune.uniform(0.0, 0.95) μ›Œλ°μ—… λͺ¨λ©˜ν…€
box tune.uniform(0.02, 0.2) λ°•μŠ€ κ°λŸ‰ 무게
cls tune.uniform(0.2, 4.0) 클래슀 κ°λŸ‰ 체쀑
hsv_h tune.uniform(0.0, 0.1) 색쑰 ν™•λŒ€ λ²”μœ„
hsv_s tune.uniform(0.0, 0.9) 채도 증강 λ²”μœ„
hsv_v tune.uniform(0.0, 0.9) κ°’(밝기) ν™•λŒ€ λ²”μœ„
degrees tune.uniform(0.0, 45.0) νšŒμ „ ν™•λŒ€ λ²”μœ„(도)
translate tune.uniform(0.0, 0.9) λ²ˆμ—­ 증강 λ²”μœ„
scale tune.uniform(0.0, 0.9) ν™•μž₯ λ²”μœ„ ν™•λŒ€
shear tune.uniform(0.0, 10.0) 전단 증강 λ²”μœ„(도)
perspective tune.uniform(0.0, 0.001) 원근 증강 λ²”μœ„
flipud tune.uniform(0.0, 1.0) 수직 뒀집기 ν™•λŒ€ ν™•λ₯ 
fliplr tune.uniform(0.0, 1.0) μˆ˜ν‰ 뒀집기 ν™•λŒ€ ν™•λ₯ 
mosaic tune.uniform(0.0, 1.0) λͺ¨μžμ΄ν¬ ν™•λŒ€ ν™•λ₯ 
mixup tune.uniform(0.0, 1.0) λ―ΉμŠ€μ—… 증강 ν™•λ₯ 
copy_paste tune.uniform(0.0, 1.0) 볡사-λΆ™μ—¬λ„£κΈ° ν™•λŒ€ ν™•λ₯ 

μ‚¬μš©μž 지정 검색 곡간 예제

이 μ˜ˆμ—μ„œλŠ” 레이 튠과 YOLOv8 을 μ‚¬μš©ν•˜μ—¬ ν•˜μ΄νΌνŒŒλΌλ―Έν„° νŠœλ‹μ„ μœ„ν•œ μ‚¬μš©μž 지정 검색 곡간을 μ‚¬μš©ν•˜λŠ” 방법을 λ³΄μ—¬μ€λ‹ˆλ‹€. μ‚¬μš©μž 지정 검색 곡간을 μ œκ³΅ν•˜λ©΄ 관심 μžˆλŠ” νŠΉμ • ν•˜μ΄νΌνŒŒλΌλ―Έν„°μ— νŠœλ‹ ν”„λ‘œμ„ΈμŠ€λ₯Ό 집쀑할 수 μžˆμŠ΅λ‹ˆλ‹€.

μ‚¬μš©λ²•

from ultralytics import YOLO

# Define a YOLO model
model = YOLO("yolov8n.pt")

# Run Ray Tune on the model
result_grid = model.tune(
    data="coco8.yaml",
    space={"lr0": tune.uniform(1e-5, 1e-1)},
    epochs=50,
    use_ray=True,
)

μœ„μ˜ μ½”λ“œ μŠ€λ‹ˆνŽ«μ—μ„œλŠ” "yolov8n.pt" 사전 ν•™μŠ΅λœ κ°€μ€‘μΉ˜λ₯Ό μ‚¬μš©ν•˜μ—¬ YOLO λͺ¨λΈμ„ μƒμ„±ν•©λ‹ˆλ‹€. 그런 λ‹€μŒ tune() λ©”μ„œλ“œμ— "coco8.yaml"둜 데이터 μ„ΈνŠΈ ꡬ성을 μ§€μ •ν•©λ‹ˆλ‹€. 초기 ν•™μŠ΅λ₯ μ— λŒ€ν•œ μ‚¬μš©μž μ •μ˜ 검색 곡간을 μ œκ³΅ν•©λ‹ˆλ‹€. lr0 ν‚€ "lr0"κ³Ό κ°’ tune.uniform(1e-5, 1e-1). λ§ˆμ§€λ§‰μœΌλ‘œ, 에포크 μˆ˜μ™€ 같은 μΆ”κ°€ ν›ˆλ ¨ 인수λ₯Ό λ‹€μŒκ³Ό 같이 튠 λ©”μ„œλ“œμ— 직접 μ „λ‹¬ν•©λ‹ˆλ‹€. epochs=50.

레이 튠 결과 처리

레이 νŠœλ‹μœΌλ‘œ ν•˜μ΄νΌνŒŒλΌλ―Έν„° νŠœλ‹ μ‹€ν—˜μ„ μ‹€ν–‰ν•œ ν›„μ—λŠ” 얻은 결과에 λŒ€ν•΄ λ‹€μ–‘ν•œ 뢄석을 μˆ˜ν–‰ν•΄μ•Ό ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 이 κ°€μ΄λ“œμ—μ„œλŠ” μ΄λŸ¬ν•œ κ²°κ³Όλ₯Ό μ²˜λ¦¬ν•˜κ³  λΆ„μ„ν•˜λŠ” 일반적인 μ›Œν¬ν”Œλ‘œλ₯Ό μ•ˆλ‚΄ν•©λ‹ˆλ‹€.

λ””λ ‰ν† λ¦¬μ—μ„œ νŠœλ‹ μ‹€ν—˜ κ²°κ³Ό λ‘œλ“œ

νŠœλ‹ μ‹€ν—˜μ„ μ‹€ν–‰ν•œ ν›„ tuner.fit()λ₯Ό μ‚¬μš©ν•˜λ©΄ λ””λ ‰ν† λ¦¬μ—μ„œ κ²°κ³Όλ₯Ό λ‘œλ“œν•  수 μžˆμŠ΅λ‹ˆλ‹€. 이 κΈ°λŠ₯은 특히 초기 ꡐ윑 μŠ€ν¬λ¦½νŠΈκ°€ μ’…λ£Œλœ ν›„ 뢄석을 μˆ˜ν–‰ν•˜λŠ” κ²½μš°μ— μœ μš©ν•©λ‹ˆλ‹€.

experiment_path = f"{storage_path}/{exp_name}"
print(f"Loading results from {experiment_path}...")

restored_tuner = tune.Tuner.restore(experiment_path, trainable=train_mnist)
result_grid = restored_tuner.get_results()

κΈ°λ³Έ μ‹€ν—˜ μˆ˜μ€€ 뢄석

ν‰κ°€νŒμ΄ μ–΄λ–»κ²Œ μˆ˜ν–‰λ˜μ—ˆλŠ”μ§€μ— λŒ€ν•œ κ°œμš”λ₯Ό ν™•μΈν•˜μ„Έμš”. ν‰κ°€νŒ 쀑에 였λ₯˜κ°€ μžˆμ—ˆλŠ”μ§€ λΉ λ₯΄κ²Œ 확인할 수 μžˆμŠ΅λ‹ˆλ‹€.

if result_grid.errors:
    print("One or more trials failed!")
else:
    print("No errors!")

κΈ°λ³Έ ν‰κ°€νŒ μˆ˜μ€€ 뢄석

κ°œλ³„ ν‰κ°€νŒ ν•˜μ΄νΌνŒŒλΌλ―Έν„° ꡬ성 및 λ§ˆμ§€λ§‰μœΌλ‘œ 보고된 μ§€ν‘œμ— μ•‘μ„ΈμŠ€ν•©λ‹ˆλ‹€.

for i, result in enumerate(result_grid):
    print(f"Trial #{i}: Configuration: {result.config}, Last Reported Metrics: {result.metrics}")

ν‰κ°€νŒμ— λŒ€ν•΄ 보고된 μ§€ν‘œμ˜ 전체 기둝 ν”Œλ‘œνŒ…ν•˜κΈ°

각 ν‰κ°€νŒμ— λŒ€ν•΄ 보고된 μ§€ν‘œμ˜ 기둝을 ν”Œλ‘œνŒ…ν•˜μ—¬ μ‹œκ°„μ΄ 지남에 따라 μ§€ν‘œκ°€ μ–΄λ–»κ²Œ λ³€ν™”ν–ˆλŠ”μ§€ 확인할 수 μžˆμŠ΅λ‹ˆλ‹€.

import matplotlib.pyplot as plt

for result in result_grid:
    plt.plot(
        result.metrics_dataframe["training_iteration"],
        result.metrics_dataframe["mean_accuracy"],
        label=f"Trial {i}",
    )

plt.xlabel("Training Iterations")
plt.ylabel("Mean Accuracy")
plt.legend()
plt.show()

μš”μ•½

이 λ¬Έμ„œμ—μ„œλŠ” Ultralytics 을 μ‚¬μš©ν•˜μ—¬ 레이 튠으둜 μ‹€ν–‰ν•œ μ‹€ν—˜μ˜ κ²°κ³Όλ₯Ό λΆ„μ„ν•˜λŠ” 일반적인 μ›Œν¬ν”Œλ‘œμš°λ₯Ό λ‹€λ£¨μ—ˆμŠ΅λ‹ˆλ‹€. μ£Όμš” λ‹¨κ³„μ—λŠ” λ””λ ‰ν† λ¦¬μ—μ„œ μ‹€ν—˜ κ²°κ³Όλ₯Ό λ‘œλ“œν•˜κ³ , κΈ°λ³Έ μ‹€ν—˜ μˆ˜μ€€ 및 μ‹œν—˜ μˆ˜μ€€ 뢄석을 μˆ˜ν–‰ν•˜κ³ , λ©”νŠΈλ¦­μ„ ν”Œλ‘œνŒ…ν•˜λŠ” 것이 ν¬ν•¨λ©λ‹ˆλ‹€.

레이튠의 κ²°κ³Ό 뢄석 λ¬Έμ„œ νŽ˜μ΄μ§€μ—μ„œ ν•˜μ΄νΌνŒŒλΌλ―Έν„° νŠœλ‹ μ‹€ν—˜μ„ μ΅œλŒ€ν•œ ν™œμš©ν•˜κΈ° μœ„ν•œ μžμ„Έν•œ λ‚΄μš©μ„ μ‚΄νŽ΄λ³΄μ„Έμš”.

자주 λ¬»λŠ” 질문

레이 νŠ μ„ μ‚¬μš©ν•˜μ—¬ YOLOv8 λͺ¨λΈμ˜ ν•˜μ΄νΌνŒŒλΌλ―Έν„°λ₯Ό μ‘°μ •ν•˜λ €λ©΄ μ–΄λ–»κ²Œ ν•΄μ•Ό ν•˜λ‚˜μš”?

레이 νŠœλ‹μ„ μ‚¬μš©ν•˜μ—¬ Ultralytics YOLOv8 λͺ¨λΈμ˜ ν•˜μ΄νΌνŒŒλΌλ―Έν„°λ₯Ό νŠœλ‹ν•˜λ €λ©΄ λ‹€μŒ 단계λ₯Ό λ”°λ₯΄μ„Έμš”:

  1. ν•„μš”ν•œ νŒ¨ν‚€μ§€λ₯Ό μ„€μΉ˜ν•©λ‹ˆλ‹€:

    pip install -U ultralytics "ray[tune]"
    pip install wandb  # optional for logging
    
  2. YOLOv8 λͺ¨λΈμ„ λ‘œλ“œν•˜κ³  νŠœλ‹μ„ μ‹œμž‘ν•©λ‹ˆλ‹€:

    from ultralytics import YOLO
    
    # Load a YOLOv8 model
    model = YOLO("yolov8n.pt")
    
    # Start tuning with the COCO8 dataset
    result_grid = model.tune(data="coco8.yaml", use_ray=True)
    

레이 튠의 κ³ κΈ‰ 검색 μ „λž΅κ³Ό 병렬 처리λ₯Ό ν™œμš©ν•˜μ—¬ λͺ¨λΈμ˜ ν•˜μ΄νΌνŒŒλΌλ―Έν„°λ₯Ό 효율적으둜 μ΅œμ ν™”ν•©λ‹ˆλ‹€. μžμ„Έν•œ λ‚΄μš©μ€ 레이 튠 μ„€λͺ…μ„œλ₯Ό μ°Έμ‘°ν•˜μ„Έμš”.

레이 νŠ μ„ μ‚¬μš©ν•œ YOLOv8 νŠœλ‹μ˜ κΈ°λ³Έ ν•˜μ΄νΌνŒŒλΌλ―Έν„°λŠ” λ¬΄μ—‡μΈκ°€μš”?

Ultralytics YOLOv8 λŠ” 레이 튠 νŠœλ‹μ— λ‹€μŒκ³Ό 같은 κΈ°λ³Έ ν•˜μ΄νΌνŒŒλΌλ―Έν„°λ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€:

λ§€κ°œλ³€μˆ˜ κ°’ λ²”μœ„ μ„€λͺ…
lr0 tune.uniform(1e-5, 1e-1) 초기 ν•™μŠ΅λ₯ 
lrf tune.uniform(0.01, 1.0) μ΅œμ’… ν•™μŠ΅λ₯  κ³„μˆ˜
momentum tune.uniform(0.6, 0.98) λͺ¨λ©˜ν…€
weight_decay tune.uniform(0.0, 0.001) 체쀑 κ°μ†Œ
warmup_epochs tune.uniform(0.0, 5.0) μ›Œλ°μ—… 에포크
box tune.uniform(0.02, 0.2) λ°•μŠ€ κ°λŸ‰ 무게
cls tune.uniform(0.2, 4.0) 클래슀 κ°λŸ‰ 체쀑
hsv_h tune.uniform(0.0, 0.1) 색쑰 ν™•λŒ€ λ²”μœ„
translate tune.uniform(0.0, 0.9) λ²ˆμ—­ 증강 λ²”μœ„

μ΄λŸ¬ν•œ ν•˜μ΄νΌνŒŒλΌλ―Έν„°λŠ” νŠΉμ • μš”κ΅¬μ‚¬ν•­μ— 맞게 μ‚¬μš©μž 지정할 수 μžˆμŠ΅λ‹ˆλ‹€. 전체 λͺ©λ‘κ³Ό μžμ„Έν•œ λ‚΄μš©μ€ ν•˜μ΄νΌνŒŒλΌλ―Έν„° νŠœλ‹ κ°€μ΄λ“œλ₯Ό μ°Έμ‘°ν•˜μ„Έμš”.

YOLOv8 λͺ¨λΈ νŠœλ‹μ— Weights & Biases 을 ν†΅ν•©ν•˜λ €λ©΄ μ–΄λ–»κ²Œ ν•΄μ•Ό ν•˜λ‚˜μš”?

Weights & Biases (W&B)λ₯Ό Ultralytics YOLOv8 νŠœλ‹ ν”„λ‘œμ„ΈμŠ€μ™€ ν†΅ν•©ν•˜λ €λ©΄:

  1. W&Bλ₯Ό μ„€μΉ˜ν•©λ‹ˆλ‹€:

    pip install wandb
    
  2. νŠœλ‹ 슀크립트λ₯Ό μˆ˜μ •ν•©λ‹ˆλ‹€:

    import wandb
    
    from ultralytics import YOLO
    
    wandb.init(project="YOLO-Tuning", entity="your-entity")
    
    # Load YOLO model
    model = YOLO("yolov8n.pt")
    
    # Tune hyperparameters
    result_grid = model.tune(data="coco8.yaml", use_ray=True)
    

이 섀정을 톡해 νŠœλ‹ ν”„λ‘œμ„ΈμŠ€λ₯Ό λͺ¨λ‹ˆν„°λ§ν•˜κ³ , ν•˜μ΄νΌνŒŒλΌλ―Έν„° ꡬ성을 μΆ”μ ν•˜κ³ , W&Bμ—μ„œ κ²°κ³Όλ₯Ό μ‹œκ°ν™”ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

ν•˜μ΄νΌνŒŒλΌλ―Έν„° μ΅œμ ν™”λ₯Ό μœ„ν•΄ 레이 νŠ μ„ μ‚¬μš©ν•΄μ•Ό ν•˜λŠ” 이유 YOLOv8?

레이 νŠ μ€ ν•˜μ΄νΌνŒŒλΌλ―Έν„° μ΅œμ ν™”λ₯Ό μœ„ν•œ λ‹€μ–‘ν•œ 이점을 μ œκ³΅ν•©λ‹ˆλ‹€:

  • κ³ κΈ‰ 검색 μ „λž΅: 효율적인 λ§€κ°œλ³€μˆ˜ 검색을 μœ„ν•΄ λ² μ΄μ§€μ•ˆ μ΅œμ ν™” 및 HyperOpt와 같은 μ•Œκ³ λ¦¬μ¦˜μ„ ν™œμš©ν•©λ‹ˆλ‹€.
  • 병렬 처리: μ—¬λŸ¬ 번의 μ‹œν—˜ 싀행을 λ³‘λ ¬λ‘œ μ§€μ›ν•˜μ—¬ νŠœλ‹ ν”„λ‘œμ„ΈμŠ€μ˜ 속도λ₯Ό 크게 λ†’μž…λ‹ˆλ‹€.
  • μ‘°κΈ° μ’…λ£Œ: ASHA와 같은 μ „λž΅μ„ μ‚¬μš©ν•˜μ—¬ 싀적이 μ €μ‘°ν•œ μ‹€ν—˜μ„ 쑰기에 μ’…λ£Œν•˜μ—¬ μ»΄ν“¨νŒ… λ¦¬μ†ŒμŠ€λ₯Ό μ ˆμ•½ν•©λ‹ˆλ‹€.

레이 νŠ μ€ Ultralytics YOLOv8 κ³Ό μ›ν™œν•˜κ²Œ ν†΅ν•©λ˜μ–΄ ν•˜μ΄νΌνŒŒλΌλ―Έν„°λ₯Ό 효과적으둜 νŠœλ‹ν•  수 μžˆλŠ” μ‚¬μš©ν•˜κΈ° μ‰¬μš΄ μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ œκ³΅ν•©λ‹ˆλ‹€. μ‹œμž‘ν•˜λ €λ©΄ 레이 튠으둜 효율적인 ν•˜μ΄νΌνŒŒλΌλ―Έν„° νŠœλ‹ν•˜κΈ° 및 YOLOv8 κ°€μ΄λ“œλ₯Ό μ°Έμ‘°ν•˜μ„Έμš”.

YOLOv8 ν•˜μ΄νΌνŒŒλΌλ―Έν„° νŠœλ‹μ„ μœ„ν•œ μ‚¬μš©μž 지정 검색 곡간을 μ •μ˜ν•˜λ €λ©΄ μ–΄λ–»κ²Œ ν•΄μ•Ό ν•˜λ‚˜μš”?

레이 νŠœλ‹μœΌλ‘œ YOLOv8 ν•˜μ΄νΌνŒŒλΌλ―Έν„° νŠœλ‹μ„ μœ„ν•œ μ‚¬μš©μž 지정 검색 곡간을 μ •μ˜ν•˜λ €λ©΄:

from ray import tune

from ultralytics import YOLO

model = YOLO("yolov8n.pt")
search_space = {"lr0": tune.uniform(1e-5, 1e-1), "momentum": tune.uniform(0.6, 0.98)}
result_grid = model.tune(data="coco8.yaml", space=search_space, use_ray=True)

μ΄λ ‡κ²Œ ν•˜λ©΄ νŠœλ‹ ν”„λ‘œμ„ΈμŠ€ 쀑에 탐색할 초기 ν•™μŠ΅ 속도 및 μš΄λ™λŸ‰κ³Ό 같은 ν•˜μ΄νΌνŒŒλΌλ―Έν„°μ˜ λ²”μœ„λ₯Ό μ‚¬μš©μž 지정할 수 μžˆμŠ΅λ‹ˆλ‹€. κ³ κΈ‰ ꡬ성에 λŒ€ν•΄μ„œλŠ” μ‚¬μš©μž 지정 검색 곡간 예제 μ„Ήμ…˜μ„ μ°Έμ‘°ν•˜μ„Έμš”.



생성 2023-11-12, μ—…λ°μ΄νŠΈ 2024-07-05
μž‘μ„±μž: glenn-jocher (10)

λŒ“κΈ€