EuroSAT Land Cover Classifier (ResNet50)
ResNet50 fine-tuned via transfer learning to classify Sentinel-2 satellite image patches into 10 land cover categories, using the EuroSAT dataset.
Model Details
- Base model: ResNet50, pretrained on ImageNet (
IMAGENET1K_V2 weights via torchvision)
- Training approach: final layer trained first (backbone frozen), then full fine-tuning at lower learning rate
- Input: 224x224 RGB images, normalized with ImageNet mean/std
- Output: 10-class softmax (see label map below)
Performance (EuroSAT official test split, 2,700 images)
- Overall test accuracy: 98%
- Weakest classes: PermanentCrop (F1 0.96), AnnualCrop (F1 0.96)
- Strongest classes: Residential, SeaLake (F1 1.00)
Label Map
{'AnnualCrop': 0, 'Forest': 1, 'HerbaceousVegetation': 2, 'Highway': 3, 'Industrial': 4,
'Pasture': 5, 'PermanentCrop': 6, 'Residential': 7, 'River': 8, 'SeaLake': 9}
How to Load
```python
import torch
import torchvision.models as models
import torch.nn as nn
model = models.resnet50(weights='IMAGENET1K_V2')
model.fc = nn.Linear(model.fc.in_features, 10)
model.load_state_dict(torch.load('eurosat_resnet50.pt', map_location='cpu'))
model.eval()
```
ScreenShot

Limitations
- Trained on European Sentinel-2 imagery; accuracy may degrade on other regions/sensors.
- 64x64 patch size limits detection of small-scale land features.
- RGB-only (no multispectral bands), which loses some vegetation-discriminating signal.
- Confusion observed between agricultural sub-classes (AnnualCrop/PermanentCrop/Pasture) and an unexpected River-to-AnnualCrop misclassification pattern (see confusion matrix).