Spaces:
Sleeping
Sleeping
| # ============================================================ | |
| # CELL 1 β Install & verify GPU | |
| # ============================================================ | |
| import torch | |
| print(f"PyTorch : {torch.__version__}") | |
| print(f"CUDA : {torch.cuda.is_available()}") | |
| print(f"GPU : {torch.cuda.get_device_name(0)}") | |
| print(f"VRAM : {torch.cuda.get_device_properties(0).total_memory / 1e9:.1f} GB") | |
| # ============================================================ | |
| # CELL 2 β Fix data.yaml paths for Kaggle β FIXED | |
| # ============================================================ | |
| import os | |
| import yaml | |
| # β Your exact dataset path (from your screenshot) | |
| DATASET_DIR = "merged_dataset" | |
| DATA_YAML = os.path.join(DATASET_DIR, "data.yaml") | |
| print("Verifying dataset structure:") | |
| for item in os.listdir(DATASET_DIR): | |
| full_path = os.path.join(DATASET_DIR, item) | |
| if os.path.isdir(full_path): | |
| print(f" [folder] {full_path}") | |
| else: | |
| print(f" [file] {full_path}") | |
| # ββ Read existing yaml ββββββββββββββββββββββββββββββββββββββββ | |
| with open(DATA_YAML, "r") as f: | |
| cfg = yaml.safe_load(f) | |
| print(f"\nOriginal yaml paths:") | |
| print(f" train : {cfg.get('train')}") | |
| print(f" val : {cfg.get('val')}") | |
| print(f" test : {cfg.get('test')}") | |
| # ββ Fix paths to absolute Kaggle paths βββββββββββββββββββββββ | |
| # Kaggle cannot resolve relative paths like ../train/images | |
| cfg["train"] = f"{DATASET_DIR}/train/images" | |
| cfg["val"] = f"{DATASET_DIR}/valid/images" | |
| cfg["test"] = f"{DATASET_DIR}/test/images" | |
| # ββ Save fixed yaml to /kaggle/working (writable folder) βββββ | |
| FIXED_YAML = "/kaggle/working/data_fixed.yaml" | |
| with open(FIXED_YAML, "w") as f: | |
| yaml.dump(cfg, f, default_flow_style=False) | |
| print(f"\nFixed yaml saved to: {FIXED_YAML}") | |
| print(f" train : {cfg['train']}") | |
| print(f" val : {cfg['val']}") | |
| print(f" test : {cfg['test']}") | |
| print(f" nc : {cfg.get('nc')}") | |
| print(f" names : {cfg.get('names')}") | |
| # ββ Verify image folders actually exist ββββββββββββββββββββββ | |
| for split, path in [("train", cfg["train"]), ("val", cfg["val"]), ("test", cfg["test"])]: | |
| exists = os.path.isdir(path) | |
| count = len(os.listdir(path)) if exists else 0 | |
| print(f" {split:5s} images: {'OK' if exists else 'MISSING'} ({count} files)") | |
| # ============================================================ | |
| # CELL 3 β Train on GPU | |
| # ============================================================ | |
| from ultralytics import YOLO | |
| from pathlib import Path | |
| # β Use the fixed yaml (absolute paths) | |
| DATA_YAML_FIXED = "data.yaml" | |
| OUTPUT_DIR = "result_directorygit" | |
| # ββ Model ββββββββββββββββββββββββββββββββββββββββββββββββββββ | |
| # T4 has 15.6 GB VRAM β yolov8m is the best quality/speed balance | |
| MODEL_SIZE = "yolo26n.pt" | |
| model = YOLO(MODEL_SIZE) | |
| # ββ Hyperparameters β tuned for Kaggle T4 GPU ββββββββββββββββ | |
| results = model.train( | |
| # ββ Data ββββββββββββββββββββββββββββββββββββββββββββββββββ | |
| data = DATA_YAML_FIXED, | |
| imgsz = 640, # full 640 on GPU | |
| rect = False, | |
| # ββ Training schedule ββββββββββββββββββββββββββββββββββββββ | |
| epochs = 100, # ~15 min on T4 | |
| patience = 20, | |
| batch = 32, # T4 can handle batch=32 easily | |
| workers = 4, | |
| # ββ Optimizer βββββββββββββββββββββββββββββββββββββββββββββ | |
| optimizer = "AdamW", | |
| lr0 = 0.001, | |
| lrf = 0.01, | |
| momentum = 0.937, | |
| weight_decay= 0.0005, | |
| # ββ LR Warmup βββββββββββββββββββββββββββββββββββββββββββββ | |
| warmup_epochs = 3.0, | |
| warmup_momentum = 0.8, | |
| warmup_bias_lr = 0.1, | |
| # ββ Loss weights ββββββββββββββββββββββββββββββββββββββββββ | |
| box = 7.5, | |
| cls = 0.5, | |
| dfl = 1.5, | |
| # ββ Augmentation β full GPU augmentation ββββββββββββββββββ | |
| hsv_h = 0.015, | |
| hsv_s = 0.7, | |
| hsv_v = 0.4, | |
| degrees = 10.0, | |
| translate = 0.1, | |
| scale = 0.5, | |
| shear = 2.0, | |
| perspective = 0.0, | |
| flipud = 0.1, | |
| fliplr = 0.5, | |
| mosaic = 1.0, | |
| mixup = 0.15, | |
| copy_paste = 0.1, | |
| # ββ Output ββββββββββββββββββββββββββββββββββββββββββββββββ | |
| project = OUTPUT_DIR, | |
| name = "yolov8_microplastic", | |
| exist_ok = True, | |
| save = True, | |
| save_period = 20, | |
| plots = True, | |
| verbose = True, | |
| cache = True, # fast SSD on Kaggle β safe to cache | |
| # ββ Device ββββββββββββββββββββββββββββββββββββββββββββββββ | |
| device = 0, # GPU 0 (Tesla T4) | |
| amp = True, # Mixed precision β faster on GPU | |
| multi_scale = False, | |
| ) | |
| print("\nTraining complete!") | |
| # ============================================================ | |
| # CELL 4 β Evaluate on test set | |
| # ============================================================ | |
| best_weights = Path(OUTPUT_DIR) / "yolov8_microplastic" / "weights" / "best.pt" | |
| best_model = YOLO(str(best_weights)) | |
| test_metrics = best_model.val( | |
| data = DATA_YAML_FIXED, | |
| split = "test", | |
| imgsz = 640, | |
| batch = 32, | |
| conf = 0.25, | |
| iou = 0.6, | |
| device = 0, | |
| plots = True, | |
| save_json = True, | |
| ) | |
| print("\nββ TEST RESULTS ββββββββββββββββββββββββββββββ") | |
| print(f" mAP50 : {test_metrics.box.map50:.4f}") | |
| print(f" mAP50-95 : {test_metrics.box.map:.4f}") | |
| print(f" Precision : {test_metrics.box.mp:.4f}") | |
| print(f" Recall : {test_metrics.box.mr:.4f}") | |
| print("ββββββββββββββββββββββββββββββββββββββββββββββ") | |
| # ============================================================ | |
| # CELL 5 β List output files for download | |
| # ============================================================ | |
| print("\nFiles ready to download from Output panel:") | |
| for f in sorted(Path(OUTPUT_DIR).rglob("*")): | |
| if f.suffix in [".pt", ".yaml", ".png", ".csv", ".json"]: | |
| size_mb = f.stat().st_size / 1e6 | |
| print(f" {str(f).replace(OUTPUT_DIR, '')} ({size_mb:.1f} MB)") | |
| print("\nTo download best.pt:") | |
| print(" Output panel (right side) β yolov8_microplastic β weights β best.pt β Download") |