##############################################################################
# File: yolov8_l_960_custom.py
# Author: 사용자
# Date: 2023-xx-xx
# Description:
#   - YOLOv8-L 기반(COCO 80클래스 체크포인트) + 실제 클래스는 2개(Worker, helmet)
#   - bbox_head 부분 파라미터 mismatch를 무시하고 백본만 로드
#   - 해상도 (640,640) → (960,960)으로 변경
#   - Mosaic 과정에서 'img' 키 누락 방지 위해 base config의
#     pre_transform, mosaic_affine_transform, last_transform를 그대로 사용
#   - 한글 주석 및 상세 설명 포함
#   - 진행 상황(퍼센트)와 학습 시간은 default_runtime.py의 ProgressBarHook, IterTimerHook 사용
##############################################################################

##############################
# 1) 베이스 config 지정
##############################
_base_ = '../yolov8/yolov8_l_syncbn_fast_8xb16-500e_coco.py'

##########################################################
# File: yolov8_l_960_custom_mmpose.py (예시)
##########################################################

# 주의: mmyolo의 base config를 그대로 상속받으면,
#       여전히 YOLOv5KeepRatioResize 등이 남아있을 수 있음.
#       따라서 base config를 최대한 간단한 걸로 잡고,
#       custom pipeline을 전부 "표준 mmdet/mmcv"로 구성해야 함.



num_classes = 2
class_name = ('Worker','helmet')
metainfo = dict(classes=class_name)

model = dict(
    bbox_head=dict(
        head_module=dict(num_classes=num_classes),
    )
)

# 해상도
img_scale = (960,960)

##########################################################
# (핵심) 표준 Transform import를 어떻게 하느냐?
##########################################################
# - mmcv 2.x, mmdet 3.x 기준
# - 실제 버전에 따라 다를 수 있으니 주의

# 1) LoadImageFromFile, Resize, RandomFlip는 "mmcv.transforms"에 위치
# 2) LoadAnnotations, PackDetInputs는 "mmdet.datasets.transforms"에 위치
try:
    from mmcv.transforms import LoadImageFromFile, Resize
    from mmdet.datasets.transforms import RandomFlip, LoadAnnotations, PackDetInputs
except ImportError as e:
    print("[주의] mmcv/mmdet 버전에 따라 import 경로가 다를 수 있습니다.")
    raise e

train_pipeline = [
    dict(type='LoadImageFromFile'),      # mmcv.transforms.LoadImageFromFile
    dict(type='LoadAnnotations', with_bbox=True),  # mmdet.datasets.transforms.LoadAnnotations
    dict(
        type='Resize',   # mmcv.transforms.Resize
        scale=(960,960),
        keep_ratio=True
    ),
    dict(
        type='RandomFlip',   # mmdet.datasets.transforms.RandomFlip
        prob=0.5,
        # direction='horizontal' (기본값이 horizontal)
    ),
    dict(type='PackDetInputs') # mmdet.datasets.transforms.PackDetInputs
]

test_pipeline = [
    dict(type='LoadImageFromFile'),
    dict(type='Resize', scale=(960,960), keep_ratio=True),
    dict(type='PackDetInputs')
]

train_dataloader = dict(
    batch_size=8,
    num_workers=4,
    dataset=dict(
        _delete_=True,
        type='mmyolo.YOLOv5CocoDataset',
        data_root='data/your_dataset/',
        ann_file='train.json',
        data_prefix=dict(img='train/images/'),
        filter_cfg=dict(filter_empty_gt=False, min_size=32),
        pipeline=train_pipeline,
        metainfo=metainfo
    )
)

val_dataloader = dict(
    batch_size=1,
    num_workers=2,
    dataset=dict(
        _delete_=True,
        type='mmyolo.YOLOv5CocoDataset',
        data_root='data/your_dataset/',
        ann_file='val.json',
        data_prefix=dict(img='val/images/'),
        test_mode=True,
        pipeline=test_pipeline,
        metainfo=metainfo
    )
)
test_dataloader = val_dataloader

val_evaluator = dict(
    type='mmdet.CocoMetric',
    ann_file='data/your_dataset/val.json',
    metric='bbox'
)
test_evaluator = val_evaluator

# 추가 설정들...
# optim, etc...

print("[INFO] Using standard transforms from mmcv & mmdet only.")
