Spaces:
Running
Running
| from ultralytics import YOLO | |
| import os | |
| import torch | |
| # 1. Load the base YOLOv8 Medium model (better capacity for feature learning) | |
| model = YOLO('yolov8m.pt') | |
| # 2. IMPORTANT: Path to the 'data.yaml' file inside the unzipped dataset. | |
| dataset_yaml_path = r'c:\Users\fadhi\StudioProjects\pestDetection\datasets\cereal_pests\data.yaml' | |
| def start_training(): | |
| if not os.path.exists(dataset_yaml_path): | |
| print(f"Error: Could not find data.yaml at {dataset_yaml_path}") | |
| print("Please edit train_model.py and put the correct path to your unzipped dataset.") | |
| return | |
| print("--- Starting AI Training for Cereal Pests ---") | |
| # Automatically detect if NVIDIA GPU (CUDA) is available for 10x-50x faster training | |
| device = 0 if torch.cuda.is_available() else 'cpu' | |
| print(f"Using device: {device} ({'GPU' if device == 0 else 'CPU'})") | |
| # Train the model | |
| # epochs=50: The AI will study the images 50 times. | |
| # imgsz=640: Standard resolution for YOLOv8. | |
| results = model.train( | |
| data=dataset_yaml_path, | |
| epochs=50, | |
| imgsz=640, | |
| device=device, | |
| batch=16, # Stable batch size (reduce to 8 or 4 if GPU runs out of memory) | |
| freeze=10, # Freeze backbone layers to prevent overfitting on small datasets | |
| weight_decay=0.005, # Weight decay (L2 regularization) to improve generalization | |
| close_mosaic=10 # Turn off mosaic augmentation for the last 10 epochs for stable bounding boxes | |
| ) | |
| print("\nSUCCESS!") | |
| print("Your custom pest detection model has been created.") | |
| # Auto-copy the trained model to the backend folder to prevent manual errors/confusion | |
| try: | |
| import shutil | |
| from pathlib import Path | |
| save_dir = Path(results.save_dir) | |
| best_model_path = save_dir / "weights" / "best.pt" | |
| backend_dir = Path(__file__).resolve().parent / "backend" | |
| backend_model_path = backend_dir / "best_cereal.pt" | |
| if best_model_path.exists(): | |
| backend_dir.mkdir(parents=True, exist_ok=True) | |
| shutil.copy2(best_model_path, backend_model_path) | |
| print(f"\n[AUTO-COPY] Successfully copied {best_model_path} to {backend_model_path}") | |
| else: | |
| print(f"\nWarning: Could not locate best.pt at {best_model_path}") | |
| except Exception as e: | |
| print(f"\nWarning: Failed to auto-copy trained model to backend: {e}") | |
| print("Please copy the best.pt file manually as best_cereal.pt in the backend/ folder.") | |
| print("\nNext step: Start your backend server and run the mobile app.") | |
| if __name__ == '__main__': | |
| start_training() | |