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