Views
No views yet
| Base Model | yolov8n-cls.pt (Ultralytics YOLOv8 Nano) |
| Task | Image Classification (3 classes) |
| Input Size | 64×64 pixels |
| Classes | empty, black, white |
| Framework | Ultralytics YOLOv8 |
| Training Device | Apple MPS (Metal Performance Shaders) |
| Optimizer | AdamW |
| Epochs | 30 (early stopped at 17) |
| Batch Size | 128 |
| Learning Rate | 0.001 (cosine schedule) |
| Metric | Value |
|---|---|
| Top-1 Accuracy | 100% |
| Top-5 Accuracy | 100% |
| Best Val Loss | 0.00011 (epoch 17) |
| Best Train Loss | 0.00204 (epoch 14) |
The model converges rapidly — reaching >99.9% accuracy by epoch 1 — because the 64×64 patch classification task is well-separated for these three classes.
.
├── weights/
│ ├── best.pt # Best checkpoint (val_loss=0.00011)
│ └── last.pt # Final epoch checkpoint
├── args.yaml # Training configuration
├── results.csv # Per-epoch metrics
├── results.png # Training curves
├── confusion_matrix.png # Confusion matrix
├── confusion_matrix_normalized.png
└── best.mlpackage/ # Core ML export for iOS
├── Manifest.json
└── Data/com.apple.CoreML/
├── model.mlmodel
└── weights/weight.bin1from ultralytics import YOLO
2
3model = YOLO("best.pt")
4results = model("path/to/go_board.jpg")best.mlpackage into your Xcode project. The model accepts a 64×64 RGB image and outputs class probabilities for empty/black/white.1import CoreML
2import Vision
3
4guard let model = try? VNCoreMLModel(for: go_stone_classifier().model) else { return }
5let request = VNCoreMLRequest(model: model) { request, error in
6 if let results = request.results as? [VNClassificationObservation] {
7 for result in results {
8 print("\(result.identifier): \(result.confidence)")
9 }
10 }
11}1@misc{yolo-go-stone-classifier,
2 author = {rociiu},
3 title = {YOLOv8n-cls Go Stone Classifier},
4 year = {2026},
5 publisher = {Hugging Face},
6 howpublished = {\url{https://huggingface.co/rociiu/yolo-go-stone-classifier}},
7}