from ultralytics import YOLO

model = YOLO('yolo11n.pt')

results = model.train(
    # Learning Rate 관련
    lr0=0.01,           # 초기 학습률
    lrf=0.01,           # 최종 학습률 비율
    momentum=0.937,     # SGD 모멘텀
    weight_decay=0.0005, # 가중치 감쇠
    
    
    # 기본 학습 설정
    data='dataset.yaml',
    epochs=100,
    imgsz=256,
    batch=32,
    device="cuda:0",
    workers=2,
    
    # 추가 최적화 파라미터
    optimizer='SGD',     # 'SGD', 'AdamW'
    cos_lr=False,       # 코사인 학습률 스케줄러 #True 바꾸기
    warmup_epochs=3,    # 워밍업 에폭 수 #5로 바꾸기
    warmup_momentum=0.8, # 워밍업 모멘텀
    warmup_bias_lr=0.1, # 워밍업 바이어스 학습률

    # 성능 최적화
    amp=True,                    # 자동 혼합 정밀도 - 메모리 절약 & 속도 향상
    cache="disk",               # 디스크 캐싱 - 두 번째 에포크부터 빠른 로딩

    # 손실 함수 가중치 조정
    box=7.5,                    # 바운딩 박스 손실 가중치
    cls=1.5,                    # 분류 손실 가중치
    dfl=1.0,                    # Distribution Focal Loss 가중치
    
    # 기본 데이터 증강 (성능 향상)
    hsv_s=0.10,                 # 채도 변경 10%
    hsv_v=0.10,                 # 명도 변경 10%
    translate=0.05,             # 이미지 5% 이동
    scale=0.10,                 # 이미지 10% 크기 변경
    fliplr=0.2,                 # 좌우 반전 20%

    # mosaic, mixup 추가하기
    
    # 프로젝트 관리
    project="runs/train",       # 결과 저장 디렉토리
    name="yolo11n_custom",      # 실험 이름
    exist_ok=False,           # 기존 디렉토리 덮어쓰기 금지
    
    # 저장 설정
    save_period=10,     # 몇 에폭마다 체크포인트 저장할지
    patience=5,        # 얼리 스타핑
)

result:

									 Class     Images  Instances    Box(P.     R          mAP50      mAP50-95  
                   all       8546       8546      0.911      0.878      0.928      0.555
          bounding box       8546       8546      0.911      0.878      0.928      0.555