braillevision / scripts /train_yolo.py
Krishna Venkatesh
fix: clean all non-ASCII chars, fix CI (lint + tests), secure API keys
c81c805
Raw
History Blame Contribute Delete
2.61 kB
#!/usr/bin/env python3
"""Train YOLOv8 model on Braille detection dataset."""
from pathlib import Path
import torch
from ultralytics import YOLO
def check_gpu():
"""Check GPU availability."""
if torch.cuda.is_available():
print(f"[OK] GPU available (CUDA): {torch.cuda.get_device_name(0)}")
return "0" # CUDA device 0
elif torch.backends.mps.is_available():
print("[OK] GPU available (Apple Metal - MPS)")
# MPS not directly supported by ultralytics, use CPU fallback
# or use mps string if supported
return "cpu" # Fallback to CPU for compatibility
else:
print("[WARN] No GPU detected, using CPU")
return "cpu"
def train_yolo():
"""Train YOLOv8 model."""
dataset_yaml = "data/yolo_training/dataset.yaml"
models_dir = Path("models")
models_dir.mkdir(exist_ok=True)
# Check if dataset exists
if not Path(dataset_yaml).exists():
print(f"[ERROR] Dataset config not found: {dataset_yaml}")
print("Run: python scripts/convert_to_yolo.py")
return
print("[START] Starting YOLOv8 training...\n")
print(f"Dataset: {dataset_yaml}")
print("Output: models/braille_finetuned.pt\n")
device = check_gpu()
# Load base model (nano = fastest)
print("\nLoading YOLOv8n base model...")
model = YOLO("yolov8n.pt")
# Training parameters
epochs = 50
imgsz = 640
# Batch size - smaller for local training
batch_size = 16 if device == "cpu" else 32
print("\nTraining configuration:")
print(" Model: YOLOv8n (nano)")
print(f" Epochs: {epochs}")
print(f" Image size: {imgsz}")
print(f" Batch size: {batch_size}")
print(f" Device: {device}")
print(" Classes: 1 (Braille dot)")
# Train
results = model.train(
data=dataset_yaml,
epochs=epochs,
imgsz=imgsz,
batch=batch_size,
device=device,
patience=10, # Early stopping after 10 epochs without improvement
project="models",
name="braille_training",
exist_ok=True,
save=True,
verbose=True,
)
# Copy best weights to standard location
best_model = Path("models/braille_training/weights/best.pt")
if best_model.exists():
import shutil
shutil.copy(best_model, models_dir / "braille_finetuned.pt")
print("\n[OK] Model saved to: models/braille_finetuned.pt")
print(f" Metrics: {results.box.map}")
else:
print(f"\n[WARN] Best model not found at {best_model}")
if __name__ == "__main__":
train_yolo()