Spaces:
Sleeping
Sleeping
| title: Mammogram Analyzer | |
| emoji: π₯ | |
| colorFrom: pink | |
| colorTo: red | |
| sdk: docker | |
| app_port: 7860 | |
| # Mammogram Inference Service | |
| A FastAPI microservice that runs mammographic image analysis using the **SensiNet** dual-stream deep learning model. It accepts a public image URL or a direct file upload, runs Bayesian MC-Dropout inference, and returns a BI-RADS classification with confidence and malignancy probability scores. | |
| This service is the AI backend for the [Blossom](../README.md) clinical radiology platform. | |
| --- | |
| ## Authorship and Attribution | |
| ### This service (the wrapper) | |
| The FastAPI service, inference pipeline, training script, and Blossom integration code in this repository were written by the **Blossom team**. They are original works that integrate the SensiNet model. | |
| ### The AI model (SensiNet) | |
| The neural network architecture (`app/architecture.py`) and pretrained weights (`weights/advanced_model_best.pth`) are the work of **Aredeksu** and the SensiNet-Mammography project. | |
| > **Original model:** [Aredeksu/SensiNet-Mammography](https://huggingface.co/Aredeksu/SensiNet-Mammography) on Hugging Face | |
| > **License:** Apache License 2.0 | |
| > **Trained on:** CBIS-DDSM mammography dataset | |
| We are **integrators and licensees** of this model β not its authors or joint authors. Full credit for the model architecture, training methodology, and pretrained weights belongs to the original authors. | |
| In compliance with the Apache 2.0 license: | |
| - The original architecture is reproduced with attribution in `app/architecture.py` | |
| - Modifications made by us: added the FastAPI wrapper, Bayesian MC-Dropout inference loop, BI-RADS mapping logic, and the training script for fine-tuning | |
| - A copy of the Apache 2.0 license is included in `LICENSE` | |
| ### Training data | |
| The model was trained on the **CBIS-DDSM** (Curated Breast Imaging Subset of DDSM) dataset, a publicly available mammography benchmark dataset from The Cancer Imaging Archive (TCIA). | |
| > Lee RS, Gimenez F, Hoogi A, Miyake KK, Gorovoy M, Rubin DL. (2017). *A curated mammography data set for use in computer-aided detection and diagnosis research.* Scientific Data, 4, 170177. https://doi.org/10.1038/sdata.2017.177 | |
| --- | |
| ## Architecture (SensiNet) | |
| ``` | |
| Input Image (299Γ299 RGB) | |
| | | |
| ββββββ΄βββββ | |
| βΌ βΌ | |
| Xception EfficientNet-B3 | |
| (2048ch) (1536ch) | |
| β β | |
| βΌ βΌ | |
| Projβ512 Projβ512 | |
| ββββββ¬βββββ | |
| βΌ | |
| Concat (1024ch) | |
| βΌ | |
| CBAM Attention | |
| (channel + spatial) | |
| βΌ | |
| GlobalAvgPool β Linear(1024β512) β BN β ReLU β Dropout(0.5) β Linear(512β1) | |
| βΌ | |
| Sigmoid β malignancy probability β BI-RADS 1β5 | |
| ``` | |
| Inference uses **Bayesian MC-Dropout** (10 stochastic forward passes) to estimate both the mean malignancy probability and prediction variance, which informs the confidence score. | |
| --- | |
| ## Endpoints | |
| | Method | Path | Description | | |
| |--------|------|-------------| | |
| | `GET` | `/health` | Service health check, model mode, version | | |
| | `POST` | `/predict` | Multipart image upload β inference | | |
| | `POST` | `/analyze` | JSON `{ image_url }` β download β inference | | |
| ### `/analyze` request | |
| ```json | |
| { "image_url": "https://your-storage.supabase.co/storage/v1/object/public/mammograms/..." } | |
| ``` | |
| ### Response shape | |
| ```json | |
| { | |
| "birads": 3, | |
| "confidence": 0.82, | |
| "malignancy_probability": 0.31, | |
| "findings_text": "Model prediction: Benign (probability 31.0%). Probably benign appearance. Short-interval follow-up may be considered.", | |
| "model_version": "sensinet-v1" | |
| } | |
| ``` | |
| BI-RADS mapping: | |
| | Probability | BI-RADS | Interpretation | | |
| |-------------|---------|---------------| | |
| | < 10% | 1 | Negative | | |
| | 10β24% | 2 | Benign | | |
| | 25β49% | 3 | Probably benign | | |
| | 50β74% | 4 | Suspicious | | |
| | β₯ 75% | 5 | Highly suggestive of malignancy | | |
| --- | |
| ## Setup | |
| ```bash | |
| cd mammogram-inference-service | |
| python3 -m venv .venv | |
| source .venv/bin/activate | |
| pip install --upgrade pip | |
| pip install -r requirements.txt | |
| ``` | |
| ### Model weights | |
| Download the pretrained weights from [Aredeksu/SensiNet-Mammography](https://huggingface.co/Aredeksu/SensiNet-Mammography) on Hugging Face and place the file at: | |
| ``` | |
| weights/advanced_model_best.pth | |
| ``` | |
| If the weights file is absent, the service automatically falls back to **mock mode** β a deterministic pixel-statistics-based predictor that returns consistent (but not clinically meaningful) results. Useful for UI development without a GPU. | |
| ### Environment variables | |
| | Variable | Default | Description | | |
| |----------|---------|-------------| | |
| | `MODEL_MODE` | `real` | Set to `mock` to force mock mode | | |
| | `MODEL_VERSION` | `sensinet-v1` | Version string returned in responses | | |
| | `MODEL_WEIGHTS` | `weights/advanced_model_best.pth` | Path to weights file | | |
| | `ALLOWED_IMAGE_HOSTS` | _(empty = allow all HTTPS)_ | Comma-separated allowlist of image hostnames (SSRF protection) | | |
| --- | |
| ## Run | |
| ```bash | |
| uvicorn app.main:app --reload --host 0.0.0.0 --port 8000 | |
| ``` | |
| - Swagger UI: http://localhost:8000/docs | |
| - Health check: http://localhost:8000/health | |
| In your Blossom `.env.local`: | |
| ```env | |
| GCLOUD_MODEL_ENDPOINT=http://localhost:8000 | |
| ``` | |
| --- | |
| ## Training your own weights | |
| If you have a local copy of the CBIS-DDSM dataset, you can fine-tune the model: | |
| ```bash | |
| # Step 1: organise images into train/val folders | |
| python prepare_data.py \ | |
| --images /path/to/raw/images \ | |
| --csv /path/to/labels.csv \ | |
| --output data | |
| # Step 2: train (two-phase: frozen backbones β full fine-tune) | |
| python train.py --data data --output weights/advanced_model_best.pth | |
| ``` | |
| The training script uses the same `AdvancedBreastCancerModel` architecture as the original SensiNet. Phase 1 trains only the projection layers and classifier head with frozen backbones (20 epochs). Phase 2 fine-tunes all layers at a lower learning rate (50 epochs). Best checkpoint is saved automatically. | |
| --- | |
| ## Important notice | |
| This service is intended for **research and development use only**. It has not been validated for clinical decision-making. Outputs must not be used to diagnose, treat, or manage patients without appropriate clinical oversight and regulatory approval. The BI-RADS scores produced are AI-generated estimates and do not replace radiologist interpretation. | |
| --- | |
| ## License | |
| The **wrapper code** in this repository (FastAPI service, training scripts, integration layer) is original work by the Blossom team. | |
| The **SensiNet model architecture and weights** are used under the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). Copyright belongs to the original authors at [Aredeksu/SensiNet-Mammography](https://huggingface.co/Aredeksu/SensiNet-Mammography). | |