Back to work
Computer vision · Remote sensing · 2026

Satellite image classification

A convolutional neural network that sorts EuroSAT satellite tiles into ten land-use classes — annual crop, forest, river, residential, and more. Built from scratch in PyTorch, evaluated with per-class metrics, and wrapped in an interactive web app that predicts on any image you drop in.

Type Applied deep learning
Role Data pipeline · Model · Evaluation · App
Stack PyTorch · scikit-learn · pandas · Shiny for Python
Result 96% test accuracy · 10 classes

Brief

The dataset is EuroSAT — 10,000 RGB tiles, 64×64 pixels, captured by the Sentinel-2 mission and labelled across ten land-use and land-cover classes: AnnualCrop, Forest, HerbaceousVegetation, Highway, Industrial, Pasture, PermanentCrop, Residential, River, and SeaLake. The task was a full classification pipeline built end to end without pretrained weights: ingest and split the imagery, design and train a convolutional network, evaluate it honestly per class, and ship a usable interface on top of the model.

Approach

Labels are derived directly from the folder structure so the class index can never drift between training and inference — one source of truth shared by the notebook and the app. The data is split into train, validation, and test sets, with the validation transform reused exactly at prediction time so a tile is normalized the same way everywhere it appears.

The model is a custom CNN — four convolutional blocks of increasing width, each pairing convolution with batch normalization and pooling, feeding a small classifier head. It is trained from scratch with cross-entropy and tracked on the validation set every epoch to catch overfitting early. No transfer learning: the network learns EuroSAT's textures and spectral cues on its own.

On top of the trained model sits an interactive Shiny for Python app. Upload a satellite tile and it loads the saved weights, applies the identical validation transform, and returns the predicted class with its confidence — the same pipeline that produced the test metrics, now exposed as a tool.

Outcome

The network reaches 96% accuracy on the held-out test set. A confusion matrix and per-class breakdown show where the remaining errors concentrate — visually adjacent classes such as Highway against Industrial, or PermanentCrop against AnnualCrop — rather than spreading evenly, which points to exactly where more data or finer features would pay off.

The pipeline is reproducible from raw folders to a single source of predictions: deterministic split, one shared transform, saved weights, and a live app any non-technical user can run. Originally the final project for JKU's Programming in Python II course, built without pretrained models or AI-written code.

Notebook and metrics available on request.

The training notebook, confusion matrix, per-class report, and the Shiny app can be shared for review.

Next project SilkOffRoad AI Agent