File size: 1,589 Bytes
7dafc62 4916c91 7dafc62 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 | ---
license: other
tags:
- image-segmentation
- satellite-imagery
- cloud-detection
- cubesat
- beavercube
---
# BeaverCube Cloud Segmentation — SmallCloudNet
U-Net trained to detect clouds in imagery simulated from the Matrix Vision mvBlueFOX-IGC-200w camera
on the BeaverCube 2 CubeSat (MIT), using the CloudSEN12-L1C Sentinel-2 dataset.
## Model details
| Property | Value |
|---|---|
| Architecture | U-Net (SmallCloudNet) |
| Parameters | 1.86M |
| Input size (training) | 33×33 px |
| Input size (inference) | any (fully convolutional) |
| Classes | clear, thick cloud, thin cloud, shadow |
## Performance
| Metric | Value |
|---|---|
| Mean IoU | 0.38 |
| Mean F1 | 0.54 |
| Accuracy | 64% |
| Clear IoU | 0.58 |
| Thick cloud IoU | 0.45 |
| Shadow IoU | 0.27 |
| Thin cloud IoU | 0.22 |
## Usage
```python
import torch
from model import SmallCloudNet
model = SmallCloudNet(in_ch=3, num_classes=4)
checkpoint = torch.load("best_model.pth", map_location="cpu")
model.load_state_dict(checkpoint["model_state_dict"])
model.eval()
# img: float32 tensor (1, 3, H, W) normalised to [0, 1]
with torch.no_grad():
logits = model(img) # (1, 4, H, W)
mask = logits.argmax(dim=1) # (1, H, W)
```
## Training data
CloudSEN12-L1C (Sentinel-2 L1C), preprocessed to simulate BlueFOX GSD (153.75 m) via:
1. Gaussian PSF blur (σ = 1.6 px, derived from Kowa 16mm lens Airy disk)
2. 15.65× INTER_AREA downsample (512×512 → 33×33)
3. Read + shot noise augmentation applied each epoch
|