|
|
--- |
|
|
license: cc-by-nc-sa-4.0 |
|
|
language: |
|
|
- en |
|
|
library_name: sam2 |
|
|
pipeline_tag: image-segmentation |
|
|
tags: |
|
|
- whole-slide-imaging |
|
|
- histopathology |
|
|
- tissue-segmentation |
|
|
- sam2 |
|
|
--- |
|
|
|
|
|
# AtlasPatch: Whole-Slide Image Tissue Segmentation |
|
|
|
|
|
Segmentation model for whole-slide image (WSI) thumbnails, built on **Segment Anything 2 (SAM2) Tiny** and finetuned only on the normalization layers. The model takes a **power-based WSI thumbnail at 1.25x magnification level (resized to 1024×1024)** and predicts a binary tissue mask. Training used segmented thumbnails. AtlasPatch codebase (WSI preprocessing & tooling): https://github.com/AtlasAnalyticsLab/AtlasPatch |
|
|
|
|
|
## Quickstart |
|
|
|
|
|
Install dependencies: |
|
|
|
|
|
```bash |
|
|
pip install atlas-patch |
|
|
``` |
|
|
|
|
|
Recommended: use the same components we ship in AtlasPatch. The segmentation service will (a) load your WSI with the registered backend, (b) build a 1.25× power thumbnail, (c) resize it to 1024×1024, (d) run SAM2 with a full-frame box, and (e) return a mask aligned to the thumbnail. |
|
|
|
|
|
```python |
|
|
import numpy as np |
|
|
import torch |
|
|
from pathlib import Path |
|
|
from PIL import Image |
|
|
from importlib.resources import files |
|
|
|
|
|
from atlas_patch.core.config import SegmentationConfig |
|
|
from atlas_patch.services.segmentation import SAM2SegmentationService |
|
|
from atlas_patch.core.wsi import WSIFactory |
|
|
|
|
|
device = torch.device("cuda" if torch.cuda.is_available() else "cpu") |
|
|
|
|
|
# 1) Config: packaged SAM2 Hiera-T config; leave checkpoint_path=None to auto-download from HF. |
|
|
cfg_path = Path(files("atlas_patch.configs") / "sam2.1_hiera_t.yaml") |
|
|
seg_cfg = SegmentationConfig( |
|
|
checkpoint_path=None, # downloads Atlas-Patch/model.pth from Hugging Face |
|
|
config_path=cfg_path, |
|
|
device=str(device), |
|
|
batch_size=1, |
|
|
thumbnail_power=1.25, |
|
|
thumbnail_max=1024, |
|
|
mask_threshold=0.0, |
|
|
) |
|
|
segmenter = SAM2SegmentationService(seg_cfg) |
|
|
|
|
|
# 2) Load a WSI and segment the thumbnail. |
|
|
wsi = WSIFactory.load("slide.svs") # backend auto-detected (e.g., openslide) |
|
|
mask = segmenter.segment_thumbnail(wsi) # mask.data matches the thumbnail size |
|
|
|
|
|
# 3) Save the mask. |
|
|
mask_img = Image.fromarray((mask.data > 0).astype(np.uint8) * 255) |
|
|
mask_img.save("thumbnail_mask.png") |
|
|
``` |
|
|
|
|
|
## Preparing the Thumbnail |
|
|
|
|
|
AtlasPatch generates thumbnails at **1.25× objective power** (power-based downsampling) and then clamps the longest side to **1024 px**. Using the same helper the library uses: |
|
|
|
|
|
```python |
|
|
from atlas_patch.core.wsi import WSIFactory |
|
|
|
|
|
wsi = WSIFactory.load("slide.svs") |
|
|
thumb = wsi.get_thumbnail_at_power(power=1.25, interpolation="optimise") |
|
|
thumb.thumbnail((1024, 1024)) # in-place resize to 1024×1024 |
|
|
thumb.save("thumbnail.png") |
|
|
``` |
|
|
|
|
|
## License and Commercial Use |
|
|
|
|
|
This model is released under **CC-BY-NC-SA-4.0**, which strictly disallows commercial use of the model weights or any derivative works. Commercialization includes selling the model, offering it as a paid service, using it inside commercial products, or distributing modified versions for commercial gain. Non-commercial research, experimentation, educational use, and use by academic or non-profit organizations is permitted under the license terms. If you need commercial rights, please contact the authors to obtain a separate commercial license. See the LICENSE file in this repository for full terms. |
|
|
|
|
|
## Citation |
|
|
|
|
|
If you use this model, please cite SAM2 and the AtlasPatch project. A formal paper is forthcoming. |
|
|
|