NeuralSignal is a full-stack project for radio signal quality assessment using deep learning. It includes:
- A FastAPI backend for model inference, IQ-to-spectrogram conversion, synthetic IQ generation, and Grad-CAM visualization.
- A React + Vite frontend for uploading IQ/image inputs and viewing predictions interactively.
The quality classes are:
PoorAverageGood
DL_CNN/
|- app/
| |- backend/
| | |- main.py
| | |- model_utils.py
| | |- requirements.txt
| | `- *.pth (fallback model checkpoints)
| `- frontend/
| |- src/
| |- package.json
| `- vite.config.ts
|- search_results/
| `- best_checkpoints/ (preferred model checkpoints)
`- README.md
- Predict quality from IQ samples (
/predict/iq) - Predict quality from spectrogram images (
/predict/image) - Convert IQ to spectrogram PNG (
/convert/iq) - Generate random quality-controlled IQ + spectrogram (
/generate/random-spectrogram) - Produce Grad-CAM heatmaps from IQ input (
/gradcam/iq)
cd app/backend
python -m venv .venv
.\.venv\Scripts\Activate.ps1
pip install -r requirements.txtuvicorn main:app --reload --host 0.0.0.0 --port 8000Backend runs at http://localhost:8000.
For each model, backend first tries:
search_results/best_checkpoints/<preferred_file>.pth
If not found, it falls back to:
app/backend/<fallback_file>.pth
Supported model names:
BaselineCNNResNet18EfficientNet-B0
cd app/frontend
npm installnpm run devFrontend runs at Vite default URL (usually http://localhost:5173).
The UI calls backend using API_BASE = "http://localhost:8000" in app/frontend/src/App.tsx.
IQ data must be equivalent to shape (1024, 2):
- 1024 rows
- Each row is
[I, Q]
Accepted input styles:
- JSON array (
[[i0, q0], [i1, q1], ...]) - CSV/space-separated numeric values
- Flat input with exactly
2048scalar values (reshaped internally to1024x2)
GET /- Health check and loaded model info.
POST /predict/iq- Multipart form:
file+ optionalmodel_name.
- Multipart form:
POST /predict/image- Multipart form: grayscale/normal image + optional
model_name.
- Multipart form: grayscale/normal image + optional
POST /convert/iq- Multipart form IQ file; returns
image/png.
- Multipart form IQ file; returns
GET /generate/random-spectrogram- Query params:
quality,model_name,enforce_prediction,max_attempts,seed.
- Query params:
POST /gradcam/iq- Multipart form IQ file + optional
model_name; returns spectrogram/cam/overlay images as base64 data URLs.
- Multipart form IQ file + optional
curl -X POST "http://localhost:8000/predict/iq" \
-F "model_name=ResNet18" \
-F "file=@sample_iq.json"curl -X POST "http://localhost:8000/convert/iq" \
-F "file=@sample_iq.json" \
--output spectrogram.pngapp/backend/venvandapp/frontend/node_modulesare local environments and should not be committed.- Large model/data artifacts (
.pth,.hdf5) are typically local-only unless you intentionally version them.