Instructions to use ryroeu/satnogs-signal-classifier with libraries, inference providers, notebooks, and local apps. Follow these links to get started.
- Libraries
- Transformers
How to use ryroeu/satnogs-signal-classifier with Transformers:
# Use a pipeline as a high-level helper from transformers import pipeline pipe = pipeline("image-classification", model="ryroeu/satnogs-signal-classifier") pipe("https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/hub/parrots.png")# Load model directly from transformers import AutoImageProcessor, AutoModelForImageClassification processor = AutoImageProcessor.from_pretrained("ryroeu/satnogs-signal-classifier") model = AutoModelForImageClassification.from_pretrained("ryroeu/satnogs-signal-classifier") - Notebooks
- Google Colab
- Kaggle
| license: mit | |
| library_name: transformers | |
| pipeline_tag: image-classification | |
| tags: | |
| - satnogs | |
| - radio | |
| - signal-detection | |
| - waterfall | |
| datasets: | |
| - ryroeu/satnogs-signal-waterfalls | |
| # satnogs-signal-classifier | |
| ResNet-18 fine-tuned to classify SatNOGS **waterfall** spectrograms as **signal vs no-signal** | |
| (narrowband FSK/GFSK cubesat telemetry). A read-only **triage aid** — it suggests, it does not auto-vet. | |
| Inputs are **cropped to the spectrogram region** (colorbar + axes removed), which re-centers the signal. | |
| ## Held-out test metrics | |
| Held-out test set (436 observations) combining two axes held out of training: an **entirely unseen | |
| satellite** (FrontierSat) plus **held-out ground stations** whose noise/RFI fingerprint is kept out | |
| of training: | |
| | Metric | Model | Classical baseline | | |
| |---|---|---| | |
| | ROC-AUC | **0.827** | 0.570 | | |
| | PR-AUC | 0.829 | 0.557 | | |
| | precision@10 | **1.000** | 0.600 | | |
| Cross-satellite generalization (held-out **FrontierSat**, 240 obs, never trained on): ROC-AUC **0.772**. | |
| By mode: GFSK 0.93, FSK 0.92, FSK AX.100 Mode 5 0.79. | |
| ## Labels | |
| `0 = without-signal`, `1 = with-signal`; predict P(with-signal) = softmax index 1. | |
| Trained on **gold human `waterfall_status` vettings** — never the decode-based observation `status`. | |
| ## Training data | |
| Dataset: [ryroeu/satnogs-signal-waterfalls](https://huggingface.co/datasets/ryroeu/satnogs-signal-waterfalls) | |
| — 4 train satellites (OTP-2, CUBEBEL-2, AEPEX, CatSat), held-out satellite FrontierSat; ~1,189 gold | |
| waterfalls, cropped to the spectrogram. | |
| ## Limits & caveats | |
| - **Sampling bias:** gold labels skew toward clearer passes than the unvetted firehose; real-world | |
| performance on marginal/faint observations will be lower than these numbers. | |
| - **Test-set holdout is two-axis, not intersectional:** the unseen-satellite slice is held out by | |
| satellite, so some of its passes come from stations that also appear in training — that slice | |
| measures cross-satellite generalization, not fully station-unseen performance. | |
| - **Narrow family:** trained on narrowband FSK/GFSK telemetry; generalization beyond it is unverified. | |
| - **Read-only triage aid**, not an auto-vetter. precision@10 = 1.0 means the *top of the ranked queue* is reliable. | |
| ## Usage | |
| ```python | |
| from transformers import pipeline | |
| clf = pipeline("image-classification", model="ryroeu/satnogs-signal-classifier") | |
| clf("waterfall.png") | |
| ``` | |