diff --git a/CLAUDE.md b/CLAUDE.md new file mode 100644 index 0000000..59f8446 --- /dev/null +++ b/CLAUDE.md @@ -0,0 +1,36 @@ +# CLAUDE.md + +## Project + +Accidental classifier — a small CNN that identifies sharp, flat, and natural symbols in cropped images of engraved music scores. Part of a larger OMR (optical music recognition) pipeline. + +## Key facts + +- **Model**: 3-block CNN (16→32→64 channels), ~115k params, 1×40×40 grayscale input, 3-class output +- **Dataset**: Crops extracted from PrIMuS via Verovio rendering. ~5k per class after subsampling. +- **Performance**: 100% on held-out test set (750 samples). The three classes are visually distinct enough that this is a solved problem. +- **Seed**: 42. All splits use this seed for reproducibility. +- **Split ratios**: 5% test, 10% val, rest train (stratified) +- **Labels**: `["flat", "natural", "sharp"]` — alphabetical order, indices 0/1/2 + +## Layout + +- `train.py` — training pipeline, defines `AccidentalCNN` and all data loading +- `eval.py` — evaluates saved checkpoint on the test split (imports from train.py) +- `extract_accidentals.py` — multi-font crop extraction from PrIMuS MEI files +- `extract_fast.py` — faster single-font variant +- `explore_dataset.py` — dataset statistics +- `segment_test.py` — connected-component segmentation experiment +- `model/accidental_classifier.pt` — saved weights +- `crops/{flat,natural,sharp}/` — extracted crops (gitignored) +- `dataset/` — raw PrIMuS data (gitignored) + +## Conventions + +- All Python scripts use `sys.stdout.reconfigure(encoding="utf-8")` for Windows compatibility +- Hardcoded paths under `C:\src\accidentals\` — this is a local workstation project +- No requirements.txt; deps are PyTorch, torchvision, NumPy, Pillow, OpenCV, and optionally Verovio + cairosvg for extraction + +## Remote + +- Gitea at `git.xml-pipeline.org/dullfig/accidentals`, branch `main`