{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.12.12","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"gpu","dataSources":[{"sourceType":"datasetVersion","sourceId":14641282,"datasetId":9352929,"databundleVersionId":15480607},{"sourceType":"datasetVersion","sourceId":6633966,"datasetId":3649216,"databundleVersionId":6717740},{"sourceType":"modelInstanceVersion","sourceId":733968,"databundleVersionId":15489595,"modelInstanceId":558741}],"dockerImageVersionId":31260,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import os\nimport glob\nimport yaml\nimport shutil\nfrom pathlib import Path\n\n# --- CONFIGURATION ---\n\nINPUT_IMAGES_DIR = '/kaggle/input/xview-yolo-dataset/images' \nINPUT_CFG_DIR = '/kaggle/input/xview-yolo-dataset/YOLO_cfg'\n\n# --- SETUP WORKING DIRECTORIES ---\nWORKING_DIR = '/kaggle/working/dataset_v1'\nIMG_DIR = os.path.join(WORKING_DIR, 'images/train')\nLBL_DIR = os.path.join(WORKING_DIR, 'labels/train')\n\n# Create directories (and val directories)\nos.makedirs(IMG_DIR, exist_ok=True)\nos.makedirs(LBL_DIR, exist_ok=True)\nos.makedirs(WORKING_DIR + '/images/val', exist_ok=True)\nos.makedirs(WORKING_DIR + '/labels/val', exist_ok=True)\n\nprint(\"Symlinking images and separating labels... (This is fast)\")\n\n# Get all files from input\nall_files = os.listdir(INPUT_IMAGES_DIR)\njpg_files = [f for f in all_files if f.endswith('.jpg')]\n\n# Process files (Split 80/20 for Train/Val since we can't trust the old train.txt paths)\nsplit_index = int(len(jpg_files) * 0.9) # 90% train, 10% val\ntrain_files = jpg_files[:split_index]\nval_files = jpg_files[split_index:]\n\ndef link_files(files, subset):\n    target_img_dir = os.path.join(WORKING_DIR, 'images', subset)\n    target_lbl_dir = os.path.join(WORKING_DIR, 'labels', subset)\n    \n    for f in files:\n        # Symlink Image (Zero disk space used)\n        src_img = os.path.join(INPUT_IMAGES_DIR, f)\n        dst_img = os.path.join(target_img_dir, f)\n        if not os.path.exists(dst_img):\n            os.symlink(src_img, dst_img)\n        \n        # Copy/Symlink Label\n        # The label has the same name but .txt extension\n        label_name = f.replace('.jpg', '.txt')\n        src_lbl = os.path.join(INPUT_IMAGES_DIR, label_name)\n        dst_lbl = os.path.join(target_lbl_dir, label_name)\n        \n        # Only link if the label file actually exists\n        if os.path.exists(src_lbl):\n            if not os.path.exists(dst_lbl):\n                os.symlink(src_lbl, dst_lbl)\n\nlink_files(train_files, 'train')\nlink_files(val_files, 'val')\n\nprint(f\"Prepared {len(train_files)} training images and {len(val_files)} validation images.\")\n\n# --- CREATE YAML CONFIG ---\n# xView Classes (Standard 60 classes)\nclasses = {\n    0:\"Fixed-wing Aircraft\",\n    1:\"Small Aircraft\",\n    2:\"Passenger/Cargo Plane\",\n    3:\"Helicopter\",\n    4:\"Passenger Vehicle\",\n    5:\"Small Car\",\n    6:\"Bus\",\n    7:\"Pickup Truck\",\n    8:\"Utility Truck\",\n    9:\"Truck\",\n    10:\"Cargo Truck\",\n    11:\"Truck Tractor w/ Box Trailer\",\n    12:\"Truck Tractor\",\n    13:\"Trailer\",\n    14:\"Truck Tractor w/ Flatbed Trailer\",\n    15:\"Truck Tractor w/ Liquid Tank\",\n    16:\"Crane Truck\",\n    17:\"Railway Vehicle\",\n    18:\"Passenger Car\",\n    19:\"Cargo/Container Car\",\n    20:\"Flat Car\",\n    21:\"Tank car\",\n    22:\"Locomotive\",\n    23:\"Maritime Vessel\",\n    24:\"Motorboat\",\n    25:\"Sailboat\",\n    26:\"Tugboat\",\n    27:\"Barge\",\n    28:\"Fishing Vessel\",\n    29:\"Ferry\",\n    30:\"Yacht\",\n    31:\"Container Ship\",\n    32:\"Oil Tanker\",\n    33:\"Engineering Vehicle\",\n    34:\"Tower crane\",\n    35:\"Container Crane\",\n    36:\"Reach Stacker\",\n    37:\"Straddle Carrier\",\n    38:\"Mobile Crane\",\n    39:\"Dump Truck\",\n    40:\"Haul Truck\",\n    41:\"Scraper/Tractor\",\n    42:\"Front loader/Bulldozer\",\n    43:\"Excavator\",\n    44:\"Cement Mixer\",\n    45:\"Ground Grader\",\n    46:\"Hut/Tent\",\n    47:\"Shed\",\n    48:\"Building\",\n    49:\"Aircraft Hangar\",\n    50:\"Damaged Building\",\n    51:\"Facility\",\n    52:\"Construction Site\",\n    53:\"Vehicle Lot\",\n    54:\"Helipad\",\n    55:\"Storage Tank\",\n    56:\"Shipping container lot\",\n    57:\"Shipping Container\",\n    58:\"Pylon\",\n    59:\"Tower\"\n}\n\nyaml_data = {\n    'path': WORKING_DIR,\n    'train': 'images/train',\n    'val': 'images/val',\n    'names': classes\n}\n\nwith open('final_config.yaml', 'w') as f:\n    yaml.dump(yaml_data, f)\n\nprint(\"'final_config.yaml' created. Ready to train!\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-02-14T07:10:00.193136Z","iopub.execute_input":"2026-02-14T07:10:00.193309Z","iopub.status.idle":"2026-02-14T07:10:34.448433Z","shell.execute_reply.started":"2026-02-14T07:10:00.193291Z","shell.execute_reply":"2026-02-14T07:10:34.447609Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"!pip install -q ultralytics","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-02-14T07:10:44.275488Z","iopub.execute_input":"2026-02-14T07:10:44.276085Z","iopub.status.idle":"2026-02-14T07:10:49.378548Z","shell.execute_reply.started":"2026-02-14T07:10:44.276056Z","shell.execute_reply":"2026-02-14T07:10:49.377552Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from ultralytics import YOLO\n\nmodel = YOLO('yolov8s.pt')\n\nresults = model.train(\n    data='final_config.yaml',\n    epochs=25,\n    imgsz=640,\n    optimizer='AdamW',\n    patience=5,\n    close_mosaic=10,\n    flipud=0.5,\n    fliplr=0.5,\n    box=7.5,\n    cls=0.6,\n    project='xview_training',\n    name='run1'\n)\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-02-14T07:10:49.380089Z","iopub.execute_input":"2026-02-14T07:10:49.380334Z","iopub.status.idle":"2026-02-14T07:18:20.306758Z","shell.execute_reply.started":"2026-02-14T07:10:49.380308Z","shell.execute_reply":"2026-02-14T07:18:20.305027Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# from ultralytics import YOLO\n# import matplotlib.pyplot as plt\n# import cv2\n\n# # Load model\n# model = YOLO('/kaggle/input/best-model/other/default/4/best(1).pt')\n\n# # Run inference\n# # conf=0.25 means \"only show boxes where model is 25% sure\"\n# results = model.predict(source='/kaggle/input/test-image/Screenshot 2026-01-27 220048.png', conf=0.2,\n#     iou=0.65,\n#     close_mosaic=0,\n#     hsv_h=0.02,\n#     hsv_s=0.4,\n#     hsv_v=0.4,\n#     degrees=0,\n#     scale=0.5,\n#     shear=0)\n\n# # Plot results\n# for r in results:\n#     # Plot method returns a BGR numpy array\n#     im_array = r.plot()  \n#     # Convert to RGB for display\n#     im_rgb = cv2.cvtColor(im_array, cv2.COLOR_BGR2RGB)\n    \n#     plt.figure(figsize=(10, 10))\n#     plt.imshow(im_rgb)\n#     plt.axis('off')\n#     plt.show()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-02-11T05:42:46.779444Z","iopub.execute_input":"2026-02-11T05:42:46.779772Z","iopub.status.idle":"2026-02-11T05:43:00.218668Z","shell.execute_reply.started":"2026-02-11T05:42:46.779735Z","shell.execute_reply":"2026-02-11T05:43:00.217844Z"}},"outputs":[],"execution_count":null}]}