# =======================================================================
#   Objects365 V2 – 365 classes  (id 1~365)  ·  MMYOLO Helper Module
#   경로:  /data/ltb/mmyolo/objects365_classes.py
#   작성:  2025-06-27
# =======================================================================

from __future__ import annotations
import random
import numpy as np

# -----------------------------------------------------------------------
# 1) 클래스 목록  (id 순서, 길이 = 365)
# -----------------------------------------------------------------------
OBJECTS365_CLASSES: tuple[str, ...] = (
    #   1 –  20
    "Person", "Sneakers", "Chair", "Other Shoes", "Hat", "Car", "Lamp",
    "Glasses", "Bottle", "Desk", "Cup", "Street Lights", "Cabinet/Shelf",
    "Handbag/Satchel", "Bracelet", "Plate", "Picture/Frame", "Helmet",
    "Book", "Gloves",
    #  21 –  40
    "Storage box", "Boat", "Leather Shoes", "Flower", "Bench",
    "Potted Plant", "Bowl/Basin", "Flag", "Pillow", "Boots",
    "Vase", "Microphone", "Necklace", "Ring", "SUV", "Wine Glass",
    "Belt", "Moniter/TV", "Backpack", "Umbrella",
    #  41 –  60
    "Traffic Light", "Speaker", "Watch", "Tie", "Trash bin Can",
    "Slippers", "Bicycle", "Stool", "Barrel/Bucket", "Van", "Couch",
    "Sandals", "Basket", "Drum", "Pen/Pencil", "Bus", "Wild Bird",
    "High Heels", "Motorcycle", "Guitar",
    #  61 –  80
    "Carpet", "Cell Phone", "Bread", "Camera", "Canned",
    "Truck", "Traffic cone", "Cymbal", "Lifesaver", "Towel",
    "Stuffed Toy", "Candle", "Sailboat", "Laptop", "Awning", "Bed",
    "Faucet", "Tent", "Horse", "Mirror",
    #  81 – 100
    "Power outlet", "Sink", "Apple", "Air Conditioner", "Knife",
    "Hockey Stick", "Paddle", "Pickup Truck", "Fork", "Traffic Sign",
    "Ballon", "Tripod", "Dog", "Spoon", "Clock", "Pot", "Cow", "Cake",
    "Dinning Table", "Sheep",
    # 101 – 120
    "Hanger", "Blackboard/Whiteboard", "Napkin", "Other Fish",
    "Orange/Tangerine", "Toiletry", "Keyboard", "Tomato", "Lantern",
    "Machinery Vehicle", "Fan", "Green Vegetables", "Banana",
    "Baseball Glove", "Airplane", "Mouse", "Train", "Pumpkin",
    "Soccer", "Skiboard",
    # 121 – 140
    "Luggage", "Nightstand", "Tea pot", "Telephone", "Trolley",
    "Head Phone", "Sports Car", "Stop Sign", "Dessert", "Scooter",
    "Stroller", "Crane", "Remote", "Refrigerator", "Oven", "Lemon",
    "Duck", "Baseball Bat", "Surveillance Camera", "Cat",
    # 141 – 160
    "Jug", "Broccoli", "Piano", "Pizza", "Elephant", "Skateboard",
    "Surfboard", "Gun", "Skating and Skiing shoes", "Gas stove",
    "Donut", "Bow Tie", "Carrot", "Toilet", "Kite", "Strawberry",
    "Other Balls", "Shovel", "Pepper", "Computer Box",
    # 161 – 180
    "Toilet Paper", "Cleaning Products", "Chopsticks", "Microwave",
    "Pigeon", "Baseball", "Cutting/Chopping Board", "Coffee Table",
    "Side Table", "Scissors", "Marker", "Pie", "Ladder", "Snowboard",
    "Cookies", "Radiator", "Fire Hydrant", "Basketball", "Zebra",
    "Grape",
    # 181 – 200
    "Giraffe", "Potato", "Sausage", "Tricycle", "Violin", "Egg",
    "Fire Extinguisher", "Candy", "Fire Truck", "Billards", "Converter",
    "Bathtub", "Wheelchair", "Golf Club", "Briefcase", "Cucumber",
    "Cigar/Cigarette", "Paint Brush", "Pear", "Heavy Truck",
    # 201 – 220
    "Hamburger", "Extractor", "Extention Cord", "Tong",
    "Tennis Racket", "Folder", "American Football", "Earphone",
    "Mask", "Kettle", "Tennis", "Ship", "Swing", "Coffee Machine",
    "Slide", "Carriage", "Onion", "Green beans", "Projector",
    "Frisbee",
    # 221 – 240
    "Washing Machine/Drying Machine", "Chicken", "Printer",
    "Watermelon", "Saxophone", "Tissue", "Toothbrush",
    "Ice cream", "Hotair Ballon", "Cello", "French Fries", "Scale",
    "Trophy", "Cabbage", "Hot dog", "Blender", "Peach", "Rice",
    "Wallet/Purse", "Volleyball",
    # 241 – 260
    "Deer", "Goose", "Tape", "Tablet", "Cosmetics", "Trumpet",
    "Pineapple", "Golf Ball", "Ambulance", "Parking meter", "Mango",
    "Key", "Hurdle", "Fishing Rod", "Medal", "Flute", "Brush",
    "Penguin", "Megaphone", "Corn",
    # 261 – 280
    "Lettuce", "Garlic", "Swan", "Helicopter", "Green Onion",
    "Sandwich", "Nuts", "Speed Limit Sign", "Induction Cooker",
    "Broom", "Trombone", "Plum", "Rickshaw", "Goldfish", "Kiwi Fruit",
    "Router/Modem", "Poker Card", "Toaster", "Shrimp", "Sushi",
    # 281 – 300
    "Cheese", "Notepaper", "Cherry", "Pliers", "CD", "Pasta",
    "Hammer", "Cue", "Avocado", "Hamimelon", "Flask", "Mushroom",
    "Screwdriver", "Soap", "Recorder", "Bear", "Eggplant",
    "Board Eraser", "Coconut", "Tape Measure/Ruler",
    # 301 – 320
    "Pig", "Showerhead", "Globe", "Chips", "Steak", "Crosswalk Sign",
    "Stapler", "Camel", "Formula 1", "Pomegranate", "Dishwasher",
    "Crab", "Hoverboard", "Meat Ball", "Rice Cooker", "Tuba",
    "Calculator", "Papaya", "Antelope", "Parrot",
    # 321 – 340
    "Seal", "Butterfly", "Dumbbell", "Donkey", "Lion", "Urinal",
    "Dolphin", "Electric Drill", "Hair Dryer", "Egg Tart", "Jellyfish",
    "Treadmill", "Lighter", "Grapefruit", "Game Board", "Mop",
    "Radish", "Baozi", "Target", "French",
    # 341 – 360
    "Spring Rolls", "Monkey", "Rabbit", "Pencil Case", "Yak",
    "Red Cabbage", "Binoculars", "Asparagus", "Barbell", "Scallop",
    "Noodles", "Comb", "Dumpling", "Oyster", "Table Tennis Paddle",
    "Cosmetics Brush/Eyeliner Pencil", "Chainsaw", "Eraser", "Lobster",
    "Durian",
    # 361 – 365
    "Okra", "Lipstick", "Cosmetics Mirror", "Curling", "Table Tennis"
)

# -----------------------------------------------------------------------
# 2) 팔레트 (고정 난수 – 시각화 용도)
# -----------------------------------------------------------------------
random.seed(42)
PALETTE: list[tuple[int, int, int]] = [
    tuple(np.random.randint(0, 255, 3).tolist()) for _ in range(len(OBJECTS365_CLASSES))
]

# -----------------------------------------------------------------------
# 3) 보조 사전 & METAINFO
# -----------------------------------------------------------------------
ID2NAME = {i + 1: n for i, n in enumerate(OBJECTS365_CLASSES)}  # COCO id는 1-based
NAME2ID = {v: k for k, v in ID2NAME.items()}

METAINFO = dict(classes=OBJECTS365_CLASSES, palette=PALETTE)

# --------------------------- 디버그 실행 -------------------------------
if __name__ == "__main__":
    print(f"총 클래스  : {len(OBJECTS365_CLASSES)}")
    print(f"예시 1~5  : {OBJECTS365_CLASSES[:5]}")
    print(f"팔레트 길이: {len(PALETTE)}")
